autoc 1.2 → 1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGES +4 -0
 - data/README +3 -1
 - data/doc/AutoC.html +23 -7
 - data/doc/AutoC/Code.html +3 -3
 - data/doc/AutoC/Collection.html +289 -76
 - data/doc/AutoC/HashMap.html +44 -46
 - data/doc/AutoC/HashSet.html +20 -17
 - data/doc/AutoC/List.html +56 -92
 - data/doc/AutoC/Module.html +2 -2
 - data/doc/AutoC/Module/File.html +2 -2
 - data/doc/AutoC/Module/Header.html +6 -4
 - data/doc/AutoC/Module/Source.html +26 -26
 - data/doc/AutoC/Priority.html +2 -2
 - data/doc/AutoC/Queue.html +30 -92
 - data/doc/AutoC/Reference.html +217 -61
 - data/doc/AutoC/String.html +1393 -0
 - data/doc/AutoC/Type.html +240 -128
 - data/doc/AutoC/UserDefinedType.html +688 -47
 - data/doc/AutoC/Vector.html +154 -62
 - data/doc/_index.html +9 -2
 - data/doc/class_list.html +1 -1
 - data/doc/file.CHANGES.html +10 -2
 - data/doc/file.README.html +5 -3
 - data/doc/index.html +5 -3
 - data/doc/method_list.html +235 -97
 - data/doc/top-level-namespace.html +2 -2
 - data/lib/autoc.rb +3 -1
 - data/lib/autoc/code.rb +3 -2
 - data/lib/autoc/collection.rb +36 -40
 - data/lib/autoc/collection/hash_map.rb +10 -14
 - data/lib/autoc/collection/hash_set.rb +12 -11
 - data/lib/autoc/collection/list.rb +21 -11
 - data/lib/autoc/collection/queue.rb +5 -8
 - data/lib/autoc/collection/vector.rb +28 -12
 - data/lib/autoc/string.rb +492 -0
 - data/lib/autoc/type.rb +155 -66
 - data/test/test.rb +157 -35
 - data/test/test_char_string.rb +270 -0
 - data/test/test_int_list.rb +35 -0
 - data/test/test_int_vector.rb +34 -0
 - data/test/test_value_hash_map.rb +162 -0
 - data/test/test_value_hash_set.rb +173 -0
 - data/test/test_value_list.rb +193 -0
 - data/test/test_value_queue.rb +275 -0
 - data/test/test_value_vector.rb +155 -0
 - data/test/value.rb +80 -0
 - metadata +15 -8
 - data/test/test.c +0 -1041
 - data/test/test.h +0 -41
 - data/test/test_auto.c +0 -3407
 - data/test/test_auto.h +0 -765
 
| 
         @@ -103,9 +103,9 @@ 
     | 
|
| 
       103 
103 
     | 
    
         
             
            </div>
         
     | 
| 
       104 
104 
     | 
    
         | 
| 
       105 
105 
     | 
    
         
             
                <div id="footer">
         
     | 
| 
       106 
     | 
    
         
            -
              Generated on  
     | 
| 
      
 106 
     | 
    
         
            +
              Generated on Thu Mar 17 13:32:50 2016 by
         
     | 
| 
       107 
107 
     | 
    
         
             
              <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
         
     | 
