autoc 1.1 → 1.2
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/.yardopts +3 -1
- data/CHANGES +15 -0
- data/README +2 -0
- data/doc/AutoC.html +84 -14
- data/doc/AutoC/Code.html +31 -31
- data/doc/AutoC/Collection.html +250 -182
- data/doc/AutoC/HashMap.html +565 -245
- data/doc/AutoC/HashSet.html +266 -264
- data/doc/AutoC/List.html +317 -249
- data/doc/AutoC/Module.html +66 -72
- data/doc/AutoC/Module/File.html +25 -25
- data/doc/AutoC/Module/Header.html +25 -25
- data/doc/AutoC/Module/Source.html +43 -43
- data/doc/AutoC/Priority.html +3 -3
- data/doc/AutoC/Queue.html +352 -286
- data/doc/AutoC/Reference.html +578 -0
- data/doc/AutoC/Type.html +941 -131
- data/doc/AutoC/UserDefinedType.html +64 -313
- data/doc/AutoC/Vector.html +336 -306
- data/doc/_index.html +22 -4
- data/doc/class_list.html +6 -2
- data/doc/file.CHANGES.html +102 -0
- data/doc/file.README.html +7 -4
- data/doc/file_list.html +8 -1
- data/doc/frames.html +1 -1
- data/doc/index.html +7 -4
- data/doc/js/full_list.js +4 -1
- data/doc/method_list.html +236 -118
- data/doc/top-level-namespace.html +3 -3
- data/lib/autoc.rb +3 -3
- data/lib/autoc/code.rb +11 -5
- data/lib/autoc/collection.rb +62 -56
- data/lib/autoc/collection/hash_map.rb +83 -63
- data/lib/autoc/collection/hash_set.rb +74 -64
- data/lib/autoc/collection/list.rb +48 -41
- data/lib/autoc/collection/queue.rb +53 -47
- data/lib/autoc/collection/vector.rb +63 -42
- data/lib/autoc/type.rb +326 -61
- data/test/test.c +120 -0
- data/test/test.rb +16 -2
- data/test/test_auto.c +1683 -987
- data/test/test_auto.h +491 -176
- metadata +22 -19
@@ -193,7 +193,12 @@ WARNING: current position *must* be valid otherwise the behavior is undefined. S
|
|
193
193
|
=end
|
194
194
|
class Queue < Collection
|
195
195
|
|
196
|
-
def
|
196
|
+
def initialize(*args)
|
197
|
+
super
|
198
|
+
@capability.subtract [:orderable]
|
199
|
+
end
|
200
|
+
|
201
|
+
def write_intf_types(stream)
|
197
202
|
stream << %$
|
198
203
|
/***
|
199
204
|
**** #{type}<#{element.type}> (#{self.class})
|
@@ -210,7 +215,7 @@ class Queue < Collection
|
|
210
215
|
};
|
211
216
|
struct #{it} {
|
212
217
|
int start, forward;
|
213
|
-
#{
|
218
|
+
#{type_ref} queue;
|
214
219
|
#{node}* this_node;
|
215
220
|
};
|
216
221
|
struct #{node} {
|
@@ -221,50 +226,51 @@ class Queue < Collection
|
|
221
226
|
$
|
222
227
|
end
|
223
228
|
|
224
|
-
def
|
229
|
+
def write_intf_decls(stream, declare, define)
|
230
|
+
super
|
225
231
|
stream << %$
|
226
|
-
#{declare}
|
227
|
-
#{declare}
|
228
|
-
#{declare}
|
229
|
-
#{declare}
|
230
|
-
#{declare}
|
231
|
-
#{declare} void #{purge}(#{
|
232
|
+
#{declare} #{ctor.declaration};
|
233
|
+
#{declare} #{dtor.declaration};
|
234
|
+
#{declare} #{copy.declaration};
|
235
|
+
#{declare} #{equal.declaration};
|
236
|
+
#{declare} #{identify.declaration};
|
237
|
+
#{declare} void #{purge}(#{type_ref});
|
232
238
|
#define #{peek}(self) #{peekHead}(self)
|
233
|
-
#{declare} #{element.type} #{peekHead}(#{
|
234
|
-
#{declare} #{element.type} #{peekTail}(#{
|
239
|
+
#{declare} #{element.type} #{peekHead}(#{type_ref});
|
240
|
+
#{declare} #{element.type} #{peekTail}(#{type_ref});
|
235
241
|
#define #{push}(self, element) #{pushTail}(self, element)
|
236
|
-
#{declare} void #{pushTail}(#{
|
237
|
-
#{declare} void #{pushHead}(#{
|
242
|
+
#{declare} void #{pushTail}(#{type_ref}, #{element.type});
|
243
|
+
#{declare} void #{pushHead}(#{type_ref}, #{element.type});
|
238
244
|
#define #{pop}(self) #{popHead}(self)
|
239
|
-
#{declare} #{element.type} #{popHead}(#{
|
240
|
-
#{declare} #{element.type} #{popTail}(#{
|
241
|
-
#{declare} int #{contains}(#{
|
242
|
-
#{declare} #{element.type} #{find}(#{
|
245
|
+
#{declare} #{element.type} #{popHead}(#{type_ref});
|
246
|
+
#{declare} #{element.type} #{popTail}(#{type_ref});
|
247
|
+
#{declare} int #{contains}(#{type_ref}, #{element.type});
|
248
|
+
#{declare} #{element.type} #{find}(#{type_ref}, #{element.type});
|
243
249
|
#define #{replace}(self, with) #{replaceEx}(self, with, 1)
|
244
250
|
#define #{replaceAll}(self, with) #{replaceEx}(self, with, -1)
|
245
|
-
#{declare} int #{replaceEx}(#{
|
251
|
+
#{declare} int #{replaceEx}(#{type_ref}, #{element.type}, int);
|
246
252
|
#define #{remove}(self, what) #{removeEx}(self, what, 1)
|
247
253
|
#define #{removeAll}(self, what) #{removeEx}(self, what, -1)
|
248
|
-
#{declare} int #{removeEx}(#{
|
249
|
-
#{declare} size_t #{size}(#{
|
254
|
+
#{declare} int #{removeEx}(#{type_ref}, #{element.type}, int);
|
255
|
+
#{declare} size_t #{size}(#{type_ref});
|
250
256
|
#define #{empty}(self) (#{size}(self) == 0)
|
251
|
-
#{declare} void #{itCtor}(#{
|
257
|
+
#{declare} void #{itCtor}(#{it_ref}, #{type_ref});
|
252
258
|
#define #{itCtor}(self, type) #{itCtorEx}(self, type, 1)
|
253
|
-
#{declare} void #{itCtorEx}(#{
|
254
|
-
#{declare} int #{itMove}(#{
|
255
|
-
#{declare} #{element.type} #{itGet}(#{
|
259
|
+
#{declare} void #{itCtorEx}(#{it_ref}, #{type_ref}, int);
|
260
|
+
#{declare} int #{itMove}(#{it_ref});
|
261
|
+
#{declare} #{element.type} #{itGet}(#{it_ref});
|
256
262
|
$
|
257
263
|
end
|
258
264
|
|
259
|
-
def
|
265
|
+
def write_impls(stream, define)
|
260
266
|
stream << %$
|
261
|
-
#{define} #{element.
|
262
|
-
#{define}
|
267
|
+
#{define} #{element.type_ref} #{itGetRef}(#{it_ref});
|
268
|
+
#{define} #{ctor.definition} {
|
263
269
|
#{assert}(self);
|
264
270
|
self->head_node = self->tail_node = NULL;
|
265
271
|
self->node_count = 0;
|
266
272
|
}
|
267
|
-
#{define}
|
273
|
+
#{define} #{dtor.definition} {
|
268
274
|
#{node}* node;
|
269
275
|
#{assert}(self);
|
270
276
|
node = self->head_node;
|
@@ -275,7 +281,7 @@ class Queue < Collection
|
|
275
281
|
#{free}(this_node);
|
276
282
|
}
|
277
283
|
}
|
278
|
-
#{define}
|
284
|
+
#{define} #{copy.definition} {
|
279
285
|
#{it} it;
|
280
286
|
#{assert}(src);
|
281
287
|
#{assert}(dst);
|
@@ -287,7 +293,7 @@ class Queue < Collection
|
|
287
293
|
#{element.dtor("element")};
|
288
294
|
}
|
289
295
|
}
|
290
|
-
#{define}
|
296
|
+
#{define} #{equal.definition} {
|
291
297
|
if(#{size}(lt) == #{size}(rt)) {
|
292
298
|
#{it} lit, rit;
|
293
299
|
#{itCtor}(&lit, lt);
|
@@ -304,7 +310,7 @@ class Queue < Collection
|
|
304
310
|
} else
|
305
311
|
return 0;
|
306
312
|
}
|
307
|
-
#{define}
|
313
|
+
#{define} #{identify.definition} {
|
308
314
|
#{node}* node;
|
309
315
|
size_t result = 0;
|
310
316
|
#{assert}(self);
|
@@ -314,25 +320,25 @@ class Queue < Collection
|
|
314
320
|
}
|
315
321
|
return result;
|
316
322
|
}
|
317
|
-
#{define} void #{purge}(#{
|
323
|
+
#{define} void #{purge}(#{type_ref} self) {
|
318
324
|
#{dtor}(self);
|
319
325
|
#{ctor}(self);
|
320
326
|
}
|
321
|
-
#{define} #{element.type} #{peekHead}(#{
|
327
|
+
#{define} #{element.type} #{peekHead}(#{type_ref} self) {
|
322
328
|
#{element.type} result;
|
323
329
|
#{assert}(self);
|
324
330
|
#{assert}(!#{empty}(self));
|
325
331
|
#{element.copy("result", "self->head_node->element")};
|
326
332
|
return result;
|
327
333
|
}
|
328
|
-
#{define} #{element.type} #{peekTail}(#{
|
334
|
+
#{define} #{element.type} #{peekTail}(#{type_ref} self) {
|
329
335
|
#{element.type} result;
|
330
336
|
#{assert}(self);
|
331
337
|
#{assert}(!#{empty}(self));
|
332
338
|
#{element.copy("result", "self->tail_node->element")};
|
333
339
|
return result;
|
334
340
|
}
|
335
|
-
#{define} #{element.type} #{popHead}(#{
|
341
|
+
#{define} #{element.type} #{popHead}(#{type_ref} self) {
|
336
342
|
#{node}* node;
|
337
343
|
#{element.type} result;
|
338
344
|
#{assert}(self);
|
@@ -345,7 +351,7 @@ class Queue < Collection
|
|
345
351
|
#{free}(node);
|
346
352
|
return result;
|
347
353
|
}
|
348
|
-
#{define} #{element.type} #{popTail}(#{
|
354
|
+
#{define} #{element.type} #{popTail}(#{type_ref} self) {
|
349
355
|
#{node}* node;
|
350
356
|
#{element.type} result;
|
351
357
|
#{assert}(self);
|
@@ -358,7 +364,7 @@ class Queue < Collection
|
|
358
364
|
#{free}(node);
|
359
365
|
return result;
|
360
366
|
}
|
361
|
-
#{define} void #{pushTail}(#{
|
367
|
+
#{define} void #{pushTail}(#{type_ref} self, #{element.type} element) {
|
362
368
|
#{node}* node;
|
363
369
|
#{assert}(self);
|
364
370
|
node = (#{node}*)#{malloc}(sizeof(#{node})); #{assert}(node);
|
@@ -374,7 +380,7 @@ class Queue < Collection
|
|
374
380
|
}
|
375
381
|
++self->node_count;
|
376
382
|
}
|
377
|
-
#{define} void #{pushHead}(#{
|
383
|
+
#{define} void #{pushHead}(#{type_ref} self, #{element.type} element) {
|
378
384
|
#{node}* node;
|
379
385
|
#{assert}(self);
|
380
386
|
node = (#{node}*)#{malloc}(sizeof(#{node})); #{assert}(node);
|
@@ -390,7 +396,7 @@ class Queue < Collection
|
|
390
396
|
}
|
391
397
|
++self->node_count;
|
392
398
|
}
|
393
|
-
#{define} int #{contains}(#{
|
399
|
+
#{define} int #{contains}(#{type_ref} self, #{element.type} what) {
|
394
400
|
#{node}* node;
|
395
401
|
int found = 0;
|
396
402
|
#{assert}(self);
|
@@ -404,7 +410,7 @@ class Queue < Collection
|
|
404
410
|
}
|
405
411
|
return found;
|
406
412
|
}
|
407
|
-
#{define} #{element.type} #{find}(#{
|
413
|
+
#{define} #{element.type} #{find}(#{type_ref} self, #{element.type} what) {
|
408
414
|
#{node}* node;
|
409
415
|
#{assert}(self);
|
410
416
|
#{assert}(#{contains}(self, what));
|
@@ -419,7 +425,7 @@ class Queue < Collection
|
|
419
425
|
}
|
420
426
|
#{abort}();
|
421
427
|
}
|
422
|
-
#{define} int #{replaceEx}(#{
|
428
|
+
#{define} int #{replaceEx}(#{type_ref} self, #{element.type} with, int count) {
|
423
429
|
#{node}* node;
|
424
430
|
int replaced = 0;
|
425
431
|
#{assert}(self);
|
@@ -436,7 +442,7 @@ class Queue < Collection
|
|
436
442
|
}
|
437
443
|
return replaced;
|
438
444
|
}
|
439
|
-
#{define} int #{removeEx}(#{
|
445
|
+
#{define} int #{removeEx}(#{type_ref} self, #{element.type} what, int count) {
|
440
446
|
#{node}* node;
|
441
447
|
int removed = 0;
|
442
448
|
#{assert}(self);
|
@@ -472,18 +478,18 @@ class Queue < Collection
|
|
472
478
|
}
|
473
479
|
return removed;
|
474
480
|
}
|
475
|
-
#{define} size_t #{size}(#{
|
481
|
+
#{define} size_t #{size}(#{type_ref} self) {
|
476
482
|
#{assert}(self);
|
477
483
|
return self->node_count;
|
478
484
|
}
|
479
|
-
#{define} void #{itCtorEx}(#{
|
485
|
+
#{define} void #{itCtorEx}(#{it_ref} self, #{type_ref} queue, int forward) {
|
480
486
|
#{assert}(self);
|
481
487
|
#{assert}(queue);
|
482
488
|
self->start = 1;
|
483
489
|
self->queue = queue;
|
484
490
|
self->forward = forward;
|
485
491
|
}
|
486
|
-
#{define} int #{itMove}(#{
|
492
|
+
#{define} int #{itMove}(#{it_ref} self) {
|
487
493
|
#{assert}(self);
|
488
494
|
if(self->start) {
|
489
495
|
self->this_node = self->forward ? self->queue->head_node : self->queue->tail_node;
|
@@ -493,14 +499,14 @@ class Queue < Collection
|
|
493
499
|
}
|
494
500
|
return self->this_node != NULL;
|
495
501
|
}
|
496
|
-
#{define} #{element.type} #{itGet}(#{
|
502
|
+
#{define} #{element.type} #{itGet}(#{it_ref} self) {
|
497
503
|
#{element.type} result;
|
498
504
|
#{assert}(self);
|
499
505
|
#{assert}(self->this_node);
|
500
506
|
#{element.copy("result", "self->this_node->element")};
|
501
507
|
return result;
|
502
508
|
}
|
503
|
-
#{define} #{element.
|
509
|
+
#{define} #{element.type_ref} #{itGetRef}(#{it_ref} self) {
|
504
510
|
#{assert}(self);
|
505
511
|
#{assert}(self->this_node);
|
506
512
|
return &self->this_node->element;
|
@@ -78,8 +78,12 @@ Return number of elements stored in vector +self+.
|
|
78
78
|
|
79
79
|
|*_void_* ~type~Sort(*_Type_* * +self+)
|
80
80
|
|
|
81
|
+
NOTE : optional operation.
|
82
|
+
|
81
83
|
Perform a sorting operation on the contents of vector +self+ utilizing either generated of user supplied ordering functions.
|
82
84
|
|
85
|
+
Note that this operation is defined only if element type is orderable, e.g. has equality testing and comparison operations defined.
|
86
|
+
|
83
87
|
|*_int_* ~type~Within(*_Type_* * +self+, *_size_t_* +index+)
|
84
88
|
|
|
85
89
|
Return non-zero value if +index+ is a valid index and zero value otherwise.
|
@@ -117,11 +121,15 @@ WARNING: current position *must* be valid otherwise the behavior is undefined. S
|
|
117
121
|
=end
|
118
122
|
class Vector < Collection
|
119
123
|
|
120
|
-
def
|
121
|
-
|
124
|
+
def initialize(*args)
|
125
|
+
super
|
126
|
+
# Override the default type constructor as the Vector's requires one extra parameter
|
127
|
+
# Note that this makes the Vector instance un-constructible
|
128
|
+
@ctor = define_function(:ctor, Function::Signature.new([type_ref^:self, :size_t^:element_count]))
|
129
|
+
@capability.subtract [:constructible, :orderable] # No default constructor and no less operation defined
|
122
130
|
end
|
123
|
-
|
124
|
-
def
|
131
|
+
|
132
|
+
def write_intf_types(stream)
|
125
133
|
stream << %$
|
126
134
|
/***
|
127
135
|
**** #{type}<#{element.type}> (#{self.class})
|
@@ -131,76 +139,79 @@ class Vector < Collection
|
|
131
139
|
typedef struct #{type} #{type};
|
132
140
|
typedef struct #{it} #{it};
|
133
141
|
struct #{type} {
|
134
|
-
#{element.
|
142
|
+
#{element.type_ref} values;
|
135
143
|
size_t element_count;
|
136
144
|
};
|
137
145
|
struct #{it} {
|
138
|
-
#{
|
146
|
+
#{type_ref} vector;
|
139
147
|
int index;
|
140
148
|
int forward;
|
141
149
|
};
|
142
150
|
$
|
143
151
|
end
|
144
152
|
|
145
|
-
def
|
153
|
+
def write_intf_decls(stream, declare, define)
|
154
|
+
super
|
146
155
|
stream << %$
|
147
|
-
#{declare}
|
148
|
-
#{declare}
|
149
|
-
#{declare}
|
150
|
-
#{declare}
|
151
|
-
#{declare}
|
152
|
-
#{declare}
|
153
|
-
#{define} size_t #{size}(#{
|
156
|
+
#{declare} #{ctor.declaration};
|
157
|
+
#{declare} #{dtor.declaration};
|
158
|
+
#{declare} #{copy.declaration};
|
159
|
+
#{declare} #{equal.declaration};
|
160
|
+
#{declare} #{identify.declaration};
|
161
|
+
#{declare} void #{resize}(#{type_ref}, size_t);
|
162
|
+
#{define} size_t #{size}(#{type_ref} self) {
|
154
163
|
#{assert}(self);
|
155
164
|
return self->element_count;
|
156
165
|
}
|
157
|
-
#{define} int #{within}(#{
|
166
|
+
#{define} int #{within}(#{type_ref} self, size_t index) {
|
158
167
|
#{assert}(self);
|
159
168
|
return index < #{size}(self);
|
160
169
|
}
|
161
|
-
#{define} #{element.type} #{get}(#{
|
170
|
+
#{define} #{element.type} #{get}(#{type_ref} self, size_t index) {
|
162
171
|
#{element.type} result;
|
163
172
|
#{assert}(self);
|
164
173
|
#{assert}(#{within}(self, index));
|
165
174
|
#{element.copy("result", "self->values[index]")};
|
166
175
|
return result;
|
167
176
|
}
|
168
|
-
#{define} void #{set}(#{
|
177
|
+
#{define} void #{set}(#{type_ref} self, size_t index, #{element.type} value) {
|
169
178
|
#{assert}(self);
|
170
179
|
#{assert}(#{within}(self, index));
|
171
180
|
#{element.dtor("self->values[index]")};
|
172
181
|
#{element.copy("self->values[index]", "value")};
|
173
182
|
}
|
174
|
-
#{declare} void #{sort}(#{type}*);
|
175
183
|
#define #{itCtor}(self, type) #{itCtorEx}(self, type, 1)
|
176
|
-
#{define} void #{itCtorEx}(#{
|
184
|
+
#{define} void #{itCtorEx}(#{it_ref} self, #{type_ref} vector, int forward) {
|
177
185
|
#{assert}(self);
|
178
186
|
#{assert}(vector);
|
179
187
|
self->vector = vector;
|
180
188
|
self->forward = forward;
|
181
189
|
self->index = forward ? -1 : #{size}(vector);
|
182
190
|
}
|
183
|
-
#{define} int #{itMove}(#{
|
191
|
+
#{define} int #{itMove}(#{it_ref} self) {
|
184
192
|
#{assert}(self);
|
185
193
|
if(self->forward) ++self->index; else --self->index;
|
186
194
|
return #{within}(self->vector, self->index);
|
187
195
|
}
|
188
|
-
#{define} #{element.type} #{itGet}(#{
|
196
|
+
#{define} #{element.type} #{itGet}(#{it_ref} self) {
|
189
197
|
#{assert}(self);
|
190
198
|
return #{get}(self->vector, self->index);
|
191
199
|
}
|
192
200
|
$
|
201
|
+
stream << %$
|
202
|
+
#{declare} void #{sort}(#{type_ref});
|
203
|
+
$ if element.orderable?
|
193
204
|
end
|
194
205
|
|
195
|
-
def
|
206
|
+
def write_impls(stream, define)
|
196
207
|
stream << %$
|
197
|
-
static void #{allocate}(#{
|
208
|
+
static void #{allocate}(#{type_ref} self, size_t element_count) {
|
198
209
|
#{assert}(self);
|
199
210
|
#{assert}(element_count > 0);
|
200
211
|
self->element_count = element_count;
|
201
212
|
self->values = (#{element.type}*)#{malloc}(element_count*sizeof(#{element.type})); #{assert}(self->values);
|
202
213
|
}
|
203
|
-
#{define}
|
214
|
+
#{define} #{ctor.definition} {
|
204
215
|
size_t index;
|
205
216
|
#{assert}(self);
|
206
217
|
#{allocate}(self, element_count);
|
@@ -208,7 +219,7 @@ class Vector < Collection
|
|
208
219
|
#{element.ctor("self->values[index]")};
|
209
220
|
}
|
210
221
|
}
|
211
|
-
#{define}
|
222
|
+
#{define} #{dtor.definition} {
|
212
223
|
size_t index;
|
213
224
|
#{assert}(self);
|
214
225
|
for(index = 0; index < #{size}(self); ++index) {
|
@@ -216,7 +227,7 @@ class Vector < Collection
|
|
216
227
|
}
|
217
228
|
#{free}(self->values);
|
218
229
|
}
|
219
|
-
#{define}
|
230
|
+
#{define} #{copy.definition} {
|
220
231
|
size_t index, size;
|
221
232
|
#{assert}(src);
|
222
233
|
#{assert}(dst);
|
@@ -225,7 +236,7 @@ class Vector < Collection
|
|
225
236
|
#{element.copy("dst->values[index]", "src->values[index]")};
|
226
237
|
}
|
227
238
|
}
|
228
|
-
#{define}
|
239
|
+
#{define} #{equal.definition} {
|
229
240
|
size_t index, size;
|
230
241
|
#{assert}(lt);
|
231
242
|
#{assert}(rt);
|
@@ -237,11 +248,20 @@ class Vector < Collection
|
|
237
248
|
} else
|
238
249
|
return 0;
|
239
250
|
}
|
240
|
-
#{define}
|
251
|
+
#{define} #{identify.definition} {
|
252
|
+
size_t index, result = 0;
|
253
|
+
#{assert}(self);
|
254
|
+
for(index = 0; index < self->element_count; ++index) {
|
255
|
+
result ^= #{element.identify("self->values[index]")};
|
256
|
+
result = AUTOC_RCYCLE(result);
|
257
|
+
}
|
258
|
+
return result;
|
259
|
+
}
|
260
|
+
#{define} void #{resize}(#{type_ref} self, size_t new_element_count) {
|
241
261
|
size_t index, element_count, from, to;
|
242
262
|
#{assert}(self);
|
243
263
|
if((element_count = #{size}(self)) != new_element_count) {
|
244
|
-
#{element.
|
264
|
+
#{element.type_ref} values = (#{element.type_ref})#{malloc}(new_element_count*sizeof(#{element.type})); #{assert}(values);
|
245
265
|
from = AUTOC_MIN(element_count, new_element_count);
|
246
266
|
to = AUTOC_MAX(element_count, new_element_count);
|
247
267
|
for(index = 0; index < from; ++index) {
|
@@ -261,18 +281,11 @@ class Vector < Collection
|
|
261
281
|
self->element_count = new_element_count;
|
262
282
|
}
|
263
283
|
}
|
264
|
-
|
265
|
-
|
266
|
-
#{assert}(self);
|
267
|
-
for(index = 0; index < self->element_count; ++index) {
|
268
|
-
result ^= #{element.identify("self->values[index]")};
|
269
|
-
result = AUTOC_RCYCLE(result);
|
270
|
-
}
|
271
|
-
return result;
|
272
|
-
}
|
284
|
+
$
|
285
|
+
stream << %$
|
273
286
|
static int #{comparator}(void* lp_, void* rp_) {
|
274
|
-
#{element.
|
275
|
-
#{element.
|
287
|
+
#{element.type_ref} lp = (#{element.type_ref})lp_;
|
288
|
+
#{element.type_ref} rp = (#{element.type_ref})rp_;
|
276
289
|
if(#{element.equal("*lp", "*rp")}) {
|
277
290
|
return 0;
|
278
291
|
} else if(#{element.less("*lp", "*rp")}) {
|
@@ -281,14 +294,22 @@ class Vector < Collection
|
|
281
294
|
return +1;
|
282
295
|
}
|
283
296
|
}
|
284
|
-
#{define} void #{sort}(#{
|
297
|
+
#{define} void #{sort}(#{type_ref} self) {
|
285
298
|
typedef int (*F)(const void*, const void*);
|
286
299
|
#{assert}(self);
|
287
300
|
qsort(self->values, #{size}(self), sizeof(#{element.type}), (F)#{comparator});
|
288
301
|
}
|
289
|
-
$
|
302
|
+
$ if element.orderable?
|
290
303
|
end
|
304
|
+
|
305
|
+
private
|
291
306
|
|
307
|
+
def element_type_check(obj)
|
308
|
+
# Additional requirement is imposed on the vector's element
|
309
|
+
raise "type #{obj.type} (#{obj}) must be constructible" unless obj.constructible?
|
310
|
+
super
|
311
|
+
end
|
312
|
+
|
292
313
|
end # Vector
|
293
314
|
|
294
315
|
|