autoc 1.2 → 1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|