| 
       108 
     | 
    
         
            -
              0.8.7.6 (ruby-2. 
     | 
| 
      
 108 
     | 
    
         
            +
              0.8.7.6 (ruby-2.2.4).
         
     | 
| 
       109 
109 
     | 
    
         
             
            </div>
         
     | 
| 
       110 
110 
     | 
    
         | 
| 
       111 
111 
     | 
    
         
             
              </body>
         
     | 
    
        data/lib/autoc.rb
    CHANGED
    
    | 
         @@ -5,6 +5,7 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
            . {AutoC::Code} generic C multi-source module generator.
         
     | 
| 
       6 
6 
     | 
    
         
             
            . {AutoC::Collection} strongly-typed data structure generators similar
         
     | 
| 
       7 
7 
     | 
    
         
             
            to the C++ STL container classes.
         
     | 
| 
      
 8 
     | 
    
         
            +
            . {AutoC::String} wrapper around the standard C string with string building capability.
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
            == Versioning scheme
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
         @@ -21,12 +22,13 @@ Should the major incompatible changes be made, the new release 2.0 will be intro 
     | 
|
| 
       21 
22 
     | 
    
         | 
| 
       22 
23 
     | 
    
         
             
            =end
         
     | 
| 
       23 
24 
     | 
    
         
             
            module AutoC
         
     | 
| 
       24 
     | 
    
         
            -
              VERSION = "1. 
     | 
| 
      
 25 
     | 
    
         
            +
              VERSION = "1.3"
         
     | 
| 
       25 
26 
     | 
    
         
             
            end # AutoC
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         | 
| 
       28 
29 
     | 
    
         
             
            require "autoc/code"
         
     | 
| 
       29 
30 
     | 
    
         
             
            require "autoc/type"
         
     | 
| 
      
 31 
     | 
    
         
            +
            require "autoc/string"
         
     | 
| 
       30 
32 
     | 
    
         
             
            require "autoc/collection"
         
     | 
| 
       31 
33 
     | 
    
         
             
            require "autoc/collection/list"
         
     | 
| 
       32 
34 
     | 
    
         
             
            require "autoc/collection/queue"
         
     | 
    
        data/lib/autoc/code.rb
    CHANGED
    
    | 
         @@ -21,7 +21,7 @@ module AutoC 
     | 
|
| 
       21 
21 
     | 
    
         
             
            # Throw NameError is resulting string is not a valid C identifier.
         
     | 
| 
       22 
22 
     | 
    
         
             
            def self.c_id(obj)
         
     | 
| 
       23 
23 
     | 
    
         
             
              obj = obj.to_s
         
     | 
| 
       24 
     | 
    
         
            -
               
     | 
| 
      
 24 
     | 
    
         
            +
              raise NameError.new("'#{obj}' is not a valid C identifier", obj) if (/^[_a-zA-Z]\w*$/ =~ obj).nil?
         
     | 
| 
       25 
25 
     | 
    
         
             
              obj
         
     | 
| 
       26 
26 
     | 
    
         
             
            end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
         @@ -50,7 +50,7 @@ class Code 
     | 
|
| 
       50 
50 
     | 
    
         
             
                end
         
     | 
| 
       51 
51 
     | 
    
         
             
              end
         
     | 
| 
       52 
52 
     | 
    
         
             
              def source_size
         
     | 
| 
       53 
     | 
    
         
            -
                s = String.new
         
     | 
| 
      
 53 
     | 
    
         
            +
                s = ::String.new
         
     | 
| 
       54 
54 
     | 
    
         
             
                write_decls(s)
         
     | 
| 
       55 
55 
     | 
    
         
             
                write_defs(s)
         
     | 
| 
       56 
56 
     | 
    
         
             
                s.size
         
     | 
| 
         @@ -187,6 +187,7 @@ class Module::Header < Module::File 
     | 
|
| 
       187 
187 
     | 
    
         
             
                stream << %$
         
     | 
| 
       188 
188 
     | 
    
         
             
                  #endif
         
     | 
| 
       189 
189 
     | 
    
         
             
                $
         
     | 
| 
      
 190 
     | 
    
         
            +
                stream << "\n" # DigitalMars C in strict ANSI (-A) mode complains about absent empty line at the very end so let's make it happy
         
     | 
| 
       190 
191 
     | 
    
         
             
              end
         
     | 
| 
       191 
192 
     | 
    
         | 
| 
       192 
193 
     | 
    
         
             
            end # Header
         
     | 
    
        data/lib/autoc/collection.rb
    CHANGED
    
    | 
         @@ -72,6 +72,8 @@ WARNING: the collection being iterated *must not* be modified in any way otherwi 
     | 
|
| 
       72 
72 
     | 
    
         
             
            =end
         
     | 
| 
       73 
73 
     | 
    
         
             
            class Collection < Type
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
      
 75 
     | 
    
         
            +
              include Redirecting
         
     | 
| 
      
 76 
     | 
    
         
            +
              
         
     | 
| 
       75 
77 
     | 
    
         
             
              attr_reader :element, :it_ref
         
     | 
| 
       76 
78 
     | 
    
         | 
| 
       77 
79 
     | 
    
         
             
              def hash; super ^ element.hash end
         
     | 
| 
         @@ -86,55 +88,49 @@ class Collection < Type 
     | 
|
| 
       86 
88 
     | 
    
         
             
                super(type_name, visibility)
         
     | 
| 
       87 
89 
     | 
    
         
             
                @it_ref = "#{it}*"
         
     | 
| 
       88 
90 
     | 
    
         
             
                @element = Type.coerce(element_type)
         
     | 
| 
       89 
     | 
    
         
            -
                 
     | 
| 
       90 
     | 
    
         
            -
                 
     | 
| 
       91 
     | 
    
         
            -
                @copy = define_function(:copy, Function::Signature.new([type_ref^:dst, type_ref^:src]))
         
     | 
| 
       92 
     | 
    
         
            -
                @equal = define_function(:equal, Function::Signature.new([type_ref^:lt, type_ref^:rt], :int))
         
     | 
| 
       93 
     | 
    
         
            -
                @identify = define_function(:identify, Function::Signature.new([type_ref^:self], :size_t))
         
     | 
| 
       94 
     | 
    
         
            -
                @less = define_function(:less, Function::Signature.new([type_ref^:lt, type_ref^:rt], :int))
         
     | 
| 
       95 
     | 
    
         
            -
                element_type_check(element)
         
     | 
| 
      
 91 
     | 
    
         
            +
                initialize_redirectors
         
     | 
| 
      
 92 
     | 
    
         
            +
                element_requirement(element)
         
     | 
| 
       96 
93 
     | 
    
         
             
              end
         
     | 
| 
       97 
94 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
               
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
      
 95 
     | 
    
         
            +
              # Normally all collections are expected to provide all special functions
         
     | 
| 
      
 96 
     | 
    
         
            +
              # If a collection does not provide specific function it should override the respective method
         
     | 
| 
      
 97 
     | 
    
         
            +
              
         
     | 
| 
      
 98 
     | 
    
         
            +
              # Collection always has default constructor
         
     | 
| 
      
 99 
     | 
    
         
            +
              def constructible?; true end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
              # Collection always has constructor
         
     | 
| 
      
 102 
     | 
    
         
            +
              def initializable?; true end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
              # Collection always has destructor but the element is required to be destructible on its own
         
     | 
| 
      
 105 
     | 
    
         
            +
              # because collection destruction incurs destruction of all contained elements
         
     | 
| 
      
 106 
     | 
    
         
            +
              def destructible?; true && element.destructible? end
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
              # Collection always has copy constructor but the element is required to be copyable on its own
         
     | 
| 
      
 109 
     | 
    
         
            +
              # because collection copying incurs copying of all contained elements
         
     | 
| 
      
 110 
     | 
    
         
            +
              def copyable?; true && element.copyable? end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
              # Collection always has equality tester but the element is required to be comparable on its own
         
     | 
| 
      
 113 
     | 
    
         
            +
              # because collection comparison incurs comparison of all contained elements
         
     | 
| 
      
 114 
     | 
    
         
            +
              def comparable?; true && element.comparable? end
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
              # So far there are no orderable collections therefore inherit false-returning #orderable? 
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              # Collection always has hash calculation function but the element is required to be hashable on its own
         
     | 
| 
      
 119 
     | 
    
         
            +
              # because collection comparison incurs hash calculation for all contained elements
         
     | 
| 
      
 120 
     | 
    
         
            +
              def hashable?
         
     | 
| 
      
 121 
     | 
    
         
            +
                # Since using collection as an element of a hash-based container also requires it to be comparable as well 
         
     | 
| 
      
 122 
     | 
    
         
            +
                comparable? && element.hashable?
         
     | 
| 
       113 
123 
     | 
    
         
             
              end
         
     | 
| 
       114 
124 
     | 
    
         | 
| 
       115 
     | 
    
         
            -
              def  
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
               
     | 
| 
       118 
     | 
    
         
            -
              
         
     | 
| 
       119 
     | 
    
         
            -
              def hashable?; super && element.hashable? end
         
     | 
| 
      
 125 
     | 
    
         
            +
              def write_intf_decls(stream, declare, define)
         
     | 
| 
      
 126 
     | 
    
         
            +
                write_redirectors(stream, declare, define)
         
     | 
| 
      
 127 
     | 
    
         
            +
              end
         
     | 
| 
       120 
128 
     | 
    
         | 
| 
       121 
129 
     | 
    
         
             
              private
         
     | 
| 
       122 
130 
     | 
    
         | 
| 
       123 
     | 
    
         
            -
              def  
     | 
| 
      
 131 
     | 
    
         
            +
              def element_requirement(obj)
         
     | 
| 
       124 
132 
     | 
    
         
             
                raise "type #{obj.type} (#{obj}) must be destructible" unless obj.destructible?
         
     | 
| 
       125 
133 
     | 
    
         
             
                raise "type #{obj.type} (#{obj}) must be copyable" unless obj.copyable?
         
     | 
| 
       126 
     | 
    
         
            -
                raise "type #{obj.type} (#{obj}) must be comparable" unless obj.comparable?
         
     | 
| 
       127 
     | 
    
         
            -
                raise "type #{obj.type} (#{obj}) must be hashable" unless obj.hashable?
         
     | 
| 
       128 
     | 
    
         
            -
              end
         
     | 
| 
       129 
     | 
    
         
            -
              
         
     | 
| 
       130 
     | 
    
         
            -
              # @private
         
     | 
| 
       131 
     | 
    
         
            -
              class Redirector < Function
         
     | 
| 
       132 
     | 
    
         
            -
                # Redirect call to the specific macro
         
     | 
| 
       133 
     | 
    
         
            -
                def call(*params) "_#{name}(" + params.join(',') + ')' end
         
     | 
| 
       134 
     | 
    
         
            -
              end # Redirector
         
     | 
| 
       135 
     | 
    
         
            -
              
         
     | 
| 
       136 
     | 
    
         
            -
              def define_function(name, signature)
         
     | 
| 
       137 
     | 
    
         
            -
                Redirector.new(method_missing(name), signature)
         
     | 
| 
       138 
134 
     | 
    
         
             
              end
         
     | 
| 
       139 
135 
     | 
    
         | 
| 
       140 
136 
     | 
    
         
             
            end # Collection
         
     | 
| 
         @@ -60,7 +60,7 @@ Return non-zero value if map +self+ contains no entries and zero value otherwise 
     | 
|
| 
       60 
60 
     | 
    
         
             
            |
         
     | 
| 
       61 
61 
     | 
    
         
             
            Return a _copy_ of the element in +self+ bound to a key which is considered equal to the key +key+.
         
     | 
| 
       62 
62 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
            WARNING: +self+ *must* contain such key otherwise the behavior is undefined. See ~type~ 
     | 
| 
      
 63 
     | 
    
         
            +
            WARNING: +self+ *must* contain such key otherwise the behavior is undefined. See ~type~ContainsKey().
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
       65 
65 
     | 
    
         
             
            |*_void_* ~type~Purge(*_Type_* * +self+)
         
     | 
| 
       66 
66 
     | 
    
         
             
            |
         
     | 
| 
         @@ -77,7 +77,7 @@ Return non-zero value on successful put and zero value otherwise. 
     | 
|
| 
       77 
77 
     | 
    
         
             
            If +self+ contains a key which is considered equal to the key +key+,
         
     | 
| 
       78 
78 
     | 
    
         
             
            remove and destroy that key along with an element bound to it
         
     | 
| 
       79 
79 
     | 
    
         
             
            and put a new pair built of the _copies_ of +key+ and +value+,
         
     | 
| 
       80 
     | 
    
         
            -
            otherwise  
     | 
| 
      
 80 
     | 
    
         
            +
            otherwise no nothing.
         
     | 
| 
       81 
81 
     | 
    
         | 
| 
       82 
82 
     | 
    
         
             
            Return non-zero value if the replacement was actually performed and zero value otherwise.
         
     | 
| 
       83 
83 
     | 
    
         | 
| 
         @@ -146,22 +146,18 @@ class HashMap < Collection 
     | 
|
| 
       146 
146 
     | 
    
         
             
                @key = Type.coerce(key_type)
         
     | 
| 
       147 
147 
     | 
    
         
             
                @entry = UserDefinedType.new(:type => entry, :identify => entryIdentify, :equal => entryEqual, :copy => entryCopy, :dtor => entryDtor)
         
     | 
| 
       148 
148 
     | 
    
         
             
                @set = HashSet.new(set, @entry, :static)
         
     | 
| 
       149 
     | 
    
         
            -
                 
     | 
| 
       150 
     | 
    
         
            -
                 
     | 
| 
       151 
     | 
    
         
            -
                key_type_check(key)
         
     | 
| 
      
 149 
     | 
    
         
            +
                element_requirement(value)
         
     | 
| 
      
 150 
     | 
    
         
            +
                key_requirement(key)
         
     | 
| 
       152 
151 
     | 
    
         
             
              end
         
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
       154 
153 
     | 
    
         
             
              def copyable?; super && key.copyable? end
         
     | 
| 
       155 
154 
     | 
    
         | 
| 
       156 
155 
     | 
    
         
             
              def comparable?; super && key.comparable? end
         
     | 
| 
       157 
156 
     | 
    
         | 
| 
       158 
     | 
    
         
            -
              def hashable?
         
     | 
| 
       159 
     | 
    
         
            -
                # NOTE : must be in sync with Type#hashable?
         
     | 
| 
       160 
     | 
    
         
            -
                # No super call here because the map's element need not to be hashable,- only the key must be
         
     | 
| 
       161 
     | 
    
         
            -
                @capability.include?(:hashable) && comparable? && key.hashable?
         
     | 
| 
       162 
     | 
    
         
            -
              end
         
     | 
| 
      
 157 
     | 
    
         
            +
              def hashable?; super && key.hashable? end
         
     | 
| 
       163 
158 
     | 
    
         | 
| 
       164 
159 
     | 
    
         
             
              def write_intf_types(stream)
         
     | 
| 
      
 160 
     | 
    
         
            +
                super
         
     | 
| 
       165 
161 
     | 
    
         
             
                stream << %$
         
     | 
| 
       166 
162 
     | 
    
         
             
                  /***
         
     | 
| 
       167 
163 
     | 
    
         
             
                  **** #{type}<#{key.type},#{value.type}> (#{self.class})
         
     | 
| 
         @@ -213,6 +209,7 @@ class HashMap < Collection 
     | 
|
| 
       213 
209 
     | 
    
         
             
              end
         
     | 
| 
       214 
210 
     | 
    
         | 
| 
       215 
211 
     | 
    
         
             
              def write_impls(stream, define)
         
     | 
| 
      
 212 
     | 
    
         
            +
                super
         
     | 
| 
       216 
213 
     | 
    
         
             
                stream << %$
         
     | 
| 
       217 
214 
     | 
    
         
             
                  #define AUTOC_VALID_VALUE 1
         
     | 
| 
       218 
215 
     | 
    
         
             
                  #define AUTOC_VALID_KEY 2
         
     | 
| 
         @@ -287,9 +284,8 @@ class HashMap < Collection 
     | 
|
| 
       287 
284 
     | 
    
         
             
                    int absent;
         
     | 
| 
       288 
285 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       289 
286 
     | 
    
         
             
                    #{assert}(entry);
         
     | 
| 
       290 
     | 
    
         
            -
                     
     | 
| 
       291 
     | 
    
         
            -
             
     | 
| 
       292 
     | 
    
         
            -
                    }
         
     | 
| 
      
 287 
     | 
    
         
            +
                    absent = !#{containsKey}(self, entry->key);
         
     | 
| 
      
 288 
     | 
    
         
            +
                    if(absent) #{@set.put}(&self->entries, *entry);
         
     | 
| 
       293 
289 
     | 
    
         
             
                    return absent;
         
     | 
| 
       294 
290 
     | 
    
         
             
                  }
         
     | 
| 
       295 
291 
     | 
    
         
             
                  #{define} #{copy.definition} {
         
     | 
| 
         @@ -70,11 +70,11 @@ Remove and destroy all elements stored in +self+. 
     | 
|
| 
       70 
70 
     | 
    
         
             
            |
         
     | 
| 
       71 
71 
     | 
    
         
             
            Put a _copy_ of the element +what+ into +self+ *only if* there is no such element in +self+ which is considered equal to +what+.
         
     | 
| 
       72 
72 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
            Return non-zero value on successful element put and zero value otherwise.
         
     | 
| 
      
 73 
     | 
    
         
            +
            Return non-zero value on successful element put (that is there was not such element in +self+) and zero value otherwise.
         
     | 
| 
       74 
74 
     | 
    
         | 
| 
       75 
75 
     | 
    
         
             
            |*_int_* ~type~Replace(*_Type_* * +self+, *_E_* +with+)
         
     | 
| 
       76 
76 
     | 
    
         
             
            |
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
      
 77 
     | 
    
         
            +
            If +self+ contains an element which is considered equal to the element +with+,
         
     | 
| 
       78 
78 
     | 
    
         
             
            replace that element with a _copy_ of +with+, otherwise do nothing.
         
     | 
| 
       79 
79 
     | 
    
         
             
            Replaced element is destroyed.
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
         @@ -148,11 +148,11 @@ class HashSet < Collection 
     | 
|
| 
       148 
148 
     | 
    
         
             
              def initialize(*args)
         
     | 
| 
       149 
149 
     | 
    
         
             
                super
         
     | 
| 
       150 
150 
     | 
    
         
             
                @list = List.new(list, element, :static)
         
     | 
| 
       151 
     | 
    
         
            -
                 
     | 
| 
       152 
     | 
    
         
            -
                key_type_check(element)
         
     | 
| 
      
 151 
     | 
    
         
            +
                key_requirement(element)
         
     | 
| 
       153 
152 
     | 
    
         
             
              end
         
     | 
| 
       154 
153 
     | 
    
         | 
| 
       155 
154 
     | 
    
         
             
              def write_intf_types(stream)
         
     | 
| 
      
 155 
     | 
    
         
            +
                super
         
     | 
| 
       156 
156 
     | 
    
         
             
                stream << %$
         
     | 
| 
       157 
157 
     | 
    
         
             
                  /***
         
     | 
| 
       158 
158 
     | 
    
         
             
                  **** #{type}<#{element.type}> (#{self.class})
         
     | 
| 
         @@ -170,7 +170,7 @@ class HashSet < Collection 
     | 
|
| 
       170 
170 
     | 
    
         
             
                  };
         
     | 
| 
       171 
171 
     | 
    
         
             
                  struct #{it} {
         
     | 
| 
       172 
172 
     | 
    
         
             
                    #{type_ref} set;
         
     | 
| 
       173 
     | 
    
         
            -
                     
     | 
| 
      
 173 
     | 
    
         
            +
                    size_t bucket_index;
         
     | 
| 
       174 
174 
     | 
    
         
             
                    #{@list.it} it;
         
     | 
| 
       175 
175 
     | 
    
         
             
                  };
         
     | 
| 
       176 
176 
     | 
    
         
             
                $
         
     | 
| 
         @@ -203,10 +203,11 @@ class HashSet < Collection 
     | 
|
| 
       203 
203 
     | 
    
         
             
              end
         
     | 
| 
       204 
204 
     | 
    
         | 
| 
       205 
205 
     | 
    
         
             
              def write_impls(stream, define)
         
     | 
| 
      
 206 
     | 
    
         
            +
                super
         
     | 
| 
       206 
207 
     | 
    
         
             
                @list.write_intf_decls(stream, static, inline)
         
     | 
| 
       207 
208 
     | 
    
         
             
                @list.write_impls(stream, static)
         
     | 
| 
       208 
209 
     | 
    
         
             
                stream << %$
         
     | 
| 
       209 
     | 
    
         
            -
                   
     | 
| 
      
 210 
     | 
    
         
            +
                  static #{element.type_ref} #{itGetRef}(#{it_ref});
         
     | 
| 
       210 
211 
     | 
    
         
             
                  static void #{rehash}(#{type_ref} self) {
         
     | 
| 
       211 
212 
     | 
    
         
             
                    #{@list.type_ref} buckets;
         
     | 
| 
       212 
213 
     | 
    
         
             
                    size_t index, bucket_count, size, fill;
         
     | 
| 
         @@ -407,11 +408,11 @@ class HashSet < Collection 
     | 
|
| 
       407 
408 
     | 
    
         
             
                  #{define} void #{itCtor}(#{it_ref} self, #{type_ref} set) {
         
     | 
| 
       408 
409 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       409 
410 
     | 
    
         
             
                    self->set = set;
         
     | 
| 
       410 
     | 
    
         
            -
                    self->bucket_index =  
     | 
| 
      
 411 
     | 
    
         
            +
                    self->bucket_index = self->set->bucket_count;
         
     | 
| 
       411 
412 
     | 
    
         
             
                  }
         
     | 
| 
       412 
413 
     | 
    
         
             
                  #{define} int #{itMove}(#{it_ref} self) {
         
     | 
| 
       413 
414 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       414 
     | 
    
         
            -
                    if(self->bucket_index  
     | 
| 
      
 415 
     | 
    
         
            +
                    if(self->bucket_index >= self->set->bucket_count) #{@list.itCtor}(&self->it, &self->set->buckets[self->bucket_index = 0]);
         
     | 
| 
       415 
416 
     | 
    
         
             
                    if(#{@list.itMove}(&self->it)) return 1;
         
     | 
| 
       416 
417 
     | 
    
         
             
                    while(++self->bucket_index < self->set->bucket_count) {
         
     | 
| 
       417 
418 
     | 
    
         
             
                      #{@list.itCtor}(&self->it, &self->set->buckets[self->bucket_index]);
         
     | 
| 
         @@ -423,7 +424,7 @@ class HashSet < Collection 
     | 
|
| 
       423 
424 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       424 
425 
     | 
    
         
             
                    return #{@list.itGet}(&self->it);
         
     | 
| 
       425 
426 
     | 
    
         
             
                  }
         
     | 
| 
       426 
     | 
    
         
            -
                   
     | 
| 
      
 427 
     | 
    
         
            +
                  static #{element.type_ref} #{itGetRef}(#{it_ref} self) {
         
     | 
| 
       427 
428 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       428 
429 
     | 
    
         
             
                    return #{@list.itGetRef}(&self->it);
         
     | 
| 
       429 
430 
     | 
    
         
             
                  }
         
     | 
| 
         @@ -432,9 +433,9 @@ class HashSet < Collection 
     | 
|
| 
       432 
433 
     | 
    
         | 
| 
       433 
434 
     | 
    
         
             
              private
         
     | 
| 
       434 
435 
     | 
    
         | 
| 
       435 
     | 
    
         
            -
              def  
     | 
| 
      
 436 
     | 
    
         
            +
              def key_requirement(obj)
         
     | 
| 
      
 437 
     | 
    
         
            +
                element_requirement(obj)
         
     | 
| 
       436 
438 
     | 
    
         
             
                raise "type #{obj.type} (#{obj}) must be hashable" unless obj.hashable?
         
     | 
| 
       437 
     | 
    
         
            -
                element_type_check(obj)
         
     | 
| 
       438 
439 
     | 
    
         
             
              end
         
     | 
| 
       439 
440 
     | 
    
         | 
| 
       440 
441 
     | 
    
         
             
            end # HashSet
         
     | 
| 
         @@ -7,7 +7,7 @@ module AutoC 
     | 
|
| 
       7 
7 
     | 
    
         
             
            =begin
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
            List is an ordered unidirectional sequence container.
         
     | 
| 
       10 
     | 
    
         
            -
            List supports submission/polling operations  
     | 
| 
      
 10 
     | 
    
         
            +
            List supports submission/polling operations on one end hence it can be used as a LIFO container (a stack).
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
            The collection's C++ counterpart is +std::forward_list<>+ template class.
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
         @@ -154,12 +154,8 @@ WARNING: current position *must* be valid otherwise the behavior is undefined. S 
     | 
|
| 
       154 
154 
     | 
    
         
             
            =end
         
     | 
| 
       155 
155 
     | 
    
         
             
            class List < Collection
         
     | 
| 
       156 
156 
     | 
    
         | 
| 
       157 
     | 
    
         
            -
              def initialize(*args)
         
     | 
| 
       158 
     | 
    
         
            -
                super
         
     | 
| 
       159 
     | 
    
         
            -
                @capability.subtract [:orderable]
         
     | 
| 
       160 
     | 
    
         
            -
              end
         
     | 
| 
       161 
     | 
    
         
            -
              
         
     | 
| 
       162 
157 
     | 
    
         
             
              def write_intf_types(stream)
         
     | 
| 
      
 158 
     | 
    
         
            +
                super
         
     | 
| 
       163 
159 
     | 
    
         
             
                stream << %$
         
     | 
| 
       164 
160 
     | 
    
         
             
                  /***
         
     | 
| 
       165 
161 
     | 
    
         
             
                  **** #{type}<#{element.type}> (#{self.class})
         
     | 
| 
         @@ -214,8 +210,9 @@ class List < Collection 
     | 
|
| 
       214 
210 
     | 
    
         
             
              end
         
     | 
| 
       215 
211 
     | 
    
         | 
| 
       216 
212 
     | 
    
         
             
              def write_impls(stream, define)
         
     | 
| 
      
 213 
     | 
    
         
            +
                super
         
     | 
| 
       217 
214 
     | 
    
         
             
                stream << %$
         
     | 
| 
       218 
     | 
    
         
            -
                   
     | 
| 
      
 215 
     | 
    
         
            +
                  static #{element.type_ref} #{itGetRef}(#{it_ref});
         
     | 
| 
       219 
216 
     | 
    
         
             
                  #{define} #{ctor.definition} {
         
     | 
| 
       220 
217 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       221 
218 
     | 
    
         
             
                    self->head_node = NULL;
         
     | 
| 
         @@ -234,12 +231,22 @@ class List < Collection 
     | 
|
| 
       234 
231 
     | 
    
         
             
                  }
         
     | 
| 
       235 
232 
     | 
    
         
             
                  #{define} #{copy.definition} {
         
     | 
| 
       236 
233 
     | 
    
         
             
                    #{it} it;
         
     | 
| 
      
 234 
     | 
    
         
            +
                    size_t index, size;
         
     | 
| 
      
 235 
     | 
    
         
            +
                    #{element.type}** elements;
         
     | 
| 
       237 
236 
     | 
    
         
             
                    #{assert}(src);
         
     | 
| 
       238 
237 
     | 
    
         
             
                    #{assert}(dst);
         
     | 
| 
       239 
238 
     | 
    
         
             
                    #{ctor}(dst);
         
     | 
| 
       240 
     | 
    
         
            -
                     
     | 
| 
       241 
     | 
    
         
            -
             
     | 
| 
       242 
     | 
    
         
            -
                      #{ 
     | 
| 
      
 239 
     | 
    
         
            +
                    if(!#{empty}(src)) {
         
     | 
| 
      
 240 
     | 
    
         
            +
                      /* List is a LIFO type container therefore the insertion order into the destination container should be reversed */
         
     | 
| 
      
 241 
     | 
    
         
            +
                      elements = (#{element.type}**)#{malloc}((size = #{size}(src))*sizeof(#{element.type}*)); #{assert}(elements);
         
     | 
| 
      
 242 
     | 
    
         
            +
                      index = 0;
         
     | 
| 
      
 243 
     | 
    
         
            +
                      #{itCtor}(&it, src);
         
     | 
| 
      
 244 
     | 
    
         
            +
                      while(#{itMove}(&it)) {
         
     | 
| 
      
 245 
     | 
    
         
            +
                        #{assert}(index < size);
         
     | 
| 
      
 246 
     | 
    
         
            +
                        elements[index++] = #{itGetRef}(&it);
         
     | 
| 
      
 247 
     | 
    
         
            +
                      }
         
     | 
| 
      
 248 
     | 
    
         
            +
                      for(index = size; index > 0; --index) #{push}(dst, *elements[index-1]); /* Be careful not to run into the underflow of the unsigned integer type */
         
     | 
| 
      
 249 
     | 
    
         
            +
                      #{free}(elements);
         
     | 
| 
       243 
250 
     | 
    
         
             
                    }
         
     | 
| 
       244 
251 
     | 
    
         
             
                  }
         
     | 
