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.
@@ -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 write_exported_types(stream)
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
- #{type}* queue;
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 write_exported_declarations(stream, declare, define)
229
+ def write_intf_decls(stream, declare, define)
230
+ super
225
231
  stream << %$
226
- #{declare} void #{ctor}(#{type}*);
227
- #{declare} void #{dtor}(#{type}*);
228
- #{declare} void #{copy}(#{type}*, #{type}*);
229
- #{declare} int #{equal}(#{type}*, #{type}*);
230
- #{declare} size_t #{identify}(#{type}*);
231
- #{declare} void #{purge}(#{type}*);
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}(#{type}*);
234
- #{declare} #{element.type} #{peekTail}(#{type}*);
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}(#{type}*, #{element.type});
237
- #{declare} void #{pushHead}(#{type}*, #{element.type});
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}(#{type}*);
240
- #{declare} #{element.type} #{popTail}(#{type}*);
241
- #{declare} int #{contains}(#{type}*, #{element.type});
242
- #{declare} #{element.type} #{find}(#{type}*, #{element.type});
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}(#{type}*, #{element.type}, int);
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}(#{type}*, #{element.type}, int);
249
- #{declare} size_t #{size}(#{type}*);
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}(#{it}*, #{type}*);
257
+ #{declare} void #{itCtor}(#{it_ref}, #{type_ref});
252
258
  #define #{itCtor}(self, type) #{itCtorEx}(self, type, 1)
253
- #{declare} void #{itCtorEx}(#{it}*, #{type}*, int);
254
- #{declare} int #{itMove}(#{it}*);
255
- #{declare} #{element.type} #{itGet}(#{it}*);
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 write_implementations(stream, define)
265
+ def write_impls(stream, define)
260
266
  stream << %$
261
- #{define} #{element.type}* #{itGetRef}(#{it}*);
262
- #{define} void #{ctor}(#{type}* self) {
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} void #{dtor}(#{type}* self) {
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} void #{copy}(#{type}* dst, #{type}* src) {
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} int #{equal}(#{type}* lt, #{type}* rt) {
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} size_t #{identify}(#{type}* self) {
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}(#{type}* self) {
323
+ #{define} void #{purge}(#{type_ref} self) {
318
324
  #{dtor}(self);
319
325
  #{ctor}(self);
320
326
  }
321
- #{define} #{element.type} #{peekHead}(#{type}* self) {
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}(#{type}* self) {
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}(#{type}* self) {
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}(#{type}* self) {
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}(#{type}* self, #{element.type} element) {
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}(#{type}* self, #{element.type} element) {
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}(#{type}* self, #{element.type} what) {
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}(#{type}* self, #{element.type} what) {
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}(#{type}* self, #{element.type} with, int count) {
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}(#{type}* self, #{element.type} what, int count) {
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}(#{type}* self) {
481
+ #{define} size_t #{size}(#{type_ref} self) {
476
482
  #{assert}(self);
477
483
  return self->node_count;
478
484
  }
479
- #{define} void #{itCtorEx}(#{it}* self, #{type}* queue, int forward) {
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}(#{it}* self) {
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}(#{it}* self) {
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.type}* #{itGetRef}(#{it}* self) {
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 ctor(*args)
121
- args.empty? ? super() : raise("#{self.class} provides no default constructor")
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 write_exported_types(stream)
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.type}* values;
142
+ #{element.type_ref} values;
135
143
  size_t element_count;
136
144
  };
137
145
  struct #{it} {
138
- #{type}* vector;
146
+ #{type_ref} vector;
139
147
  int index;
140
148
  int forward;
141
149
  };
142
150
  $
143
151
  end
144
152
 
145
- def write_exported_declarations(stream, declare, define)
153
+ def write_intf_decls(stream, declare, define)
154
+ super
146
155
  stream << %$
147
- #{declare} void #{ctor}(#{type}*, size_t);
148
- #{declare} void #{dtor}(#{type}*);
149
- #{declare} void #{copy}(#{type}*, #{type}*);
150
- #{declare} int #{equal}(#{type}*, #{type}*);
151
- #{declare} void #{resize}(#{type}*, size_t);
152
- #{declare} size_t #{identify}(#{type}*);
153
- #{define} size_t #{size}(#{type}* self) {
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}(#{type}* self, size_t index) {
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}(#{type}* self, size_t index) {
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}(#{type}* self, size_t index, #{element.type} value) {
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}(#{it}* self, #{type}* vector, int forward) {
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}(#{it}* self) {
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}(#{it}* self) {
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 write_implementations(stream, define)
206
+ def write_impls(stream, define)
196
207
  stream << %$
197
- static void #{allocate}(#{type}* self, size_t element_count) {
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} void #{ctor}(#{type}* self, size_t element_count) {
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} void #{dtor}(#{type}* self) {
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} void #{copy}(#{type}* dst, #{type}* src) {
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} int #{equal}(#{type}* lt, #{type}* rt) {
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} void #{resize}(#{type}* self, size_t new_element_count) {
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.type}* values = (#{element.type}*)#{malloc}(new_element_count*sizeof(#{element.type})); #{assert}(values);
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
- #{define} size_t #{identify}(#{type}* self) {
265
- size_t index, result = 0;
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.type}* lp = (#{element.type}*)lp_;
275
- #{element.type}* rp = (#{element.type}*)rp_;
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}(#{type}* self) {
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