| 
       245 
252 
     | 
    
         
             
                  #{define} #{equal.definition} {
         
     | 
| 
         @@ -331,6 +338,9 @@ class List < Collection 
     | 
|
| 
       331 
338 
     | 
    
         
             
                    }
         
     | 
| 
       332 
339 
     | 
    
         
             
                    #{abort}();
         
     | 
| 
       333 
340 
     | 
    
         
             
                  }
         
     | 
| 
      
 341 
     | 
    
         
            +
                  /* FIXME: for the generality's sake there should be both `what` and `with` values
         
     | 
| 
      
 342 
     | 
    
         
            +
                    This is not achievable without breaking the interface, however,
         
     | 
| 
      
 343 
     | 
    
         
            +
                    therefore defer this change to the major version bump */
         
     | 
| 
       334 
344 
     | 
    
         
             
                  #{define} int #{replaceEx}(#{type_ref} self, #{element.type} with, int count) {
         
     | 
| 
       335 
345 
     | 
    
         
             
                    #{node}* node;
         
     | 
| 
       336 
346 
     | 
    
         
             
                    int replaced = 0;
         
     | 
| 
         @@ -403,7 +413,7 @@ class List < Collection 
     | 
|
| 
       403 
413 
     | 
    
         
             
                    #{element.copy("result", "self->this_node->element")};
         
     | 
| 
       404 
414 
     | 
    
         
             
                    return result;
         
     | 
| 
       405 
415 
     | 
    
         
             
                  }
         
     | 
| 
       406 
     | 
    
         
            -
                   
     | 
| 
      
 416 
     | 
    
         
            +
                  static #{element.type_ref} #{itGetRef}(#{it_ref} self) {
         
     | 
| 
       407 
417 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       408 
418 
     | 
    
         
             
                    #{assert}(self->this_node);
         
     | 
| 
       409 
419 
     | 
    
         
             
                    return &self->this_node->element;
         
     | 
| 
         @@ -9,7 +9,7 @@ module AutoC 
     | 
|
| 
       9 
9 
     | 
    
         
             
            Queue is an ordered bidirectional sequence container.
         
     | 
| 
       10 
10 
     | 
    
         
             
            Queue supports addition/removal operations at both ends.
         
     | 
| 
       11 
11 
     | 
    
         
             
            However, it is intended to be used as a FIFO container as opposed to {AutoC::List}
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
            therefore the default submission, polling and retrieval operations are performed on the opposite ends.
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
            This collection is a synergy of C++ +std::list<>+ and +std::queue<>+ template classes.
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
         @@ -193,12 +193,8 @@ WARNING: current position *must* be valid otherwise the behavior is undefined. S 
     | 
|
| 
       193 
193 
     | 
    
         
             
            =end
         
     | 
| 
       194 
194 
     | 
    
         
             
            class Queue < Collection
         
     | 
| 
       195 
195 
     | 
    
         | 
| 
       196 
     | 
    
         
            -
              def initialize(*args)
         
     | 
| 
       197 
     | 
    
         
            -
                super
         
     | 
| 
       198 
     | 
    
         
            -
                @capability.subtract [:orderable]
         
     | 
| 
       199 
     | 
    
         
            -
              end
         
     | 
| 
       200 
     | 
    
         
            -
              
         
     | 
| 
       201 
196 
     | 
    
         
             
              def write_intf_types(stream)
         
     | 
| 
      
 197 
     | 
    
         
            +
                super
         
     | 
| 
       202 
198 
     | 
    
         
             
                stream << %$
         
     | 
| 
       203 
199 
     | 
    
         
             
                  /***
         
     | 
| 
       204 
200 
     | 
    
         
             
                  **** #{type}<#{element.type}> (#{self.class})
         
     | 
| 
         @@ -263,8 +259,9 @@ class Queue < Collection 
     | 
|
| 
       263 
259 
     | 
    
         
             
              end
         
     | 
| 
       264 
260 
     | 
    
         | 
| 
       265 
261 
     | 
    
         
             
              def write_impls(stream, define)
         
     | 
| 
      
 262 
     | 
    
         
            +
                super
         
     | 
| 
       266 
263 
     | 
    
         
             
                stream << %$
         
     | 
| 
       267 
     | 
    
         
            -
                   
     | 
| 
      
 264 
     | 
    
         
            +
                  static #{element.type_ref} #{itGetRef}(#{it_ref});
         
     | 
| 
       268 
265 
     | 
    
         
             
                  #{define} #{ctor.definition} {
         
     | 
| 
       269 
266 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       270 
267 
     | 
    
         
             
                    self->head_node = self->tail_node = NULL;
         
     | 
| 
         @@ -506,7 +503,7 @@ class Queue < Collection 
     | 
|
| 
       506 
503 
     | 
    
         
             
                    #{element.copy("result", "self->this_node->element")};
         
     | 
| 
       507 
504 
     | 
    
         
             
                    return result;
         
     | 
| 
       508 
505 
     | 
    
         
             
                  }
         
     | 
| 
       509 
     | 
    
         
            -
                   
     | 
| 
      
 506 
     | 
    
         
            +
                  static #{element.type_ref} #{itGetRef}(#{it_ref} self) {
         
     | 
| 
       510 
507 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       511 
508 
     | 
    
         
             
                    #{assert}(self->this_node);
         
     | 
| 
       512 
509 
     | 
    
         
             
                    return &self->this_node->element;
         
     | 
| 
         @@ -78,9 +78,17 @@ Return number of elements stored in vector +self+. 
     | 
|
| 
       78 
78 
     | 
    
         | 
| 
       79 
79 
     | 
    
         
             
            |*_void_* ~type~Sort(*_Type_* * +self+)
         
     | 
| 
       80 
80 
     | 
    
         
             
            |
         
     | 
| 
      
 81 
     | 
    
         
            +
            Perform an ascending sort.
         
     | 
| 
      
 82 
     | 
    
         
            +
            See ~type~SortEx().
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            NOTE : optional operation.
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
            |*_void_* ~type~SortEx(*_Type_* * +self+, *_int_* ascending)
         
     | 
| 
      
 87 
     | 
    
         
            +
            |
         
     | 
| 
       81 
88 
     | 
    
         
             
            NOTE : optional operation.
         
     | 
| 
       82 
89 
     | 
    
         | 
| 
       83 
     | 
    
         
            -
            Perform a  
     | 
| 
      
 90 
     | 
    
         
            +
            Perform a sort operation on the contents of vector +self+ utilizing either generated of user supplied ordering functions.
         
     | 
| 
      
 91 
     | 
    
         
            +
            If the +ascending+ is non-zero, perform the sorting in ascending order otherwise perform the soring in descending order.
         
     | 
| 
       84 
92 
     | 
    
         | 
| 
       85 
93 
     | 
    
         
             
            Note that this operation is defined only if element type is orderable, e.g. has equality testing and comparison operations defined.
         
     | 
| 
       86 
94 
     | 
    
         | 
| 
         @@ -124,12 +132,15 @@ class Vector < Collection 
     | 
|
| 
       124 
132 
     | 
    
         
             
              def initialize(*args)
         
     | 
| 
       125 
133 
     | 
    
         
             
                super
         
     | 
| 
       126 
134 
     | 
    
         
             
                # Override the default type constructor as the Vector's requires one extra parameter
         
     | 
| 
       127 
     | 
    
         
            -
                # Note that this makes the Vector instance  
     | 
| 
       128 
     | 
    
         
            -
                @ctor =  
     | 
| 
       129 
     | 
    
         
            -
                @capability.subtract [:constructible, :orderable] # No default constructor and no less operation defined
         
     | 
| 
      
 135 
     | 
    
         
            +
                # Note that this makes the Vector instance non-constructible
         
     | 
| 
      
 136 
     | 
    
         
            +
                @ctor = define_redirector(:ctor, Function::Signature.new([type_ref^:self, :size_t^:element_count]))
         
     | 
| 
       130 
137 
     | 
    
         
             
              end
         
     | 
| 
       131 
138 
     | 
    
         | 
| 
      
 139 
     | 
    
         
            +
              # No default constructor provided
         
     | 
| 
      
 140 
     | 
    
         
            +
              def constructible?; false end
         
     | 
| 
      
 141 
     | 
    
         
            +
                
         
     | 
| 
       132 
142 
     | 
    
         
             
              def write_intf_types(stream)
         
     | 
| 
      
 143 
     | 
    
         
            +
                super
         
     | 
| 
       133 
144 
     | 
    
         
             
                stream << %$
         
     | 
| 
       134 
145 
     | 
    
         
             
                  /***
         
     | 
| 
       135 
146 
     | 
    
         
             
                  **** #{type}<#{element.type}> (#{self.class})
         
     | 
| 
         @@ -144,8 +155,7 @@ class Vector < Collection 
     | 
|
| 
       144 
155 
     | 
    
         
             
                  };
         
     | 
| 
       145 
156 
     | 
    
         
             
                  struct #{it} {
         
     | 
| 
       146 
157 
     | 
    
         
             
                    #{type_ref} vector;
         
     | 
| 
       147 
     | 
    
         
            -
                    int index;
         
     | 
| 
       148 
     | 
    
         
            -
                    int forward;
         
     | 
| 
      
 158 
     | 
    
         
            +
                    int index, forward;
         
     | 
| 
       149 
159 
     | 
    
         
             
                  };
         
     | 
| 
       150 
160 
     | 
    
         
             
                $
         
     | 
| 
       151 
161 
     | 
    
         
             
              end
         
     | 
| 
         @@ -156,6 +166,7 @@ class Vector < Collection 
     | 
|
| 
       156 
166 
     | 
    
         
             
                  #{declare} #{ctor.declaration};
         
     | 
| 
       157 
167 
     | 
    
         
             
                  #{declare} #{dtor.declaration};
         
     | 
| 
       158 
168 
     | 
    
         
             
                  #{declare} #{copy.declaration};
         
     | 
| 
      
 169 
     | 
    
         
            +
                  /* TODO #{copyRange}() */
         
     | 
| 
       159 
170 
     | 
    
         
             
                  #{declare} #{equal.declaration};
         
     | 
| 
       160 
171 
     | 
    
         
             
                  #{declare} #{identify.declaration};
         
     | 
| 
       161 
172 
     | 
    
         
             
                  #{declare} void #{resize}(#{type_ref}, size_t);
         
     | 
| 
         @@ -199,11 +210,13 @@ class Vector < Collection 
     | 
|
| 
       199 
210 
     | 
    
         
             
                  }
         
     | 
| 
       200 
211 
     | 
    
         
             
                $
         
     | 
| 
       201 
212 
     | 
    
         
             
                stream << %$
         
     | 
| 
       202 
     | 
    
         
            -
                  # 
     | 
| 
      
 213 
     | 
    
         
            +
                  #define #{sort}(self) #{sortEx}(self, 1)
         
     | 
| 
      
 214 
     | 
    
         
            +
                  #{declare} void #{sortEx}(#{type_ref}, int);
         
     | 
| 
       203 
215 
     | 
    
         
             
                $ if element.orderable?
         
     | 
| 
       204 
216 
     | 
    
         
             
              end
         
     | 
| 
       205 
217 
     | 
    
         | 
| 
       206 
218 
     | 
    
         
             
              def write_impls(stream, define)
         
     | 
| 
      
 219 
     | 
    
         
            +
                super
         
     | 
| 
       207 
220 
     | 
    
         
             
                stream << %$
         
     | 
| 
       208 
221 
     | 
    
         
             
                  static void #{allocate}(#{type_ref} self, size_t element_count) {
         
     | 
| 
       209 
222 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
         @@ -283,7 +296,7 @@ class Vector < Collection 
     | 
|
| 
       283 
296 
     | 
    
         
             
                  }
         
     | 
| 
       284 
297 
     | 
    
         
             
                $
         
     | 
| 
       285 
298 
     | 
    
         
             
                stream << %$
         
     | 
| 
       286 
     | 
    
         
            -
                  static int #{ 
     | 
| 
      
 299 
     | 
    
         
            +
                  static int #{ascend}(void* lp_, void* rp_) {
         
     | 
| 
       287 
300 
     | 
    
         
             
                    #{element.type_ref} lp = (#{element.type_ref})lp_;
         
     | 
| 
       288 
301 
     | 
    
         
             
                    #{element.type_ref} rp = (#{element.type_ref})rp_;
         
     | 
| 
       289 
302 
     | 
    
         
             
                    if(#{element.equal("*lp", "*rp")}) {
         
     | 
| 
         @@ -294,18 +307,21 @@ class Vector < Collection 
     | 
|
| 
       294 
307 
     | 
    
         
             
                      return +1;
         
     | 
| 
       295 
308 
     | 
    
         
             
                    }
         
     | 
| 
       296 
309 
     | 
    
         
             
                  }
         
     | 
| 
       297 
     | 
    
         
            -
                   
     | 
| 
      
 310 
     | 
    
         
            +
                  static int #{descend}(void* lp_, void* rp_) {
         
     | 
| 
      
 311 
     | 
    
         
            +
                    return -#{ascend}(lp_, rp_);
         
     | 
| 
      
 312 
     | 
    
         
            +
                  }
         
     | 
| 
      
 313 
     | 
    
         
            +
                  #{define} void #{sortEx}(#{type_ref} self, int ascending) {
         
     | 
| 
       298 
314 
     | 
    
         
             
                    typedef int (*F)(const void*, const void*);
         
     | 
| 
       299 
315 
     | 
    
         
             
                    #{assert}(self);
         
     | 
| 
       300 
     | 
    
         
            -
                    qsort(self->values, #{size}(self), sizeof(#{element.type}), (F)#{ 
     | 
| 
      
 316 
     | 
    
         
            +
                    qsort(self->values, #{size}(self), sizeof(#{element.type}), ascending ? (F)#{ascend} : (F)#{descend});
         
     | 
| 
       301 
317 
     | 
    
         
             
                  }
         
     | 
| 
       302 
318 
     | 
    
         
             
                $ if element.orderable?
         
     | 
| 
       303 
319 
     | 
    
         
             
              end
         
     | 
| 
       304 
320 
     | 
    
         | 
| 
       305 
321 
     | 
    
         
             
              private
         
     | 
| 
       306 
322 
     | 
    
         | 
| 
       307 
     | 
    
         
            -
              def  
     | 
| 
       308 
     | 
    
         
            -
                #  
     | 
| 
      
 323 
     | 
    
         
            +
              def element_requirement(obj)
         
     | 
| 
      
 324 
     | 
    
         
            +
                # Vector requires the element to have default parameterless constructor
         
     | 
| 
       309 
325 
     | 
    
         
             
                raise "type #{obj.type} (#{obj}) must be constructible" unless obj.constructible?
         
     | 
| 
       310 
326 
     | 
    
         
             
                super
         
     | 
| 
       311 
327 
     | 
    
         
             
              end
         
     |