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.
@@ -905,6 +905,122 @@ static void type(Test)() {
905
905
  }
906
906
 
907
907
 
908
+ #undef Type
909
+ #define Type ListIntSet
910
+ #undef TypeIt
911
+ #define TypeIt ListIntSetIt
912
+ #undef type
913
+ #define type(x) ListIntSet##x
914
+ #undef it
915
+ #define it(x) ListIntSetIt##x
916
+ #undef Element
917
+ #define Element IntSet
918
+ #undef element
919
+ #define element(x) IntSet##x
920
+
921
+
922
+ static void type(Test)() {
923
+ Type c1, c2;
924
+ Element e;
925
+
926
+ type(Ctor)(&c1);
927
+ type(Ctor)(&c2);
928
+
929
+ element(Ctor)(&e);
930
+ type(Push)(&c1, e);
931
+ element(Put)(&e, 3);
932
+ element(Put)(&e, 2);
933
+ element(Put)(&e, 1);
934
+ type(Push)(&c2, e);
935
+ element(Dtor)(&e);
936
+
937
+ type(Dtor)(&c1);
938
+ type(Dtor)(&c2);
939
+ }
940
+
941
+
942
+ #undef Type
943
+ #define Type Int
944
+ #undef type
945
+ #define type(x) Int##x
946
+
947
+
948
+ static void PIntTest() {
949
+ int *c1, *c2;
950
+ c1 = type(New)(); *c1 = 1;
951
+ c2 = type(New)(); *c2 = 2;
952
+ assert(*c1 != *c2);
953
+ type(Free)(c2);
954
+ c2 = type(Ref)(c1);
955
+ assert(*c1 == *c2);
956
+ type(Free)(c1);
957
+ type(Free)(c2);
958
+ }
959
+
960
+
961
+ #undef Type
962
+ #define Type ValueType
963
+ #undef type
964
+ #define type(x) ValueType##x
965
+
966
+
967
+ static void PValueTypeTest() {
968
+ ValueType *c1, *c2;
969
+ c1 = type(New)();
970
+ c2 = type(New)();
971
+ type(Free)(c2);
972
+ c2 = type(Ref)(c1);
973
+ type(Free)(c1);
974
+ type(Free)(c2);
975
+ }
976
+
977
+
978
+ /* List<Vector<ValueType*>*> */
979
+ #undef Type
980
+ #define Type ListPVectorValue
981
+ #undef TypeIt
982
+ #define TypeIt ListPVectorValueIt
983
+ #undef type
984
+ #define type(x) ListPVectorValue##x
985
+ #undef it
986
+ #define it(x) ListPVectorValueIt##x
987
+ #undef Element
988
+ #define Element PVectorValue
989
+ #undef element
990
+ #define element(x) PVectorValue##x
991
+
992
+
993
+ static void type(Test)() {
994
+ Type c1, c2;
995
+ Element *e1, *e2;
996
+ ValueType *v1, *v2;
997
+
998
+ type(Ctor)(&c1);
999
+ type(Ctor)(&c2);
1000
+
1001
+ e1 = element(New)(3);
1002
+
1003
+ element(Set)(e1, 1, v1 = ValueTypeNew());
1004
+
1005
+ e2 = element(Ref)(e1);
1006
+
1007
+ assert(element(Equal)(e1, e2));
1008
+
1009
+ element(Set)(e2, 0, v2 = ValueTypeRef(v1));
1010
+
1011
+ type(Push)(&c1, e1);
1012
+
1013
+ element(Free)(e1);
1014
+ element(Free)(e2);
1015
+
1016
+ type(Dtor)(&c1);
1017
+ type(Dtor)(&c2);
1018
+
1019
+ ValueTypeFree(v1);
1020
+ ValueTypeFree(v2);
1021
+ }
1022
+
1023
+
908
1024
  int main(int argc, char** argv) {
909
1025
  ValueTypeVectorTest();
910
1026
  ValueTypeListTest();
@@ -917,5 +1033,9 @@ int main(int argc, char** argv) {
917
1033
  IntSetTestNot1();
918
1034
  IntSetTestNot2();
919
1035
  IntStrMapTest();
1036
+ ListIntSetTest();
1037
+ PIntTest();
1038
+ PValueTypeTest();
1039
+ ListPVectorValueTest();
920
1040
  return 0;
921
1041
  }
@@ -11,12 +11,26 @@ ValueType = {
11
11
  :forward => %$#include "test.h"$,
12
12
  }
13
13
 
14
+ PInt = AutoC::Reference.new(:type => "int", :prefix => "Int")
15
+
16
+ PValueType = AutoC::Reference.new(ValueType)
17
+
18
+ IntVector = AutoC::Vector.new(:IntVector, :int)
19
+
20
+ IntSet = AutoC::HashSet.new(:IntSet, :int)
21
+
22
+ ListIntSet = AutoC::List.new(:ListIntSet, IntSet)
23
+
14
24
  AutoC::Module.generate!(:Test) do |c|
15
25
  c << AutoC::Vector.new(:ValueTypeVector, ValueType)
16
26
  c << AutoC::List.new(:ValueTypeList, ValueType)
17
27
  c << AutoC::Queue.new(:ValueTypeQueue, ValueType)
18
28
  c << AutoC::HashSet.new(:ValueTypeSet, ValueType)
19
29
  c << AutoC::HashMap.new(:ValueTypeMap, ValueType, ValueType)
20
- c << AutoC::HashSet.new(:IntSet, :int)
21
- c << AutoC::HashMap.new(:IntStrMap, :int, "const char*")
30
+ c << AutoC::HashMap.new(:IntStrMap, "int", "const char *")
31
+ c << ListIntSet
32
+ c << IntSet
33
+ c << AutoC::Vector.new(:PIntVector, PInt)
34
+ c << PInt << PValueType
35
+ c << AutoC::List.new(:ListPVectorValue, AutoC::Reference.new(AutoC::Vector.new(:PVectorValue, PValueType)))
22
36
  end
@@ -7,6 +7,28 @@
7
7
  #define AUTOC_MAX(a,b) ((a) > (b) ? (a) : (b))
8
8
  #define AUTOC_RCYCLE(x) (((x) << 1) | ((x) >> (sizeof(x)*CHAR_BIT - 1))) /* NOTE : valid for unsigned types only */
9
9
 
10
+ #define AUTOC_COUNTER(p) (*(size_t*)((char*)(p) + sizeof(int)))
11
+ int* IntNew() {
12
+ int* self = (int*)malloc(sizeof(int) + sizeof(size_t));
13
+ assert(self);
14
+ ((*self) = 0);
15
+ AUTOC_COUNTER(self) = 1;
16
+ return self;
17
+ }
18
+ int* IntRef(int* self) {
19
+ assert(self);
20
+ ++AUTOC_COUNTER(self);
21
+ return self;
22
+ }
23
+ void IntFree(int* self) {
24
+ assert(self);
25
+ if(--AUTOC_COUNTER(self) == 0) {
26
+ ;
27
+ free(self);
28
+ }
29
+ }
30
+ #undef AUTOC_COUNTER
31
+
10
32
  #define AUTOC_VALID_VALUE 1
11
33
  #define AUTOC_VALID_KEY 2
12
34
  #define AUTOC_OWNED_VALUE 4
@@ -17,7 +39,7 @@ static IntStrMapEntry IntStrMapEntryKeyOnlyRef(int* key) {
17
39
  entry.flags = AUTOC_VALID_KEY;
18
40
  return entry;
19
41
  }
20
- static IntStrMapEntry IntStrMapEntryKeyValueRef(int* key, const char** value) {
42
+ static IntStrMapEntry IntStrMapEntryKeyValueRef(int* key, const char ** value) {
21
43
  IntStrMapEntry entry;
22
44
  entry.key = *key;
23
45
  entry.value = *value;
@@ -26,20 +48,20 @@ static IntStrMapEntry IntStrMapEntryKeyValueRef(int* key, const char** value) {
26
48
  }
27
49
  #define IntStrMapEntryIdentify(obj) IntStrMapEntryIdentifyRef(&obj)
28
50
  static size_t IntStrMapEntryIdentifyRef(IntStrMapEntry* entry) {
29
- return (size_t)(entry->key);
51
+ return ((size_t)(entry->key));
30
52
  }
31
53
  #define IntStrMapEntryEqual(lt, rt) IntStrMapEntryEqualRef(&lt, &rt)
32
54
  static int IntStrMapEntryEqualRef(IntStrMapEntry* lt, IntStrMapEntry* rt) {
33
- return (lt->key == rt->key);
55
+ return ((lt->key) == (rt->key));
34
56
  }
35
57
  #define IntStrMapEntryCopy(dst, src) IntStrMapEntryCopyRef(&dst, &src)
36
58
  static void IntStrMapEntryCopyRef(IntStrMapEntry* dst, IntStrMapEntry* src) {
37
59
  assert(src->flags & AUTOC_VALID_KEY);
38
60
  dst->flags = (AUTOC_VALID_KEY | AUTOC_OWNED_KEY);
39
- (dst->key = src->key);
61
+ ((dst->key) = (src->key));
40
62
  if(src->flags & AUTOC_VALID_VALUE) {
41
63
  dst->flags |= (AUTOC_VALID_VALUE | AUTOC_OWNED_VALUE);
42
- (dst->value = src->value);
64
+ ((dst->value) = (src->value));
43
65
  }
44
66
  }
45
67
  #define IntStrMapEntryDtor(obj) IntStrMapEntryDtorRef(&obj)
@@ -48,11 +70,34 @@ static void IntStrMapEntryDtorRef(IntStrMapEntry* entry) {
48
70
  if(entry->flags & AUTOC_OWNED_KEY) ;
49
71
  if(entry->flags & AUTOC_VALID_VALUE && entry->flags & AUTOC_OWNED_VALUE) ;
50
72
  }
73
+ static IntStrMapEntry* IntStrMapItGetEntryRef(IntStrMapIt*);
74
+ static int IntStrMapContainsAllOf(IntStrMap* self, IntStrMap* other) {
75
+ IntStrMapIt it;
76
+ IntStrMapItCtor(&it, self);
77
+ while(IntStrMapItMove(&it)) {
78
+ int found = 0;
79
+ IntStrMapEntry* e = IntStrMapItGetEntryRef(&it);
80
+ if(IntStrMapContainsKey(other, e->key)) {
81
+ const char * other_value = IntStrMapGet(other, e->key);
82
+ found = ((e->value) == (other_value));
83
+ ;
84
+ }
85
+ if(!found) return 0;
86
+ }
87
+ return 1;
88
+ }
89
+
90
+ #define _IntStrMapSetCtor(self) IntStrMapSetCtor(&self)
91
+ #define _IntStrMapSetDtor(self) IntStrMapSetDtor(&self)
92
+ #define _IntStrMapSetIdentify(self) IntStrMapSetIdentify(&self)
93
+ #define _IntStrMapSetCopy(dst,src) IntStrMapSetCopy(&dst,&src)
94
+ #define _IntStrMapSetEqual(lt,rt) IntStrMapSetEqual(&lt,&rt)
95
+ #define _IntStrMapSetLess(lt,rt) IntStrMapSetLess(&lt,&rt)
51
96
 
52
97
  AUTOC_STATIC void IntStrMapSetCtor(IntStrMapSet*);
53
98
  AUTOC_STATIC void IntStrMapSetDtor(IntStrMapSet*);
54
- AUTOC_STATIC void IntStrMapSetCopy(IntStrMapSet*, IntStrMapSet*);
55
- AUTOC_STATIC int IntStrMapSetEqual(IntStrMapSet*, IntStrMapSet*);
99
+ AUTOC_STATIC void IntStrMapSetCopy(IntStrMapSet*,IntStrMapSet*);
100
+ AUTOC_STATIC int IntStrMapSetEqual(IntStrMapSet*,IntStrMapSet*);
56
101
  AUTOC_STATIC size_t IntStrMapSetIdentify(IntStrMapSet*);
57
102
  AUTOC_STATIC void IntStrMapSetPurge(IntStrMapSet*);
58
103
  AUTOC_STATIC int IntStrMapSetContains(IntStrMapSet*, IntStrMapEntry);
@@ -70,10 +115,17 @@ AUTOC_STATIC void IntStrMapSetItCtor(IntStrMapSetIt*, IntStrMapSet*);
70
115
  AUTOC_STATIC int IntStrMapSetItMove(IntStrMapSetIt*);
71
116
  AUTOC_STATIC IntStrMapEntry IntStrMapSetItGet(IntStrMapSetIt*);
72
117
 
118
+ #define _IntStrMapSetListCtor(self) IntStrMapSetListCtor(&self)
119
+ #define _IntStrMapSetListDtor(self) IntStrMapSetListDtor(&self)
120
+ #define _IntStrMapSetListIdentify(self) IntStrMapSetListIdentify(&self)
121
+ #define _IntStrMapSetListCopy(dst,src) IntStrMapSetListCopy(&dst,&src)
122
+ #define _IntStrMapSetListEqual(lt,rt) IntStrMapSetListEqual(&lt,&rt)
123
+ #define _IntStrMapSetListLess(lt,rt) IntStrMapSetListLess(&lt,&rt)
124
+
73
125
  AUTOC_STATIC void IntStrMapSetListCtor(IntStrMapSetList*);
74
126
  AUTOC_STATIC void IntStrMapSetListDtor(IntStrMapSetList*);
75
- AUTOC_STATIC void IntStrMapSetListCopy(IntStrMapSetList*, IntStrMapSetList*);
76
- AUTOC_STATIC int IntStrMapSetListEqual(IntStrMapSetList*, IntStrMapSetList*);
127
+ AUTOC_STATIC void IntStrMapSetListCopy(IntStrMapSetList*,IntStrMapSetList*);
128
+ AUTOC_STATIC int IntStrMapSetListEqual(IntStrMapSetList*,IntStrMapSetList*);
77
129
  AUTOC_STATIC size_t IntStrMapSetListIdentify(IntStrMapSetList*);
78
130
  AUTOC_STATIC void IntStrMapSetListPurge(IntStrMapSetList*);
79
131
  AUTOC_STATIC IntStrMapEntry IntStrMapSetListPeek(IntStrMapSetList*);
@@ -110,7 +162,7 @@ AUTOC_STATIC void IntStrMapSetListDtor(IntStrMapSetList* self) {
110
162
  free(this_node);
111
163
  }
112
164
  }
113
- AUTOC_STATIC void IntStrMapSetListCopy(IntStrMapSetList* dst, IntStrMapSetList* src) {
165
+ AUTOC_STATIC void IntStrMapSetListCopy(IntStrMapSetList* dst,IntStrMapSetList* src) {
114
166
  IntStrMapSetListIt it;
115
167
  assert(src);
116
168
  assert(dst);
@@ -120,17 +172,18 @@ AUTOC_STATIC void IntStrMapSetListCopy(IntStrMapSetList* dst, IntStrMapSetList*
120
172
  IntStrMapSetListPush(dst, *IntStrMapSetListItGetRef(&it));
121
173
  }
122
174
  }
123
- AUTOC_STATIC int IntStrMapSetListEqual(IntStrMapSetList* lt, IntStrMapSetList* rt) {
175
+ AUTOC_STATIC int IntStrMapSetListEqual(IntStrMapSetList* lt,IntStrMapSetList* rt) {
124
176
  if(IntStrMapSetListSize(lt) == IntStrMapSetListSize(rt)) {
125
177
  IntStrMapSetListIt lit, rit;
126
178
  IntStrMapSetListItCtor(&lit, lt);
127
179
  IntStrMapSetListItCtor(&rit, rt);
128
180
  while(IntStrMapSetListItMove(&lit) && IntStrMapSetListItMove(&rit)) {
129
181
  int equal;
130
- IntStrMapEntry *le, *re;
182
+ IntStrMapEntry* le;
183
+ IntStrMapEntry* re;
131
184
  le = IntStrMapSetListItGetRef(&lit);
132
185
  re = IntStrMapSetListItGetRef(&rit);
133
- equal = IntStrMapEntryEqual(*le, *re);
186
+ equal = IntStrMapEntryEqual(*le,*re);
134
187
  if(!equal) return 0;
135
188
  }
136
189
  return 1;
@@ -155,7 +208,7 @@ AUTOC_STATIC IntStrMapEntry IntStrMapSetListPeek(IntStrMapSetList* self) {
155
208
  IntStrMapEntry result;
156
209
  assert(self);
157
210
  assert(!IntStrMapSetListEmpty(self));
158
- IntStrMapEntryCopy(result, self->head_node->element);
211
+ IntStrMapEntryCopy(result,self->head_node->element);
159
212
  return result;
160
213
  }
161
214
  AUTOC_STATIC IntStrMapEntry IntStrMapSetListPop(IntStrMapSetList* self) {
@@ -175,7 +228,7 @@ AUTOC_STATIC void IntStrMapSetListPush(IntStrMapSetList* self, IntStrMapEntry el
175
228
  assert(self);
176
229
  node = (IntStrMapSetListNode*)malloc(sizeof(IntStrMapSetListNode));
177
230
  assert(node);
178
- IntStrMapEntryCopy(node->element, element);
231
+ IntStrMapEntryCopy(node->element,element);
179
232
  node->next_node = self->head_node;
180
233
  self->head_node = node;
181
234
  ++self->node_count;
@@ -186,7 +239,7 @@ AUTOC_STATIC int IntStrMapSetListContains(IntStrMapSetList* self, IntStrMapEntry
186
239
  assert(self);
187
240
  node = self->head_node;
188
241
  while(node) {
189
- if(IntStrMapEntryEqual(node->element, what)) {
242
+ if(IntStrMapEntryEqual(node->element,what)) {
190
243
  found = 1;
191
244
  break;
192
245
  }
@@ -200,9 +253,9 @@ AUTOC_STATIC IntStrMapEntry IntStrMapSetListFind(IntStrMapSetList* self, IntStrM
200
253
  assert(IntStrMapSetListContains(self, what));
201
254
  node = self->head_node;
202
255
  while(node) {
203
- if(IntStrMapEntryEqual(node->element, what)) {
256
+ if(IntStrMapEntryEqual(node->element,what)) {
204
257
  IntStrMapEntry result;
205
- IntStrMapEntryCopy(result, node->element);
258
+ IntStrMapEntryCopy(result,node->element);
206
259
  return result;
207
260
  }
208
261
  node = node->next_node;
@@ -216,9 +269,9 @@ AUTOC_STATIC int IntStrMapSetListReplaceEx(IntStrMapSetList* self, IntStrMapEntr
216
269
  if(count == 0) return 0;
217
270
  node = self->head_node;
218
271
  while(node) {
219
- if(IntStrMapEntryEqual(node->element, with)) {
272
+ if(IntStrMapEntryEqual(node->element,with)) {
220
273
  IntStrMapEntryDtor(node->element);
221
- IntStrMapEntryCopy(node->element, with);
274
+ IntStrMapEntryCopy(node->element,with);
222
275
  ++replaced;
223
276
  if(count > 0 && replaced >= count) break;
224
277
  }
@@ -234,7 +287,7 @@ AUTOC_STATIC int IntStrMapSetListRemoveEx(IntStrMapSetList* self, IntStrMapEntry
234
287
  node = self->head_node;
235
288
  prev_node = NULL;
236
289
  while(node) {
237
- if(IntStrMapEntryEqual(node->element, what)) {
290
+ if(IntStrMapEntryEqual(node->element,what)) {
238
291
  IntStrMapSetListNode* this_node;
239
292
  if(prev_node) {
240
293
  this_node = prev_node->next_node = node->next_node;
@@ -278,7 +331,7 @@ AUTOC_STATIC IntStrMapEntry IntStrMapSetListItGet(IntStrMapSetListIt* self) {
278
331
  IntStrMapEntry result;
279
332
  assert(self);
280
333
  assert(self->this_node);
281
- IntStrMapEntryCopy(result, self->this_node->element);
334
+ IntStrMapEntryCopy(result,self->this_node->element);
282
335
  return result;
283
336
  }
284
337
  AUTOC_STATIC IntStrMapEntry* IntStrMapSetListItGetRef(IntStrMapSetListIt* self) {
@@ -334,6 +387,16 @@ static void IntStrMapSetRehash(IntStrMapSet* self) {
334
387
  self->bucket_count = bucket_count;
335
388
  self->size = size;
336
389
  }
390
+ static int IntStrMapSetContainsAllOf(IntStrMapSet* self, IntStrMapSet* other) {
391
+ IntStrMapSetIt it;
392
+ IntStrMapSetItCtor(&it, self);
393
+ while(IntStrMapSetItMove(&it)) {
394
+ int found = 0;
395
+ if(IntStrMapSetContains(other, *IntStrMapSetItGetRef(&it))) found = 1;
396
+ if(!found) return 0;
397
+ }
398
+ return 1;
399
+ }
337
400
  AUTOC_STATIC void IntStrMapSetCtor(IntStrMapSet* self) {
338
401
  assert(self);
339
402
  self->min_bucket_count = 16;
@@ -353,7 +416,7 @@ AUTOC_STATIC void IntStrMapSetDtor(IntStrMapSet* self) {
353
416
  }
354
417
  free(self->buckets);
355
418
  }
356
- AUTOC_STATIC void IntStrMapSetCopy(IntStrMapSet* dst, IntStrMapSet* src) {
419
+ AUTOC_STATIC void IntStrMapSetCopy(IntStrMapSet* dst,IntStrMapSet* src) {
357
420
  IntStrMapSetIt it;
358
421
  assert(src);
359
422
  assert(dst);
@@ -361,17 +424,7 @@ AUTOC_STATIC void IntStrMapSetCopy(IntStrMapSet* dst, IntStrMapSet* src) {
361
424
  IntStrMapSetItCtor(&it, src);
362
425
  while(IntStrMapSetItMove(&it)) IntStrMapSetPut(dst, *IntStrMapSetItGetRef(&it));
363
426
  }
364
- static int IntStrMapSetContainsAllOf(IntStrMapSet* self, IntStrMapSet* other) {
365
- IntStrMapSetIt it;
366
- IntStrMapSetItCtor(&it, self);
367
- while(IntStrMapSetItMove(&it)) {
368
- int found = 0;
369
- if(IntStrMapSetContains(other, *IntStrMapSetItGetRef(&it))) found = 1;
370
- if(!found) return 0;
371
- }
372
- return 1;
373
- }
374
- AUTOC_STATIC int IntStrMapSetEqual(IntStrMapSet* lt, IntStrMapSet* rt) {
427
+ AUTOC_STATIC int IntStrMapSetEqual(IntStrMapSet* lt,IntStrMapSet* rt) {
375
428
  assert(lt);
376
429
  assert(rt);
377
430
  return IntStrMapSetSize(lt) == IntStrMapSetSize(rt) && IntStrMapSetContainsAllOf(lt, rt) && IntStrMapSetContainsAllOf(rt, lt);
@@ -509,7 +562,6 @@ AUTOC_STATIC IntStrMapEntry* IntStrMapSetItGetRef(IntStrMapSetIt* self) {
509
562
  return IntStrMapSetListItGetRef(&self->it);
510
563
  }
511
564
 
512
- static IntStrMapEntry* IntStrMapItGetEntryRef(IntStrMapIt*);
513
565
  void IntStrMapCtor(IntStrMap* self) {
514
566
  assert(self);
515
567
  IntStrMapSetCtor(&self->entries);
@@ -527,7 +579,7 @@ static int IntStrMapPutEntryRef(IntStrMap* self, IntStrMapEntry* entry) {
527
579
  }
528
580
  return absent;
529
581
  }
530
- void IntStrMapCopy(IntStrMap* dst, IntStrMap* src) {
582
+ void IntStrMapCopy(IntStrMap* dst,IntStrMap* src) {
531
583
  IntStrMapIt it;
532
584
  assert(src);
533
585
  assert(dst);
@@ -538,22 +590,7 @@ void IntStrMapCopy(IntStrMap* dst, IntStrMap* src) {
538
590
  IntStrMapPutEntryRef(dst, e);
539
591
  }
540
592
  }
541
- static int IntStrMapContainsAllOf(IntStrMap* self, IntStrMap* other) {
542
- IntStrMapIt it;
543
- IntStrMapItCtor(&it, self);
544
- while(IntStrMapItMove(&it)) {
545
- int found = 0;
546
- IntStrMapEntry* e = IntStrMapItGetEntryRef(&it);
547
- if(IntStrMapContainsKey(other, e->key)) {
548
- const char* other_value = IntStrMapGet(other, e->key);
549
- found = (e->value == other_value);
550
- ;
551
- }
552
- if(!found) return 0;
553
- }
554
- return 1;
555
- }
556
- int IntStrMapEqual(IntStrMap* lt, IntStrMap* rt) {
593
+ int IntStrMapEqual(IntStrMap* lt,IntStrMap* rt) {
557
594
  assert(lt);
558
595
  assert(rt);
559
596
  return IntStrMapSize(lt) == IntStrMapSize(rt) && IntStrMapContainsAllOf(lt, rt) && IntStrMapContainsAllOf(rt, lt);
@@ -578,18 +615,18 @@ int IntStrMapContainsKey(IntStrMap* self, int key) {
578
615
  IntStrMapEntryDtor(entry);
579
616
  return result;
580
617
  }
581
- const char* IntStrMapGet(IntStrMap* self, int key) {
582
- const char* result;
618
+ const char * IntStrMapGet(IntStrMap* self, int key) {
619
+ const char * result;
583
620
  IntStrMapEntry entry, existing_entry;
584
621
  assert(self);
585
622
  assert(IntStrMapContainsKey(self, key));
586
623
  existing_entry = IntStrMapSetGet(&self->entries, entry = IntStrMapEntryKeyOnlyRef(&key));
587
- (result = existing_entry.value);
624
+ ((result) = (existing_entry.value));
588
625
  IntStrMapEntryDtor(existing_entry);
589
626
  IntStrMapEntryDtor(entry);
590
627
  return result;
591
628
  }
592
- int IntStrMapPut(IntStrMap* self, int key, const char* value) {
629
+ int IntStrMapPut(IntStrMap* self, int key, const char * value) {
593
630
  int result;
594
631
  IntStrMapEntry entry;
595
632
  assert(self);
@@ -598,7 +635,7 @@ int IntStrMapPut(IntStrMap* self, int key, const char* value) {
598
635
  IntStrMapEntryDtor(entry);
599
636
  return result;
600
637
  }
601
- int IntStrMapReplace(IntStrMap* self, int key, const char* value) {
638
+ int IntStrMapReplace(IntStrMap* self, int key, const char * value) {
602
639
  int result;
603
640
  IntStrMapEntry entry;
604
641
  assert(self);
@@ -629,16 +666,16 @@ int IntStrMapItGetKey(IntStrMapIt* self) {
629
666
  int key;
630
667
  assert(self);
631
668
  e = IntStrMapItGetEntryRef(self);
632
- (key = e->key);
669
+ ((key) = (e->key));
633
670
  return key;
634
671
  }
635
- const char* IntStrMapItGetElement(IntStrMapIt* self) {
672
+ const char * IntStrMapItGetElement(IntStrMapIt* self) {
636
673
  IntStrMapEntry* e;
637
- const char* value;
674
+ const char * value;
638
675
  assert(self);
639
676
  e = IntStrMapItGetEntryRef(self);
640
677
  assert(e->flags & AUTOC_VALID_VALUE);
641
- (value = e->value);
678
+ ((value) = (e->value));
642
679
  return value;
643
680
  }
644
681
  static IntStrMapEntry* IntStrMapItGetEntryRef(IntStrMapIt* self) {
@@ -650,10 +687,17 @@ static IntStrMapEntry* IntStrMapItGetEntryRef(IntStrMapIt* self) {
650
687
  #undef AUTOC_OWNED_VALUE
651
688
  #undef AUTOC_OWNED_KEY
652
689
 
690
+ #define _IntSetListCtor(self) IntSetListCtor(&self)
691
+ #define _IntSetListDtor(self) IntSetListDtor(&self)
692
+ #define _IntSetListIdentify(self) IntSetListIdentify(&self)
693
+ #define _IntSetListCopy(dst,src) IntSetListCopy(&dst,&src)
694
+ #define _IntSetListEqual(lt,rt) IntSetListEqual(&lt,&rt)
695
+ #define _IntSetListLess(lt,rt) IntSetListLess(&lt,&rt)
696
+
653
697
  AUTOC_STATIC void IntSetListCtor(IntSetList*);
654
698
  AUTOC_STATIC void IntSetListDtor(IntSetList*);
655
- AUTOC_STATIC void IntSetListCopy(IntSetList*, IntSetList*);
656
- AUTOC_STATIC int IntSetListEqual(IntSetList*, IntSetList*);
699
+ AUTOC_STATIC void IntSetListCopy(IntSetList*,IntSetList*);
700
+ AUTOC_STATIC int IntSetListEqual(IntSetList*,IntSetList*);
657
701
  AUTOC_STATIC size_t IntSetListIdentify(IntSetList*);
658
702
  AUTOC_STATIC void IntSetListPurge(IntSetList*);
659
703
  AUTOC_STATIC int IntSetListPeek(IntSetList*);
@@ -690,7 +734,7 @@ AUTOC_STATIC void IntSetListDtor(IntSetList* self) {
690
734
  free(this_node);
691
735
  }
692
736
  }
693
- AUTOC_STATIC void IntSetListCopy(IntSetList* dst, IntSetList* src) {
737
+ AUTOC_STATIC void IntSetListCopy(IntSetList* dst,IntSetList* src) {
694
738
  IntSetListIt it;
695
739
  assert(src);
696
740
  assert(dst);
@@ -700,17 +744,18 @@ AUTOC_STATIC void IntSetListCopy(IntSetList* dst, IntSetList* src) {
700
744
  IntSetListPush(dst, *IntSetListItGetRef(&it));
701
745
  }
702
746
  }
703
- AUTOC_STATIC int IntSetListEqual(IntSetList* lt, IntSetList* rt) {
747
+ AUTOC_STATIC int IntSetListEqual(IntSetList* lt,IntSetList* rt) {
704
748
  if(IntSetListSize(lt) == IntSetListSize(rt)) {
705
749
  IntSetListIt lit, rit;
706
750
  IntSetListItCtor(&lit, lt);
707
751
  IntSetListItCtor(&rit, rt);
708
752
  while(IntSetListItMove(&lit) && IntSetListItMove(&rit)) {
709
753
  int equal;
710
- int *le, *re;
754
+ int* le;
755
+ int* re;
711
756
  le = IntSetListItGetRef(&lit);
712
757
  re = IntSetListItGetRef(&rit);
713
- equal = (*le == *re);
758
+ equal = ((*le) == (*re));
714
759
  if(!equal) return 0;
715
760
  }
716
761
  return 1;
@@ -722,7 +767,7 @@ AUTOC_STATIC size_t IntSetListIdentify(IntSetList* self) {
722
767
  size_t result = 0;
723
768
  assert(self);
724
769
  for(node = self->head_node; node != NULL; node = node->next_node) {
725
- result ^= (size_t)(node->element);
770
+ result ^= ((size_t)(node->element));
726
771
  result = AUTOC_RCYCLE(result);
727
772
  }
728
773
  return result;
@@ -735,7 +780,7 @@ AUTOC_STATIC int IntSetListPeek(IntSetList* self) {
735
780
  int result;
736
781
  assert(self);
737
782
  assert(!IntSetListEmpty(self));
738
- (result = self->head_node->element);
783
+ ((result) = (self->head_node->element));
739
784
  return result;
740
785
  }
741
786
  AUTOC_STATIC int IntSetListPop(IntSetList* self) {
@@ -755,7 +800,7 @@ AUTOC_STATIC void IntSetListPush(IntSetList* self, int element) {
755
800
  assert(self);
756
801
  node = (IntSetListNode*)malloc(sizeof(IntSetListNode));
757
802
  assert(node);
758
- (node->element = element);
803
+ ((node->element) = (element));
759
804
  node->next_node = self->head_node;
760
805
  self->head_node = node;
761
806
  ++self->node_count;
@@ -766,7 +811,7 @@ AUTOC_STATIC int IntSetListContains(IntSetList* self, int what) {
766
811
  assert(self);
767
812
  node = self->head_node;
768
813
  while(node) {
769
- if((node->element == what)) {
814
+ if(((node->element) == (what))) {
770
815
  found = 1;
771
816
  break;
772
817
  }
@@ -780,9 +825,9 @@ AUTOC_STATIC int IntSetListFind(IntSetList* self, int what) {
780
825
  assert(IntSetListContains(self, what));
781
826
  node = self->head_node;
782
827
  while(node) {
783
- if((node->element == what)) {
828
+ if(((node->element) == (what))) {
784
829
  int result;
785
- (result = node->element);
830
+ ((result) = (node->element));
786
831
  return result;
787
832
  }
788
833
  node = node->next_node;
@@ -796,9 +841,9 @@ AUTOC_STATIC int IntSetListReplaceEx(IntSetList* self, int with, int count) {
796
841
  if(count == 0) return 0;
797
842
  node = self->head_node;
798
843
  while(node) {
799
- if((node->element == with)) {
844
+ if(((node->element) == (with))) {
800
845
  ;
801
- (node->element = with);
846
+ ((node->element) = (with));
802
847
  ++replaced;
803
848
  if(count > 0 && replaced >= count) break;
804
849
  }
@@ -814,7 +859,7 @@ AUTOC_STATIC int IntSetListRemoveEx(IntSetList* self, int what, int count) {
814
859
  node = self->head_node;
815
860
  prev_node = NULL;
816
861
  while(node) {
817
- if((node->element == what)) {
862
+ if(((node->element) == (what))) {
818
863
  IntSetListNode* this_node;
819
864
  if(prev_node) {
820
865
  this_node = prev_node->next_node = node->next_node;
@@ -858,7 +903,7 @@ AUTOC_STATIC int IntSetListItGet(IntSetListIt* self) {
858
903
  int result;
859
904
  assert(self);
860
905
  assert(self->this_node);
861
- (result = self->this_node->element);
906
+ ((result) = (self->this_node->element));
862
907
  return result;
863
908
  }
864
909
  AUTOC_STATIC int* IntSetListItGetRef(IntSetListIt* self) {
@@ -904,7 +949,7 @@ static void IntSetRehash(IntSet* self) {
904
949
  while(IntSetItMove(&it)) {
905
950
  IntSetList* bucket;
906
951
  int element = IntSetItGet(&it);
907
- bucket = &buckets[(size_t)(element) % bucket_count];
952
+ bucket = &buckets[((size_t)(element)) % bucket_count];
908
953
  IntSetListPush(bucket, element);
909
954
  ;
910
955
  }
@@ -914,6 +959,16 @@ static void IntSetRehash(IntSet* self) {
914
959
  self->bucket_count = bucket_count;
915
960
  self->size = size;
916
961
  }
962
+ static int IntSetContainsAllOf(IntSet* self, IntSet* other) {
963
+ IntSetIt it;
964
+ IntSetItCtor(&it, self);
965
+ while(IntSetItMove(&it)) {
966
+ int found = 0;
967
+ if(IntSetContains(other, *IntSetItGetRef(&it))) found = 1;
968
+ if(!found) return 0;
969
+ }
970
+ return 1;
971
+ }
917
972
  void IntSetCtor(IntSet* self) {
918
973
  assert(self);
919
974
  self->min_bucket_count = 16;
@@ -933,7 +988,7 @@ void IntSetDtor(IntSet* self) {
933
988
  }
934
989
  free(self->buckets);
935
990
  }
936
- void IntSetCopy(IntSet* dst, IntSet* src) {
991
+ void IntSetCopy(IntSet* dst,IntSet* src) {
937
992
  IntSetIt it;
938
993
  assert(src);
939
994
  assert(dst);
@@ -941,17 +996,7 @@ void IntSetCopy(IntSet* dst, IntSet* src) {
941
996
  IntSetItCtor(&it, src);
942
997
  while(IntSetItMove(&it)) IntSetPut(dst, *IntSetItGetRef(&it));
943
998
  }
944
- static int IntSetContainsAllOf(IntSet* self, IntSet* other) {
945
- IntSetIt it;
946
- IntSetItCtor(&it, self);
947
- while(IntSetItMove(&it)) {
948
- int found = 0;
949
- if(IntSetContains(other, *IntSetItGetRef(&it))) found = 1;
950
- if(!found) return 0;
951
- }
952
- return 1;
953
- }
954
- int IntSetEqual(IntSet* lt, IntSet* rt) {
999
+ int IntSetEqual(IntSet* lt,IntSet* rt) {
955
1000
  assert(lt);
956
1001
  assert(rt);
957
1002
  return IntSetSize(lt) == IntSetSize(rt) && IntSetContainsAllOf(lt, rt) && IntSetContainsAllOf(rt, lt);
@@ -963,7 +1008,7 @@ size_t IntSetIdentify(IntSet* self) {
963
1008
  IntSetItCtor(&it, self);
964
1009
  while(IntSetItMove(&it)) {
965
1010
  int* e = IntSetItGetRef(&it);
966
- result ^= (size_t)(*e);
1011
+ result ^= ((size_t)(*e));
967
1012
  result = AUTOC_RCYCLE(result);
968
1013
  }
969
1014
  return result;
@@ -976,13 +1021,13 @@ void IntSetPurge(IntSet* self) {
976
1021
  }
977
1022
  int IntSetContains(IntSet* self, int element) {
978
1023
  assert(self);
979
- return IntSetListContains(&self->buckets[(size_t)(element) % self->bucket_count], element);
1024
+ return IntSetListContains(&self->buckets[((size_t)(element)) % self->bucket_count], element);
980
1025
  }
981
1026
  int IntSetGet(IntSet* self, int element) {
982
1027
  int result;
983
1028
  assert(self);
984
1029
  assert(IntSetContains(self, element));
985
- result = IntSetListFind(&self->buckets[(size_t)(element) % self->bucket_count], element);
1030
+ result = IntSetListFind(&self->buckets[((size_t)(element)) % self->bucket_count], element);
986
1031
  return result;
987
1032
  }
988
1033
  size_t IntSetSize(IntSet* self) {
@@ -992,7 +1037,7 @@ size_t IntSetSize(IntSet* self) {
992
1037
  int IntSetPut(IntSet* self, int element) {
993
1038
  IntSetList* bucket;
994
1039
  assert(self);
995
- bucket = &self->buckets[(size_t)(element) % self->bucket_count];
1040
+ bucket = &self->buckets[((size_t)(element)) % self->bucket_count];
996
1041
  if(!IntSetListContains(bucket, element)) {
997
1042
  IntSetListPush(bucket, element);
998
1043
  ++self->size;
@@ -1004,13 +1049,13 @@ int IntSetPut(IntSet* self, int element) {
1004
1049
  int IntSetReplace(IntSet* self, int element) {
1005
1050
  IntSetList* bucket;
1006
1051
  assert(self);
1007
- bucket = &self->buckets[(size_t)(element) % self->bucket_count];
1052
+ bucket = &self->buckets[((size_t)(element)) % self->bucket_count];
1008
1053
  return IntSetListReplace(bucket, element);
1009
1054
  }
1010
1055
  int IntSetRemove(IntSet* self, int element) {
1011
1056
  IntSetList* bucket;
1012
1057
  assert(self);
1013
- bucket = &self->buckets[(size_t)(element) % self->bucket_count];
1058
+ bucket = &self->buckets[((size_t)(element)) % self->bucket_count];
1014
1059
  if(IntSetListRemove(bucket, element)) {
1015
1060
  --self->size;
1016
1061
  IntSetRehash(self);
@@ -1089,179 +1134,229 @@ int* IntSetItGetRef(IntSetIt* self) {
1089
1134
  return IntSetListItGetRef(&self->it);
1090
1135
  }
1091
1136
 
1092
- ValueType* ValueTypeQueueItGetRef(ValueTypeQueueIt*);
1093
- void ValueTypeQueueCtor(ValueTypeQueue* self) {
1137
+ static void ValueTypeVectorAllocate(ValueTypeVector* self, size_t element_count) {
1094
1138
  assert(self);
1095
- self->head_node = self->tail_node = NULL;
1139
+ assert(element_count > 0);
1140
+ self->element_count = element_count;
1141
+ self->values = (ValueType*)malloc(element_count*sizeof(ValueType));
1142
+ assert(self->values);
1143
+ }
1144
+ void ValueTypeVectorCtor(ValueTypeVector* self,size_t element_count) {
1145
+ size_t index;
1146
+ assert(self);
1147
+ ValueTypeVectorAllocate(self, element_count);
1148
+ for(index = 0; index < ValueTypeVectorSize(self); ++index) {
1149
+ ValueTypeCtor(self->values[index]);
1150
+ }
1151
+ }
1152
+ void ValueTypeVectorDtor(ValueTypeVector* self) {
1153
+ size_t index;
1154
+ assert(self);
1155
+ for(index = 0; index < ValueTypeVectorSize(self); ++index) {
1156
+ ValueTypeDtor(self->values[index]);
1157
+ }
1158
+ free(self->values);
1159
+ }
1160
+ void ValueTypeVectorCopy(ValueTypeVector* dst,ValueTypeVector* src) {
1161
+ size_t index, size;
1162
+ assert(src);
1163
+ assert(dst);
1164
+ ValueTypeVectorAllocate(dst, size = ValueTypeVectorSize(src));
1165
+ for(index = 0; index < size; ++index) {
1166
+ ValueTypeCopy(dst->values[index],src->values[index]);
1167
+ }
1168
+ }
1169
+ int ValueTypeVectorEqual(ValueTypeVector* lt,ValueTypeVector* rt) {
1170
+ size_t index, size;
1171
+ assert(lt);
1172
+ assert(rt);
1173
+ if(ValueTypeVectorSize(lt) == (size = ValueTypeVectorSize(rt))) {
1174
+ for(index = 0; index < size; ++index) {
1175
+ if(!ValueTypeEqual(lt->values[index],rt->values[index])) return 0;
1176
+ }
1177
+ return 1;
1178
+ } else
1179
+ return 0;
1180
+ }
1181
+ size_t ValueTypeVectorIdentify(ValueTypeVector* self) {
1182
+ size_t index, result = 0;
1183
+ assert(self);
1184
+ for(index = 0; index < self->element_count; ++index) {
1185
+ result ^= ValueTypeIdentify(self->values[index]);
1186
+ result = AUTOC_RCYCLE(result);
1187
+ }
1188
+ return result;
1189
+ }
1190
+ void ValueTypeVectorResize(ValueTypeVector* self, size_t new_element_count) {
1191
+ size_t index, element_count, from, to;
1192
+ assert(self);
1193
+ if((element_count = ValueTypeVectorSize(self)) != new_element_count) {
1194
+ ValueType* values = (ValueType*)malloc(new_element_count*sizeof(ValueType));
1195
+ assert(values);
1196
+ from = AUTOC_MIN(element_count, new_element_count);
1197
+ to = AUTOC_MAX(element_count, new_element_count);
1198
+ for(index = 0; index < from; ++index) {
1199
+ values[index] = self->values[index];
1200
+ }
1201
+ if(element_count > new_element_count) {
1202
+ for(index = from; index < to; ++index) {
1203
+ ValueTypeDtor(self->values[index]);
1204
+ }
1205
+ } else {
1206
+ for(index = from; index < to; ++index) {
1207
+ ValueTypeCtor(values[index]);
1208
+ }
1209
+ }
1210
+ free(self->values);
1211
+ self->values = values;
1212
+ self->element_count = new_element_count;
1213
+ }
1214
+ }
1215
+
1216
+ static int ValueTypeVectorComparator(void* lp_, void* rp_) {
1217
+ ValueType* lp = (ValueType*)lp_;
1218
+ ValueType* rp = (ValueType*)rp_;
1219
+ if(ValueTypeEqual(*lp,*rp)) {
1220
+ return 0;
1221
+ } else if(ValueTypeLess(*lp,*rp)) {
1222
+ return -1;
1223
+ } else {
1224
+ return +1;
1225
+ }
1226
+ }
1227
+ void ValueTypeVectorSort(ValueTypeVector* self) {
1228
+ typedef int (*F)(const void*, const void*);
1229
+ assert(self);
1230
+ qsort(self->values, ValueTypeVectorSize(self), sizeof(ValueType), (F)ValueTypeVectorComparator);
1231
+ }
1232
+
1233
+ IntSet* ListIntSetItGetRef(ListIntSetIt*);
1234
+ void ListIntSetCtor(ListIntSet* self) {
1235
+ assert(self);
1236
+ self->head_node = NULL;
1096
1237
  self->node_count = 0;
1097
1238
  }
1098
- void ValueTypeQueueDtor(ValueTypeQueue* self) {
1099
- ValueTypeQueueNode* node;
1239
+ void ListIntSetDtor(ListIntSet* self) {
1240
+ ListIntSetNode* node;
1100
1241
  assert(self);
1101
1242
  node = self->head_node;
1102
1243
  while(node) {
1103
- ValueTypeQueueNode* this_node = node;
1244
+ ListIntSetNode* this_node = node;
1104
1245
  node = node->next_node;
1105
- ValueTypeDtor(this_node->element);
1246
+ _IntSetDtor(this_node->element);
1106
1247
  free(this_node);
1107
1248
  }
1108
1249
  }
1109
- void ValueTypeQueueCopy(ValueTypeQueue* dst, ValueTypeQueue* src) {
1110
- ValueTypeQueueIt it;
1250
+ void ListIntSetCopy(ListIntSet* dst,ListIntSet* src) {
1251
+ ListIntSetIt it;
1111
1252
  assert(src);
1112
1253
  assert(dst);
1113
- ValueTypeQueueCtor(dst);
1114
- ValueTypeQueueItCtor(&it, src);
1115
- while(ValueTypeQueueItMove(&it)) {
1116
- ValueType element;
1117
- ValueTypeQueuePushTail(dst, element = ValueTypeQueueItGet(&it));
1118
- ValueTypeDtor(element);
1119
- }
1120
- }
1121
- int ValueTypeQueueEqual(ValueTypeQueue* lt, ValueTypeQueue* rt) {
1122
- if(ValueTypeQueueSize(lt) == ValueTypeQueueSize(rt)) {
1123
- ValueTypeQueueIt lit, rit;
1124
- ValueTypeQueueItCtor(&lit, lt);
1125
- ValueTypeQueueItCtor(&rit, rt);
1126
- while(ValueTypeQueueItMove(&lit) && ValueTypeQueueItMove(&rit)) {
1254
+ ListIntSetCtor(dst);
1255
+ ListIntSetItCtor(&it, src);
1256
+ while(ListIntSetItMove(&it)) {
1257
+ ListIntSetPush(dst, *ListIntSetItGetRef(&it));
1258
+ }
1259
+ }
1260
+ int ListIntSetEqual(ListIntSet* lt,ListIntSet* rt) {
1261
+ if(ListIntSetSize(lt) == ListIntSetSize(rt)) {
1262
+ ListIntSetIt lit, rit;
1263
+ ListIntSetItCtor(&lit, lt);
1264
+ ListIntSetItCtor(&rit, rt);
1265
+ while(ListIntSetItMove(&lit) && ListIntSetItMove(&rit)) {
1127
1266
  int equal;
1128
- ValueType *le, *re;
1129
- le = ValueTypeQueueItGetRef(&lit);
1130
- re = ValueTypeQueueItGetRef(&rit);
1131
- equal = ValueTypeEqual(*le, *re);
1267
+ IntSet* le;
1268
+ IntSet* re;
1269
+ le = ListIntSetItGetRef(&lit);
1270
+ re = ListIntSetItGetRef(&rit);
1271
+ equal = _IntSetEqual(*le,*re);
1132
1272
  if(!equal) return 0;
1133
1273
  }
1134
1274
  return 1;
1135
1275
  } else
1136
1276
  return 0;
1137
1277
  }
1138
- size_t ValueTypeQueueIdentify(ValueTypeQueue* self) {
1139
- ValueTypeQueueNode* node;
1278
+ size_t ListIntSetIdentify(ListIntSet* self) {
1279
+ ListIntSetNode* node;
1140
1280
  size_t result = 0;
1141
1281
  assert(self);
1142
1282
  for(node = self->head_node; node != NULL; node = node->next_node) {
1143
- result ^= ValueTypeIdentify(node->element);
1283
+ result ^= _IntSetIdentify(node->element);
1144
1284
  result = AUTOC_RCYCLE(result);
1145
1285
  }
1146
1286
  return result;
1147
1287
  }
1148
- void ValueTypeQueuePurge(ValueTypeQueue* self) {
1149
- ValueTypeQueueDtor(self);
1150
- ValueTypeQueueCtor(self);
1151
- }
1152
- ValueType ValueTypeQueuePeekHead(ValueTypeQueue* self) {
1153
- ValueType result;
1154
- assert(self);
1155
- assert(!ValueTypeQueueEmpty(self));
1156
- ValueTypeCopy(result, self->head_node->element);
1157
- return result;
1288
+ void ListIntSetPurge(ListIntSet* self) {
1289
+ ListIntSetDtor(self);
1290
+ ListIntSetCtor(self);
1158
1291
  }
1159
- ValueType ValueTypeQueuePeekTail(ValueTypeQueue* self) {
1160
- ValueType result;
1292
+ IntSet ListIntSetPeek(ListIntSet* self) {
1293
+ IntSet result;
1161
1294
  assert(self);
1162
- assert(!ValueTypeQueueEmpty(self));
1163
- ValueTypeCopy(result, self->tail_node->element);
1295
+ assert(!ListIntSetEmpty(self));
1296
+ _IntSetCopy(result,self->head_node->element);
1164
1297
  return result;
1165
1298
  }
1166
- ValueType ValueTypeQueuePopHead(ValueTypeQueue* self) {
1167
- ValueTypeQueueNode* node;
1168
- ValueType result;
1299
+ IntSet ListIntSetPop(ListIntSet* self) {
1300
+ ListIntSetNode* node;
1301
+ IntSet result;
1169
1302
  assert(self);
1170
- assert(!ValueTypeQueueEmpty(self));
1303
+ assert(!ListIntSetEmpty(self));
1171
1304
  node = self->head_node;
1172
1305
  result = node->element;
1173
1306
  self->head_node = self->head_node->next_node;
1174
- self->head_node->prev_node = NULL;
1175
1307
  --self->node_count;
1176
1308
  free(node);
1177
1309
  return result;
1178
1310
  }
1179
- ValueType ValueTypeQueuePopTail(ValueTypeQueue* self) {
1180
- ValueTypeQueueNode* node;
1181
- ValueType result;
1311
+ void ListIntSetPush(ListIntSet* self, IntSet element) {
1312
+ ListIntSetNode* node;
1182
1313
  assert(self);
1183
- assert(!ValueTypeQueueEmpty(self));
1184
- node = self->tail_node;
1185
- result = node->element;
1186
- self->tail_node = self->tail_node->prev_node;
1187
- self->tail_node->next_node = NULL;
1188
- --self->node_count;
1189
- free(node);
1190
- return result;
1314
+ node = (ListIntSetNode*)malloc(sizeof(ListIntSetNode));
1315
+ assert(node);
1316
+ _IntSetCopy(node->element,element);
1317
+ node->next_node = self->head_node;
1318
+ self->head_node = node;
1319
+ ++self->node_count;
1191
1320
  }
1192
- void ValueTypeQueuePushTail(ValueTypeQueue* self, ValueType element) {
1193
- ValueTypeQueueNode* node;
1321
+ int ListIntSetContains(ListIntSet* self, IntSet what) {
1322
+ ListIntSetNode* node;
1323
+ int found = 0;
1194
1324
  assert(self);
1195
- node = (ValueTypeQueueNode*)malloc(sizeof(ValueTypeQueueNode));
1196
- assert(node);
1197
- ValueTypeCopy(node->element, element);
1198
- if(ValueTypeQueueEmpty(self)) {
1199
- node->prev_node = node->next_node = NULL;
1200
- self->tail_node = self->head_node = node;
1201
- } else {
1202
- node->next_node = NULL;
1203
- node->prev_node = self->tail_node;
1204
- self->tail_node->next_node = node;
1205
- self->tail_node = node;
1325
+ node = self->head_node;
1326
+ while(node) {
1327
+ if(_IntSetEqual(node->element,what)) {
1328
+ found = 1;
1329
+ break;
1330
+ }
1331
+ node = node->next_node;
1206
1332
  }
1207
- ++self->node_count;
1333
+ return found;
1208
1334
  }
1209
- void ValueTypeQueuePushHead(ValueTypeQueue* self, ValueType element) {
1210
- ValueTypeQueueNode* node;
1335
+ IntSet ListIntSetFind(ListIntSet* self, IntSet what) {
1336
+ ListIntSetNode* node;
1211
1337
  assert(self);
1212
- node = (ValueTypeQueueNode*)malloc(sizeof(ValueTypeQueueNode));
1213
- assert(node);
1214
- ValueTypeCopy(node->element, element);
1215
- if(ValueTypeQueueEmpty(self)) {
1216
- node->prev_node = node->next_node = NULL;
1217
- self->tail_node = self->head_node = node;
1218
- } else {
1219
- node->prev_node = NULL;
1220
- node->next_node = self->head_node;
1221
- self->head_node->prev_node = node;
1222
- self->head_node = node;
1223
- }
1224
- ++self->node_count;
1225
- }
1226
- int ValueTypeQueueContains(ValueTypeQueue* self, ValueType what) {
1227
- ValueTypeQueueNode* node;
1228
- int found = 0;
1229
- assert(self);
1230
- node = self->head_node;
1231
- while(node) {
1232
- if(ValueTypeEqual(node->element, what)) {
1233
- found = 1;
1234
- break;
1235
- }
1236
- node = node->next_node;
1237
- }
1238
- return found;
1239
- }
1240
- ValueType ValueTypeQueueFind(ValueTypeQueue* self, ValueType what) {
1241
- ValueTypeQueueNode* node;
1242
- assert(self);
1243
- assert(ValueTypeQueueContains(self, what));
1338
+ assert(ListIntSetContains(self, what));
1244
1339
  node = self->head_node;
1245
1340
  while(node) {
1246
- if(ValueTypeEqual(node->element, what)) {
1247
- ValueType result;
1248
- ValueTypeCopy(result, node->element);
1341
+ if(_IntSetEqual(node->element,what)) {
1342
+ IntSet result;
1343
+ _IntSetCopy(result,node->element);
1249
1344
  return result;
1250
1345
  }
1251
1346
  node = node->next_node;
1252
1347
  }
1253
1348
  abort();
1254
1349
  }
1255
- int ValueTypeQueueReplaceEx(ValueTypeQueue* self, ValueType with, int count) {
1256
- ValueTypeQueueNode* node;
1350
+ int ListIntSetReplaceEx(ListIntSet* self, IntSet with, int count) {
1351
+ ListIntSetNode* node;
1257
1352
  int replaced = 0;
1258
1353
  assert(self);
1259
1354
  if(count == 0) return 0;
1260
1355
  node = self->head_node;
1261
1356
  while(node) {
1262
- if(ValueTypeEqual(node->element, with)) {
1263
- ValueTypeDtor(node->element);
1264
- ValueTypeCopy(node->element, with);
1357
+ if(_IntSetEqual(node->element,with)) {
1358
+ _IntSetDtor(node->element);
1359
+ _IntSetCopy(node->element,with);
1265
1360
  ++replaced;
1266
1361
  if(count > 0 && replaced >= count) break;
1267
1362
  }
@@ -1269,363 +1364,350 @@ int ValueTypeQueueReplaceEx(ValueTypeQueue* self, ValueType with, int count) {
1269
1364
  }
1270
1365
  return replaced;
1271
1366
  }
1272
- int ValueTypeQueueRemoveEx(ValueTypeQueue* self, ValueType what, int count) {
1273
- ValueTypeQueueNode* node;
1367
+ int ListIntSetRemoveEx(ListIntSet* self, IntSet what, int count) {
1368
+ ListIntSetNode *node, *prev_node;
1274
1369
  int removed = 0;
1275
1370
  assert(self);
1276
1371
  if(count == 0) return 0;
1277
1372
  node = self->head_node;
1373
+ prev_node = NULL;
1278
1374
  while(node) {
1279
- if(ValueTypeEqual(node->element, what)) {
1280
- ValueTypeQueueNode* this_node;
1281
- if(node == self->head_node) {
1282
- assert(!node->prev_node);
1283
- this_node = self->head_node = node->next_node;
1284
- if(self->head_node) self->head_node->prev_node = NULL;
1285
- } else if(node == self->tail_node) {
1286
- assert(!node->next_node);
1287
- self->tail_node = node->prev_node;
1288
- this_node = self->tail_node->next_node = NULL;
1375
+ if(_IntSetEqual(node->element,what)) {
1376
+ ListIntSetNode* this_node;
1377
+ if(prev_node) {
1378
+ this_node = prev_node->next_node = node->next_node;
1289
1379
  } else {
1290
- assert(node->prev_node);
1291
- assert(node->next_node);
1292
- this_node = node->next_node;
1293
- node->next_node->prev_node = node->prev_node;
1294
- node->prev_node->next_node = node->next_node;
1380
+ this_node = self->head_node = node->next_node;
1295
1381
  }
1296
1382
  ++removed;
1297
1383
  --self->node_count;
1298
- ValueTypeDtor(node->element);
1384
+ _IntSetDtor(node->element);
1299
1385
  free(node);
1300
1386
  node = this_node;
1301
1387
  if(count > 0 && removed >= count) break;
1302
1388
  } else {
1389
+ prev_node = node;
1303
1390
  node = node->next_node;
1304
1391
  }
1305
1392
  }
1306
1393
  return removed;
1307
1394
  }
1308
- size_t ValueTypeQueueSize(ValueTypeQueue* self) {
1395
+ size_t ListIntSetSize(ListIntSet* self) {
1309
1396
  assert(self);
1310
1397
  return self->node_count;
1311
1398
  }
1312
- void ValueTypeQueueItCtorEx(ValueTypeQueueIt* self, ValueTypeQueue* queue, int forward) {
1399
+ void ListIntSetItCtor(ListIntSetIt* self, ListIntSet* list) {
1313
1400
  assert(self);
1314
- assert(queue);
1401
+ assert(list);
1315
1402
  self->start = 1;
1316
- self->queue = queue;
1317
- self->forward = forward;
1403
+ self->list = list;
1318
1404
  }
1319
- int ValueTypeQueueItMove(ValueTypeQueueIt* self) {
1405
+ int ListIntSetItMove(ListIntSetIt* self) {
1320
1406
  assert(self);
1321
1407
  if(self->start) {
1322
- self->this_node = self->forward ? self->queue->head_node : self->queue->tail_node;
1408
+ self->this_node = self->list->head_node;
1323
1409
  self->start = 0;
1324
1410
  } else {
1325
- self->this_node = self->forward ? self->this_node->next_node : self->this_node->prev_node;
1411
+ self->this_node = self->this_node ? self->this_node->next_node : NULL;
1326
1412
  }
1327
1413
  return self->this_node != NULL;
1328
1414
  }
1329
- ValueType ValueTypeQueueItGet(ValueTypeQueueIt* self) {
1330
- ValueType result;
1415
+ IntSet ListIntSetItGet(ListIntSetIt* self) {
1416
+ IntSet result;
1331
1417
  assert(self);
1332
1418
  assert(self->this_node);
1333
- ValueTypeCopy(result, self->this_node->element);
1419
+ _IntSetCopy(result,self->this_node->element);
1334
1420
  return result;
1335
1421
  }
1336
- ValueType* ValueTypeQueueItGetRef(ValueTypeQueueIt* self) {
1422
+ IntSet* ListIntSetItGetRef(ListIntSetIt* self) {
1337
1423
  assert(self);
1338
1424
  assert(self->this_node);
1339
1425
  return &self->this_node->element;
1340
1426
  }
1341
1427
 
1342
- ValueType* ValueTypeListItGetRef(ValueTypeListIt*);
1343
- void ValueTypeListCtor(ValueTypeList* self) {
1428
+ static void PIntVectorAllocate(PIntVector* self, size_t element_count) {
1344
1429
  assert(self);
1345
- self->head_node = NULL;
1346
- self->node_count = 0;
1430
+ assert(element_count > 0);
1431
+ self->element_count = element_count;
1432
+ self->values = (int**)malloc(element_count*sizeof(int*));
1433
+ assert(self->values);
1347
1434
  }
1348
- void ValueTypeListDtor(ValueTypeList* self) {
1349
- ValueTypeListNode* node;
1435
+ void PIntVectorCtor(PIntVector* self,size_t element_count) {
1436
+ size_t index;
1350
1437
  assert(self);
1351
- node = self->head_node;
1352
- while(node) {
1353
- ValueTypeListNode* this_node = node;
1354
- node = node->next_node;
1355
- ValueTypeDtor(this_node->element);
1356
- free(this_node);
1438
+ PIntVectorAllocate(self, element_count);
1439
+ for(index = 0; index < PIntVectorSize(self); ++index) {
1440
+ ((self->values[index]) = IntNew());
1357
1441
  }
1358
1442
  }
1359
- void ValueTypeListCopy(ValueTypeList* dst, ValueTypeList* src) {
1360
- ValueTypeListIt it;
1443
+ void PIntVectorDtor(PIntVector* self) {
1444
+ size_t index;
1445
+ assert(self);
1446
+ for(index = 0; index < PIntVectorSize(self); ++index) {
1447
+ IntFree(self->values[index]);
1448
+ }
1449
+ free(self->values);
1450
+ }
1451
+ void PIntVectorCopy(PIntVector* dst,PIntVector* src) {
1452
+ size_t index, size;
1361
1453
  assert(src);
1362
1454
  assert(dst);
1363
- ValueTypeListCtor(dst);
1364
- ValueTypeListItCtor(&it, src);
1365
- while(ValueTypeListItMove(&it)) {
1366
- ValueTypeListPush(dst, *ValueTypeListItGetRef(&it));
1455
+ PIntVectorAllocate(dst, size = PIntVectorSize(src));
1456
+ for(index = 0; index < size; ++index) {
1457
+ ((dst->values[index]) = IntRef(src->values[index]));
1367
1458
  }
1368
1459
  }
1369
- int ValueTypeListEqual(ValueTypeList* lt, ValueTypeList* rt) {
1370
- if(ValueTypeListSize(lt) == ValueTypeListSize(rt)) {
1371
- ValueTypeListIt lit, rit;
1372
- ValueTypeListItCtor(&lit, lt);
1373
- ValueTypeListItCtor(&rit, rt);
1374
- while(ValueTypeListItMove(&lit) && ValueTypeListItMove(&rit)) {
1375
- int equal;
1376
- ValueType *le, *re;
1377
- le = ValueTypeListItGetRef(&lit);
1378
- re = ValueTypeListItGetRef(&rit);
1379
- equal = ValueTypeEqual(*le, *re);
1380
- if(!equal) return 0;
1460
+ int PIntVectorEqual(PIntVector* lt,PIntVector* rt) {
1461
+ size_t index, size;
1462
+ assert(lt);
1463
+ assert(rt);
1464
+ if(PIntVectorSize(lt) == (size = PIntVectorSize(rt))) {
1465
+ for(index = 0; index < size; ++index) {
1466
+ if(!((*lt->values[index]) == (*rt->values[index]))) return 0;
1381
1467
  }
1382
1468
  return 1;
1383
1469
  } else
1384
1470
  return 0;
1385
1471
  }
1386
- size_t ValueTypeListIdentify(ValueTypeList* self) {
1387
- ValueTypeListNode* node;
1388
- size_t result = 0;
1472
+ size_t PIntVectorIdentify(PIntVector* self) {
1473
+ size_t index, result = 0;
1389
1474
  assert(self);
1390
- for(node = self->head_node; node != NULL; node = node->next_node) {
1391
- result ^= ValueTypeIdentify(node->element);
1475
+ for(index = 0; index < self->element_count; ++index) {
1476
+ result ^= ((size_t)(*self->values[index]));
1392
1477
  result = AUTOC_RCYCLE(result);
1393
1478
  }
1394
1479
  return result;
1395
1480
  }
1396
- void ValueTypeListPurge(ValueTypeList* self) {
1397
- ValueTypeListDtor(self);
1398
- ValueTypeListCtor(self);
1399
- }
1400
- ValueType ValueTypeListPeek(ValueTypeList* self) {
1401
- ValueType result;
1402
- assert(self);
1403
- assert(!ValueTypeListEmpty(self));
1404
- ValueTypeCopy(result, self->head_node->element);
1405
- return result;
1406
- }
1407
- ValueType ValueTypeListPop(ValueTypeList* self) {
1408
- ValueTypeListNode* node;
1409
- ValueType result;
1410
- assert(self);
1411
- assert(!ValueTypeListEmpty(self));
1412
- node = self->head_node;
1413
- result = node->element;
1414
- self->head_node = self->head_node->next_node;
1415
- --self->node_count;
1416
- free(node);
1417
- return result;
1418
- }
1419
- void ValueTypeListPush(ValueTypeList* self, ValueType element) {
1420
- ValueTypeListNode* node;
1421
- assert(self);
1422
- node = (ValueTypeListNode*)malloc(sizeof(ValueTypeListNode));
1423
- assert(node);
1424
- ValueTypeCopy(node->element, element);
1425
- node->next_node = self->head_node;
1426
- self->head_node = node;
1427
- ++self->node_count;
1428
- }
1429
- int ValueTypeListContains(ValueTypeList* self, ValueType what) {
1430
- ValueTypeListNode* node;
1431
- int found = 0;
1432
- assert(self);
1433
- node = self->head_node;
1434
- while(node) {
1435
- if(ValueTypeEqual(node->element, what)) {
1436
- found = 1;
1437
- break;
1438
- }
1439
- node = node->next_node;
1440
- }
1441
- return found;
1442
- }
1443
- ValueType ValueTypeListFind(ValueTypeList* self, ValueType what) {
1444
- ValueTypeListNode* node;
1445
- assert(self);
1446
- assert(ValueTypeListContains(self, what));
1447
- node = self->head_node;
1448
- while(node) {
1449
- if(ValueTypeEqual(node->element, what)) {
1450
- ValueType result;
1451
- ValueTypeCopy(result, node->element);
1452
- return result;
1453
- }
1454
- node = node->next_node;
1455
- }
1456
- abort();
1457
- }
1458
- int ValueTypeListReplaceEx(ValueTypeList* self, ValueType with, int count) {
1459
- ValueTypeListNode* node;
1460
- int replaced = 0;
1481
+ void PIntVectorResize(PIntVector* self, size_t new_element_count) {
1482
+ size_t index, element_count, from, to;
1461
1483
  assert(self);
1462
- if(count == 0) return 0;
1463
- node = self->head_node;
1464
- while(node) {
1465
- if(ValueTypeEqual(node->element, with)) {
1466
- ValueTypeDtor(node->element);
1467
- ValueTypeCopy(node->element, with);
1468
- ++replaced;
1469
- if(count > 0 && replaced >= count) break;
1484
+ if((element_count = PIntVectorSize(self)) != new_element_count) {
1485
+ int** values = (int**)malloc(new_element_count*sizeof(int*));
1486
+ assert(values);
1487
+ from = AUTOC_MIN(element_count, new_element_count);
1488
+ to = AUTOC_MAX(element_count, new_element_count);
1489
+ for(index = 0; index < from; ++index) {
1490
+ values[index] = self->values[index];
1470
1491
  }
1471
- node = node->next_node;
1472
- }
1473
- return replaced;
1474
- }
1475
- int ValueTypeListRemoveEx(ValueTypeList* self, ValueType what, int count) {
1476
- ValueTypeListNode *node, *prev_node;
1477
- int removed = 0;
1478
- assert(self);
1479
- if(count == 0) return 0;
1480
- node = self->head_node;
1481
- prev_node = NULL;
1482
- while(node) {
1483
- if(ValueTypeEqual(node->element, what)) {
1484
- ValueTypeListNode* this_node;
1485
- if(prev_node) {
1486
- this_node = prev_node->next_node = node->next_node;
1487
- } else {
1488
- this_node = self->head_node = node->next_node;
1492
+ if(element_count > new_element_count) {
1493
+ for(index = from; index < to; ++index) {
1494
+ IntFree(self->values[index]);
1489
1495
  }
1490
- ++removed;
1491
- --self->node_count;
1492
- ValueTypeDtor(node->element);
1493
- free(node);
1494
- node = this_node;
1495
- if(count > 0 && removed >= count) break;
1496
1496
  } else {
1497
- prev_node = node;
1498
- node = node->next_node;
1497
+ for(index = from; index < to; ++index) {
1498
+ ((values[index]) = IntNew());
1499
+ }
1499
1500
  }
1501
+ free(self->values);
1502
+ self->values = values;
1503
+ self->element_count = new_element_count;
1500
1504
  }
1501
- return removed;
1502
- }
1503
- size_t ValueTypeListSize(ValueTypeList* self) {
1504
- assert(self);
1505
- return self->node_count;
1506
- }
1507
- void ValueTypeListItCtor(ValueTypeListIt* self, ValueTypeList* list) {
1508
- assert(self);
1509
- assert(list);
1510
- self->start = 1;
1511
- self->list = list;
1512
1505
  }
1513
- int ValueTypeListItMove(ValueTypeListIt* self) {
1514
- assert(self);
1515
- if(self->start) {
1516
- self->this_node = self->list->head_node;
1517
- self->start = 0;
1506
+
1507
+ static int PIntVectorComparator(void* lp_, void* rp_) {
1508
+ int** lp = (int**)lp_;
1509
+ int** rp = (int**)rp_;
1510
+ if(((**lp) == (**rp))) {
1511
+ return 0;
1512
+ } else if(((**lp) < (**rp))) {
1513
+ return -1;
1518
1514
  } else {
1519
- self->this_node = self->this_node ? self->this_node->next_node : NULL;
1515
+ return +1;
1520
1516
  }
1521
- return self->this_node != NULL;
1522
- }
1523
- ValueType ValueTypeListItGet(ValueTypeListIt* self) {
1524
- ValueType result;
1525
- assert(self);
1526
- assert(self->this_node);
1527
- ValueTypeCopy(result, self->this_node->element);
1528
- return result;
1529
1517
  }
1530
- ValueType* ValueTypeListItGetRef(ValueTypeListIt* self) {
1518
+ void PIntVectorSort(PIntVector* self) {
1519
+ typedef int (*F)(const void*, const void*);
1531
1520
  assert(self);
1532
- assert(self->this_node);
1533
- return &self->this_node->element;
1521
+ qsort(self->values, PIntVectorSize(self), sizeof(int*), (F)PIntVectorComparator);
1534
1522
  }
1535
1523
 
1536
- AUTOC_STATIC void ValueTypeSetListCtor(ValueTypeSetList*);
1537
- AUTOC_STATIC void ValueTypeSetListDtor(ValueTypeSetList*);
1538
- AUTOC_STATIC void ValueTypeSetListCopy(ValueTypeSetList*, ValueTypeSetList*);
1539
- AUTOC_STATIC int ValueTypeSetListEqual(ValueTypeSetList*, ValueTypeSetList*);
1540
- AUTOC_STATIC size_t ValueTypeSetListIdentify(ValueTypeSetList*);
1541
- AUTOC_STATIC void ValueTypeSetListPurge(ValueTypeSetList*);
1542
- AUTOC_STATIC ValueType ValueTypeSetListPeek(ValueTypeSetList*);
1543
- AUTOC_STATIC ValueType ValueTypeSetListPop(ValueTypeSetList*);
1544
- AUTOC_STATIC void ValueTypeSetListPush(ValueTypeSetList*, ValueType);
1545
- AUTOC_STATIC int ValueTypeSetListContains(ValueTypeSetList*, ValueType);
1546
- AUTOC_STATIC ValueType ValueTypeSetListFind(ValueTypeSetList*, ValueType);
1547
- #define ValueTypeSetListReplace(self, with) ValueTypeSetListReplaceEx(self, with, 1)
1548
- #define ValueTypeSetListReplaceAll(self, with) ValueTypeSetListReplaceEx(self, with, -1)
1549
- AUTOC_STATIC int ValueTypeSetListReplaceEx(ValueTypeSetList*, ValueType, int);
1550
- #define ValueTypeSetListRemove(self, what) ValueTypeSetListRemoveEx(self, what, 1)
1551
- #define ValueTypeSetListRemoveAll(self, what) ValueTypeSetListRemoveEx(self, what, -1)
1552
- AUTOC_STATIC int ValueTypeSetListRemoveEx(ValueTypeSetList*, ValueType, int);
1553
- AUTOC_STATIC size_t ValueTypeSetListSize(ValueTypeSetList*);
1554
- #define ValueTypeSetListEmpty(self) (ValueTypeSetListSize(self) == 0)
1555
- AUTOC_STATIC void ValueTypeSetListItCtor(ValueTypeSetListIt*, ValueTypeSetList*);
1556
- AUTOC_STATIC int ValueTypeSetListItMove(ValueTypeSetListIt*);
1557
- AUTOC_STATIC ValueType ValueTypeSetListItGet(ValueTypeSetListIt*);
1524
+ #define AUTOC_VALID_VALUE 1
1525
+ #define AUTOC_VALID_KEY 2
1526
+ #define AUTOC_OWNED_VALUE 4
1527
+ #define AUTOC_OWNED_KEY 8
1528
+ static ValueTypeMapEntry ValueTypeMapEntryKeyOnlyRef(ValueType* key) {
1529
+ ValueTypeMapEntry entry;
1530
+ entry.key = *key;
1531
+ entry.flags = AUTOC_VALID_KEY;
1532
+ return entry;
1533
+ }
1534
+ static ValueTypeMapEntry ValueTypeMapEntryKeyValueRef(ValueType* key, ValueType* value) {
1535
+ ValueTypeMapEntry entry;
1536
+ entry.key = *key;
1537
+ entry.value = *value;
1538
+ entry.flags = (AUTOC_VALID_KEY | AUTOC_VALID_VALUE);
1539
+ return entry;
1540
+ }
1541
+ #define ValueTypeMapEntryIdentify(obj) ValueTypeMapEntryIdentifyRef(&obj)
1542
+ static size_t ValueTypeMapEntryIdentifyRef(ValueTypeMapEntry* entry) {
1543
+ return ValueTypeIdentify(entry->key);
1544
+ }
1545
+ #define ValueTypeMapEntryEqual(lt, rt) ValueTypeMapEntryEqualRef(&lt, &rt)
1546
+ static int ValueTypeMapEntryEqualRef(ValueTypeMapEntry* lt, ValueTypeMapEntry* rt) {
1547
+ return ValueTypeEqual(lt->key,rt->key);
1548
+ }
1549
+ #define ValueTypeMapEntryCopy(dst, src) ValueTypeMapEntryCopyRef(&dst, &src)
1550
+ static void ValueTypeMapEntryCopyRef(ValueTypeMapEntry* dst, ValueTypeMapEntry* src) {
1551
+ assert(src->flags & AUTOC_VALID_KEY);
1552
+ dst->flags = (AUTOC_VALID_KEY | AUTOC_OWNED_KEY);
1553
+ ValueTypeCopy(dst->key,src->key);
1554
+ if(src->flags & AUTOC_VALID_VALUE) {
1555
+ dst->flags |= (AUTOC_VALID_VALUE | AUTOC_OWNED_VALUE);
1556
+ ValueTypeCopy(dst->value,src->value);
1557
+ }
1558
+ }
1559
+ #define ValueTypeMapEntryDtor(obj) ValueTypeMapEntryDtorRef(&obj)
1560
+ static void ValueTypeMapEntryDtorRef(ValueTypeMapEntry* entry) {
1561
+ assert(entry->flags & AUTOC_VALID_KEY);
1562
+ if(entry->flags & AUTOC_OWNED_KEY) ValueTypeDtor(entry->key);
1563
+ if(entry->flags & AUTOC_VALID_VALUE && entry->flags & AUTOC_OWNED_VALUE) ValueTypeDtor(entry->value);
1564
+ }
1565
+ static ValueTypeMapEntry* ValueTypeMapItGetEntryRef(ValueTypeMapIt*);
1566
+ static int ValueTypeMapContainsAllOf(ValueTypeMap* self, ValueTypeMap* other) {
1567
+ ValueTypeMapIt it;
1568
+ ValueTypeMapItCtor(&it, self);
1569
+ while(ValueTypeMapItMove(&it)) {
1570
+ int found = 0;
1571
+ ValueTypeMapEntry* e = ValueTypeMapItGetEntryRef(&it);
1572
+ if(ValueTypeMapContainsKey(other, e->key)) {
1573
+ ValueType other_value = ValueTypeMapGet(other, e->key);
1574
+ found = ValueTypeEqual(e->value,other_value);
1575
+ ValueTypeDtor(other_value);
1576
+ }
1577
+ if(!found) return 0;
1578
+ }
1579
+ return 1;
1580
+ }
1558
1581
 
1559
- AUTOC_STATIC ValueType* ValueTypeSetListItGetRef(ValueTypeSetListIt*);
1560
- AUTOC_STATIC void ValueTypeSetListCtor(ValueTypeSetList* self) {
1582
+ #define _ValueTypeMapSetCtor(self) ValueTypeMapSetCtor(&self)
1583
+ #define _ValueTypeMapSetDtor(self) ValueTypeMapSetDtor(&self)
1584
+ #define _ValueTypeMapSetIdentify(self) ValueTypeMapSetIdentify(&self)
1585
+ #define _ValueTypeMapSetCopy(dst,src) ValueTypeMapSetCopy(&dst,&src)
1586
+ #define _ValueTypeMapSetEqual(lt,rt) ValueTypeMapSetEqual(&lt,&rt)
1587
+ #define _ValueTypeMapSetLess(lt,rt) ValueTypeMapSetLess(&lt,&rt)
1588
+
1589
+ AUTOC_STATIC void ValueTypeMapSetCtor(ValueTypeMapSet*);
1590
+ AUTOC_STATIC void ValueTypeMapSetDtor(ValueTypeMapSet*);
1591
+ AUTOC_STATIC void ValueTypeMapSetCopy(ValueTypeMapSet*,ValueTypeMapSet*);
1592
+ AUTOC_STATIC int ValueTypeMapSetEqual(ValueTypeMapSet*,ValueTypeMapSet*);
1593
+ AUTOC_STATIC size_t ValueTypeMapSetIdentify(ValueTypeMapSet*);
1594
+ AUTOC_STATIC void ValueTypeMapSetPurge(ValueTypeMapSet*);
1595
+ AUTOC_STATIC int ValueTypeMapSetContains(ValueTypeMapSet*, ValueTypeMapEntry);
1596
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetGet(ValueTypeMapSet*, ValueTypeMapEntry);
1597
+ AUTOC_STATIC size_t ValueTypeMapSetSize(ValueTypeMapSet*);
1598
+ #define ValueTypeMapSetEmpty(self) (ValueTypeMapSetSize(self) == 0)
1599
+ AUTOC_STATIC int ValueTypeMapSetPut(ValueTypeMapSet*, ValueTypeMapEntry);
1600
+ AUTOC_STATIC int ValueTypeMapSetReplace(ValueTypeMapSet*, ValueTypeMapEntry);
1601
+ AUTOC_STATIC int ValueTypeMapSetRemove(ValueTypeMapSet*, ValueTypeMapEntry);
1602
+ AUTOC_STATIC void ValueTypeMapSetExclude(ValueTypeMapSet*, ValueTypeMapSet*);
1603
+ AUTOC_STATIC void ValueTypeMapSetRetain(ValueTypeMapSet*, ValueTypeMapSet*);
1604
+ AUTOC_STATIC void ValueTypeMapSetInclude(ValueTypeMapSet*, ValueTypeMapSet*);
1605
+ AUTOC_STATIC void ValueTypeMapSetInvert(ValueTypeMapSet*, ValueTypeMapSet*);
1606
+ AUTOC_STATIC void ValueTypeMapSetItCtor(ValueTypeMapSetIt*, ValueTypeMapSet*);
1607
+ AUTOC_STATIC int ValueTypeMapSetItMove(ValueTypeMapSetIt*);
1608
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetItGet(ValueTypeMapSetIt*);
1609
+
1610
+ #define _ValueTypeMapSetListCtor(self) ValueTypeMapSetListCtor(&self)
1611
+ #define _ValueTypeMapSetListDtor(self) ValueTypeMapSetListDtor(&self)
1612
+ #define _ValueTypeMapSetListIdentify(self) ValueTypeMapSetListIdentify(&self)
1613
+ #define _ValueTypeMapSetListCopy(dst,src) ValueTypeMapSetListCopy(&dst,&src)
1614
+ #define _ValueTypeMapSetListEqual(lt,rt) ValueTypeMapSetListEqual(&lt,&rt)
1615
+ #define _ValueTypeMapSetListLess(lt,rt) ValueTypeMapSetListLess(&lt,&rt)
1616
+
1617
+ AUTOC_STATIC void ValueTypeMapSetListCtor(ValueTypeMapSetList*);
1618
+ AUTOC_STATIC void ValueTypeMapSetListDtor(ValueTypeMapSetList*);
1619
+ AUTOC_STATIC void ValueTypeMapSetListCopy(ValueTypeMapSetList*,ValueTypeMapSetList*);
1620
+ AUTOC_STATIC int ValueTypeMapSetListEqual(ValueTypeMapSetList*,ValueTypeMapSetList*);
1621
+ AUTOC_STATIC size_t ValueTypeMapSetListIdentify(ValueTypeMapSetList*);
1622
+ AUTOC_STATIC void ValueTypeMapSetListPurge(ValueTypeMapSetList*);
1623
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPeek(ValueTypeMapSetList*);
1624
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPop(ValueTypeMapSetList*);
1625
+ AUTOC_STATIC void ValueTypeMapSetListPush(ValueTypeMapSetList*, ValueTypeMapEntry);
1626
+ AUTOC_STATIC int ValueTypeMapSetListContains(ValueTypeMapSetList*, ValueTypeMapEntry);
1627
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListFind(ValueTypeMapSetList*, ValueTypeMapEntry);
1628
+ #define ValueTypeMapSetListReplace(self, with) ValueTypeMapSetListReplaceEx(self, with, 1)
1629
+ #define ValueTypeMapSetListReplaceAll(self, with) ValueTypeMapSetListReplaceEx(self, with, -1)
1630
+ AUTOC_STATIC int ValueTypeMapSetListReplaceEx(ValueTypeMapSetList*, ValueTypeMapEntry, int);
1631
+ #define ValueTypeMapSetListRemove(self, what) ValueTypeMapSetListRemoveEx(self, what, 1)
1632
+ #define ValueTypeMapSetListRemoveAll(self, what) ValueTypeMapSetListRemoveEx(self, what, -1)
1633
+ AUTOC_STATIC int ValueTypeMapSetListRemoveEx(ValueTypeMapSetList*, ValueTypeMapEntry, int);
1634
+ AUTOC_STATIC size_t ValueTypeMapSetListSize(ValueTypeMapSetList*);
1635
+ #define ValueTypeMapSetListEmpty(self) (ValueTypeMapSetListSize(self) == 0)
1636
+ AUTOC_STATIC void ValueTypeMapSetListItCtor(ValueTypeMapSetListIt*, ValueTypeMapSetList*);
1637
+ AUTOC_STATIC int ValueTypeMapSetListItMove(ValueTypeMapSetListIt*);
1638
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListItGet(ValueTypeMapSetListIt*);
1639
+
1640
+ AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetListItGetRef(ValueTypeMapSetListIt*);
1641
+ AUTOC_STATIC void ValueTypeMapSetListCtor(ValueTypeMapSetList* self) {
1561
1642
  assert(self);
1562
1643
  self->head_node = NULL;
1563
1644
  self->node_count = 0;
1564
1645
  }
1565
- AUTOC_STATIC void ValueTypeSetListDtor(ValueTypeSetList* self) {
1566
- ValueTypeSetListNode* node;
1646
+ AUTOC_STATIC void ValueTypeMapSetListDtor(ValueTypeMapSetList* self) {
1647
+ ValueTypeMapSetListNode* node;
1567
1648
  assert(self);
1568
1649
  node = self->head_node;
1569
1650
  while(node) {
1570
- ValueTypeSetListNode* this_node = node;
1651
+ ValueTypeMapSetListNode* this_node = node;
1571
1652
  node = node->next_node;
1572
- ValueTypeDtor(this_node->element);
1653
+ ValueTypeMapEntryDtor(this_node->element);
1573
1654
  free(this_node);
1574
1655
  }
1575
1656
  }
1576
- AUTOC_STATIC void ValueTypeSetListCopy(ValueTypeSetList* dst, ValueTypeSetList* src) {
1577
- ValueTypeSetListIt it;
1657
+ AUTOC_STATIC void ValueTypeMapSetListCopy(ValueTypeMapSetList* dst,ValueTypeMapSetList* src) {
1658
+ ValueTypeMapSetListIt it;
1578
1659
  assert(src);
1579
1660
  assert(dst);
1580
- ValueTypeSetListCtor(dst);
1581
- ValueTypeSetListItCtor(&it, src);
1582
- while(ValueTypeSetListItMove(&it)) {
1583
- ValueTypeSetListPush(dst, *ValueTypeSetListItGetRef(&it));
1661
+ ValueTypeMapSetListCtor(dst);
1662
+ ValueTypeMapSetListItCtor(&it, src);
1663
+ while(ValueTypeMapSetListItMove(&it)) {
1664
+ ValueTypeMapSetListPush(dst, *ValueTypeMapSetListItGetRef(&it));
1584
1665
  }
1585
1666
  }
1586
- AUTOC_STATIC int ValueTypeSetListEqual(ValueTypeSetList* lt, ValueTypeSetList* rt) {
1587
- if(ValueTypeSetListSize(lt) == ValueTypeSetListSize(rt)) {
1588
- ValueTypeSetListIt lit, rit;
1589
- ValueTypeSetListItCtor(&lit, lt);
1590
- ValueTypeSetListItCtor(&rit, rt);
1591
- while(ValueTypeSetListItMove(&lit) && ValueTypeSetListItMove(&rit)) {
1667
+ AUTOC_STATIC int ValueTypeMapSetListEqual(ValueTypeMapSetList* lt,ValueTypeMapSetList* rt) {
1668
+ if(ValueTypeMapSetListSize(lt) == ValueTypeMapSetListSize(rt)) {
1669
+ ValueTypeMapSetListIt lit, rit;
1670
+ ValueTypeMapSetListItCtor(&lit, lt);
1671
+ ValueTypeMapSetListItCtor(&rit, rt);
1672
+ while(ValueTypeMapSetListItMove(&lit) && ValueTypeMapSetListItMove(&rit)) {
1592
1673
  int equal;
1593
- ValueType *le, *re;
1594
- le = ValueTypeSetListItGetRef(&lit);
1595
- re = ValueTypeSetListItGetRef(&rit);
1596
- equal = ValueTypeEqual(*le, *re);
1674
+ ValueTypeMapEntry* le;
1675
+ ValueTypeMapEntry* re;
1676
+ le = ValueTypeMapSetListItGetRef(&lit);
1677
+ re = ValueTypeMapSetListItGetRef(&rit);
1678
+ equal = ValueTypeMapEntryEqual(*le,*re);
1597
1679
  if(!equal) return 0;
1598
1680
  }
1599
1681
  return 1;
1600
1682
  } else
1601
1683
  return 0;
1602
1684
  }
1603
- AUTOC_STATIC size_t ValueTypeSetListIdentify(ValueTypeSetList* self) {
1604
- ValueTypeSetListNode* node;
1685
+ AUTOC_STATIC size_t ValueTypeMapSetListIdentify(ValueTypeMapSetList* self) {
1686
+ ValueTypeMapSetListNode* node;
1605
1687
  size_t result = 0;
1606
1688
  assert(self);
1607
1689
  for(node = self->head_node; node != NULL; node = node->next_node) {
1608
- result ^= ValueTypeIdentify(node->element);
1690
+ result ^= ValueTypeMapEntryIdentify(node->element);
1609
1691
  result = AUTOC_RCYCLE(result);
1610
1692
  }
1611
1693
  return result;
1612
1694
  }
1613
- AUTOC_STATIC void ValueTypeSetListPurge(ValueTypeSetList* self) {
1614
- ValueTypeSetListDtor(self);
1615
- ValueTypeSetListCtor(self);
1695
+ AUTOC_STATIC void ValueTypeMapSetListPurge(ValueTypeMapSetList* self) {
1696
+ ValueTypeMapSetListDtor(self);
1697
+ ValueTypeMapSetListCtor(self);
1616
1698
  }
1617
- AUTOC_STATIC ValueType ValueTypeSetListPeek(ValueTypeSetList* self) {
1618
- ValueType result;
1699
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPeek(ValueTypeMapSetList* self) {
1700
+ ValueTypeMapEntry result;
1619
1701
  assert(self);
1620
- assert(!ValueTypeSetListEmpty(self));
1621
- ValueTypeCopy(result, self->head_node->element);
1702
+ assert(!ValueTypeMapSetListEmpty(self));
1703
+ ValueTypeMapEntryCopy(result,self->head_node->element);
1622
1704
  return result;
1623
1705
  }
1624
- AUTOC_STATIC ValueType ValueTypeSetListPop(ValueTypeSetList* self) {
1625
- ValueTypeSetListNode* node;
1626
- ValueType result;
1706
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPop(ValueTypeMapSetList* self) {
1707
+ ValueTypeMapSetListNode* node;
1708
+ ValueTypeMapEntry result;
1627
1709
  assert(self);
1628
- assert(!ValueTypeSetListEmpty(self));
1710
+ assert(!ValueTypeMapSetListEmpty(self));
1629
1711
  node = self->head_node;
1630
1712
  result = node->element;
1631
1713
  self->head_node = self->head_node->next_node;
@@ -1633,23 +1715,23 @@ AUTOC_STATIC ValueType ValueTypeSetListPop(ValueTypeSetList* self) {
1633
1715
  free(node);
1634
1716
  return result;
1635
1717
  }
1636
- AUTOC_STATIC void ValueTypeSetListPush(ValueTypeSetList* self, ValueType element) {
1637
- ValueTypeSetListNode* node;
1718
+ AUTOC_STATIC void ValueTypeMapSetListPush(ValueTypeMapSetList* self, ValueTypeMapEntry element) {
1719
+ ValueTypeMapSetListNode* node;
1638
1720
  assert(self);
1639
- node = (ValueTypeSetListNode*)malloc(sizeof(ValueTypeSetListNode));
1721
+ node = (ValueTypeMapSetListNode*)malloc(sizeof(ValueTypeMapSetListNode));
1640
1722
  assert(node);
1641
- ValueTypeCopy(node->element, element);
1723
+ ValueTypeMapEntryCopy(node->element,element);
1642
1724
  node->next_node = self->head_node;
1643
1725
  self->head_node = node;
1644
1726
  ++self->node_count;
1645
1727
  }
1646
- AUTOC_STATIC int ValueTypeSetListContains(ValueTypeSetList* self, ValueType what) {
1647
- ValueTypeSetListNode* node;
1728
+ AUTOC_STATIC int ValueTypeMapSetListContains(ValueTypeMapSetList* self, ValueTypeMapEntry what) {
1729
+ ValueTypeMapSetListNode* node;
1648
1730
  int found = 0;
1649
1731
  assert(self);
1650
1732
  node = self->head_node;
1651
1733
  while(node) {
1652
- if(ValueTypeEqual(node->element, what)) {
1734
+ if(ValueTypeMapEntryEqual(node->element,what)) {
1653
1735
  found = 1;
1654
1736
  break;
1655
1737
  }
@@ -1657,31 +1739,31 @@ AUTOC_STATIC int ValueTypeSetListContains(ValueTypeSetList* self, ValueType what
1657
1739
  }
1658
1740
  return found;
1659
1741
  }
1660
- AUTOC_STATIC ValueType ValueTypeSetListFind(ValueTypeSetList* self, ValueType what) {
1661
- ValueTypeSetListNode* node;
1742
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListFind(ValueTypeMapSetList* self, ValueTypeMapEntry what) {
1743
+ ValueTypeMapSetListNode* node;
1662
1744
  assert(self);
1663
- assert(ValueTypeSetListContains(self, what));
1745
+ assert(ValueTypeMapSetListContains(self, what));
1664
1746
  node = self->head_node;
1665
1747
  while(node) {
1666
- if(ValueTypeEqual(node->element, what)) {
1667
- ValueType result;
1668
- ValueTypeCopy(result, node->element);
1748
+ if(ValueTypeMapEntryEqual(node->element,what)) {
1749
+ ValueTypeMapEntry result;
1750
+ ValueTypeMapEntryCopy(result,node->element);
1669
1751
  return result;
1670
1752
  }
1671
1753
  node = node->next_node;
1672
1754
  }
1673
1755
  abort();
1674
1756
  }
1675
- AUTOC_STATIC int ValueTypeSetListReplaceEx(ValueTypeSetList* self, ValueType with, int count) {
1676
- ValueTypeSetListNode* node;
1757
+ AUTOC_STATIC int ValueTypeMapSetListReplaceEx(ValueTypeMapSetList* self, ValueTypeMapEntry with, int count) {
1758
+ ValueTypeMapSetListNode* node;
1677
1759
  int replaced = 0;
1678
1760
  assert(self);
1679
1761
  if(count == 0) return 0;
1680
1762
  node = self->head_node;
1681
1763
  while(node) {
1682
- if(ValueTypeEqual(node->element, with)) {
1683
- ValueTypeDtor(node->element);
1684
- ValueTypeCopy(node->element, with);
1764
+ if(ValueTypeMapEntryEqual(node->element,with)) {
1765
+ ValueTypeMapEntryDtor(node->element);
1766
+ ValueTypeMapEntryCopy(node->element,with);
1685
1767
  ++replaced;
1686
1768
  if(count > 0 && replaced >= count) break;
1687
1769
  }
@@ -1689,16 +1771,16 @@ AUTOC_STATIC int ValueTypeSetListReplaceEx(ValueTypeSetList* self, ValueType wit
1689
1771
  }
1690
1772
  return replaced;
1691
1773
  }
1692
- AUTOC_STATIC int ValueTypeSetListRemoveEx(ValueTypeSetList* self, ValueType what, int count) {
1693
- ValueTypeSetListNode *node, *prev_node;
1774
+ AUTOC_STATIC int ValueTypeMapSetListRemoveEx(ValueTypeMapSetList* self, ValueTypeMapEntry what, int count) {
1775
+ ValueTypeMapSetListNode *node, *prev_node;
1694
1776
  int removed = 0;
1695
1777
  assert(self);
1696
1778
  if(count == 0) return 0;
1697
1779
  node = self->head_node;
1698
1780
  prev_node = NULL;
1699
1781
  while(node) {
1700
- if(ValueTypeEqual(node->element, what)) {
1701
- ValueTypeSetListNode* this_node;
1782
+ if(ValueTypeMapEntryEqual(node->element,what)) {
1783
+ ValueTypeMapSetListNode* this_node;
1702
1784
  if(prev_node) {
1703
1785
  this_node = prev_node->next_node = node->next_node;
1704
1786
  } else {
@@ -1706,7 +1788,7 @@ AUTOC_STATIC int ValueTypeSetListRemoveEx(ValueTypeSetList* self, ValueType what
1706
1788
  }
1707
1789
  ++removed;
1708
1790
  --self->node_count;
1709
- ValueTypeDtor(node->element);
1791
+ ValueTypeMapEntryDtor(node->element);
1710
1792
  free(node);
1711
1793
  node = this_node;
1712
1794
  if(count > 0 && removed >= count) break;
@@ -1717,17 +1799,17 @@ AUTOC_STATIC int ValueTypeSetListRemoveEx(ValueTypeSetList* self, ValueType what
1717
1799
  }
1718
1800
  return removed;
1719
1801
  }
1720
- AUTOC_STATIC size_t ValueTypeSetListSize(ValueTypeSetList* self) {
1802
+ AUTOC_STATIC size_t ValueTypeMapSetListSize(ValueTypeMapSetList* self) {
1721
1803
  assert(self);
1722
1804
  return self->node_count;
1723
1805
  }
1724
- AUTOC_STATIC void ValueTypeSetListItCtor(ValueTypeSetListIt* self, ValueTypeSetList* list) {
1806
+ AUTOC_STATIC void ValueTypeMapSetListItCtor(ValueTypeMapSetListIt* self, ValueTypeMapSetList* list) {
1725
1807
  assert(self);
1726
1808
  assert(list);
1727
1809
  self->start = 1;
1728
1810
  self->list = list;
1729
1811
  }
1730
- AUTOC_STATIC int ValueTypeSetListItMove(ValueTypeSetListIt* self) {
1812
+ AUTOC_STATIC int ValueTypeMapSetListItMove(ValueTypeMapSetListIt* self) {
1731
1813
  assert(self);
1732
1814
  if(self->start) {
1733
1815
  self->this_node = self->list->head_node;
@@ -1737,22 +1819,22 @@ AUTOC_STATIC int ValueTypeSetListItMove(ValueTypeSetListIt* self) {
1737
1819
  }
1738
1820
  return self->this_node != NULL;
1739
1821
  }
1740
- AUTOC_STATIC ValueType ValueTypeSetListItGet(ValueTypeSetListIt* self) {
1741
- ValueType result;
1822
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListItGet(ValueTypeMapSetListIt* self) {
1823
+ ValueTypeMapEntry result;
1742
1824
  assert(self);
1743
1825
  assert(self->this_node);
1744
- ValueTypeCopy(result, self->this_node->element);
1826
+ ValueTypeMapEntryCopy(result,self->this_node->element);
1745
1827
  return result;
1746
1828
  }
1747
- AUTOC_STATIC ValueType* ValueTypeSetListItGetRef(ValueTypeSetListIt* self) {
1829
+ AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetListItGetRef(ValueTypeMapSetListIt* self) {
1748
1830
  assert(self);
1749
1831
  assert(self->this_node);
1750
1832
  return &self->this_node->element;
1751
1833
  }
1752
1834
 
1753
- ValueType* ValueTypeSetItGetRef(ValueTypeSetIt*);
1754
- static void ValueTypeSetRehash(ValueTypeSet* self) {
1755
- ValueTypeSetList* buckets;
1835
+ AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetItGetRef(ValueTypeMapSetIt*);
1836
+ static void ValueTypeMapSetRehash(ValueTypeMapSet* self) {
1837
+ ValueTypeMapSetList* buckets;
1756
1838
  size_t index, bucket_count, size, fill;
1757
1839
  assert(self);
1758
1840
  assert(self->min_fill > 0);
@@ -1776,358 +1858,428 @@ static void ValueTypeSetRehash(ValueTypeSet* self) {
1776
1858
  bucket_count = self->min_bucket_count;
1777
1859
  size = 0;
1778
1860
  }
1779
- buckets = (ValueTypeSetList*)malloc(bucket_count*sizeof(ValueTypeSetList));
1861
+ buckets = (ValueTypeMapSetList*)malloc(bucket_count*sizeof(ValueTypeMapSetList));
1780
1862
  assert(buckets);
1781
1863
  for(index = 0; index < bucket_count; ++index) {
1782
- ValueTypeSetListCtor(&buckets[index]);
1864
+ ValueTypeMapSetListCtor(&buckets[index]);
1783
1865
  }
1784
1866
  if(self->buckets) {
1785
- ValueTypeSetIt it;
1786
- ValueTypeSetItCtor(&it, self);
1787
- while(ValueTypeSetItMove(&it)) {
1788
- ValueTypeSetList* bucket;
1789
- ValueType element = ValueTypeSetItGet(&it);
1790
- bucket = &buckets[ValueTypeIdentify(element) % bucket_count];
1791
- ValueTypeSetListPush(bucket, element);
1792
- ValueTypeDtor(element);
1867
+ ValueTypeMapSetIt it;
1868
+ ValueTypeMapSetItCtor(&it, self);
1869
+ while(ValueTypeMapSetItMove(&it)) {
1870
+ ValueTypeMapSetList* bucket;
1871
+ ValueTypeMapEntry element = ValueTypeMapSetItGet(&it);
1872
+ bucket = &buckets[ValueTypeMapEntryIdentify(element) % bucket_count];
1873
+ ValueTypeMapSetListPush(bucket, element);
1874
+ ValueTypeMapEntryDtor(element);
1793
1875
  }
1794
- ValueTypeSetDtor(self);
1876
+ ValueTypeMapSetDtor(self);
1795
1877
  }
1796
1878
  self->buckets = buckets;
1797
1879
  self->bucket_count = bucket_count;
1798
1880
  self->size = size;
1799
1881
  }
1800
- void ValueTypeSetCtor(ValueTypeSet* self) {
1801
- assert(self);
1802
- self->min_bucket_count = 16;
1803
- self->min_fill = 20;
1804
- self->max_fill = 80;
1805
- self->min_size = (size_t)((float)self->min_fill/100*self->min_bucket_count);
1806
- self->max_size = (size_t)((float)self->max_fill/100*self->min_bucket_count);
1807
- self->capacity_multiplier = 200;
1808
- self->buckets = NULL;
1809
- ValueTypeSetRehash(self);
1882
+ static int ValueTypeMapSetContainsAllOf(ValueTypeMapSet* self, ValueTypeMapSet* other) {
1883
+ ValueTypeMapSetIt it;
1884
+ ValueTypeMapSetItCtor(&it, self);
1885
+ while(ValueTypeMapSetItMove(&it)) {
1886
+ int found = 0;
1887
+ if(ValueTypeMapSetContains(other, *ValueTypeMapSetItGetRef(&it))) found = 1;
1888
+ if(!found) return 0;
1889
+ }
1890
+ return 1;
1810
1891
  }
1811
- void ValueTypeSetDtor(ValueTypeSet* self) {
1892
+ AUTOC_STATIC void ValueTypeMapSetCtor(ValueTypeMapSet* self) {
1893
+ assert(self);
1894
+ self->min_bucket_count = 16;
1895
+ self->min_fill = 20;
1896
+ self->max_fill = 80;
1897
+ self->min_size = (size_t)((float)self->min_fill/100*self->min_bucket_count);
1898
+ self->max_size = (size_t)((float)self->max_fill/100*self->min_bucket_count);
1899
+ self->capacity_multiplier = 200;
1900
+ self->buckets = NULL;
1901
+ ValueTypeMapSetRehash(self);
1902
+ }
1903
+ AUTOC_STATIC void ValueTypeMapSetDtor(ValueTypeMapSet* self) {
1812
1904
  size_t i;
1813
1905
  assert(self);
1814
1906
  for(i = 0; i < self->bucket_count; ++i) {
1815
- ValueTypeSetListDtor(&self->buckets[i]);
1907
+ ValueTypeMapSetListDtor(&self->buckets[i]);
1816
1908
  }
1817
1909
  free(self->buckets);
1818
1910
  }
1819
- void ValueTypeSetCopy(ValueTypeSet* dst, ValueTypeSet* src) {
1820
- ValueTypeSetIt it;
1911
+ AUTOC_STATIC void ValueTypeMapSetCopy(ValueTypeMapSet* dst,ValueTypeMapSet* src) {
1912
+ ValueTypeMapSetIt it;
1821
1913
  assert(src);
1822
1914
  assert(dst);
1823
- ValueTypeSetCtor(dst);
1824
- ValueTypeSetItCtor(&it, src);
1825
- while(ValueTypeSetItMove(&it)) ValueTypeSetPut(dst, *ValueTypeSetItGetRef(&it));
1826
- }
1827
- static int ValueTypeSetContainsAllOf(ValueTypeSet* self, ValueTypeSet* other) {
1828
- ValueTypeSetIt it;
1829
- ValueTypeSetItCtor(&it, self);
1830
- while(ValueTypeSetItMove(&it)) {
1831
- int found = 0;
1832
- if(ValueTypeSetContains(other, *ValueTypeSetItGetRef(&it))) found = 1;
1833
- if(!found) return 0;
1834
- }
1835
- return 1;
1915
+ ValueTypeMapSetCtor(dst);
1916
+ ValueTypeMapSetItCtor(&it, src);
1917
+ while(ValueTypeMapSetItMove(&it)) ValueTypeMapSetPut(dst, *ValueTypeMapSetItGetRef(&it));
1836
1918
  }
1837
- int ValueTypeSetEqual(ValueTypeSet* lt, ValueTypeSet* rt) {
1919
+ AUTOC_STATIC int ValueTypeMapSetEqual(ValueTypeMapSet* lt,ValueTypeMapSet* rt) {
1838
1920
  assert(lt);
1839
1921
  assert(rt);
1840
- return ValueTypeSetSize(lt) == ValueTypeSetSize(rt) && ValueTypeSetContainsAllOf(lt, rt) && ValueTypeSetContainsAllOf(rt, lt);
1922
+ return ValueTypeMapSetSize(lt) == ValueTypeMapSetSize(rt) && ValueTypeMapSetContainsAllOf(lt, rt) && ValueTypeMapSetContainsAllOf(rt, lt);
1841
1923
  }
1842
- size_t ValueTypeSetIdentify(ValueTypeSet* self) {
1843
- ValueTypeSetIt it;
1924
+ AUTOC_STATIC size_t ValueTypeMapSetIdentify(ValueTypeMapSet* self) {
1925
+ ValueTypeMapSetIt it;
1844
1926
  size_t result = 0;
1845
1927
  assert(self);
1846
- ValueTypeSetItCtor(&it, self);
1847
- while(ValueTypeSetItMove(&it)) {
1848
- ValueType* e = ValueTypeSetItGetRef(&it);
1849
- result ^= ValueTypeIdentify(*e);
1928
+ ValueTypeMapSetItCtor(&it, self);
1929
+ while(ValueTypeMapSetItMove(&it)) {
1930
+ ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
1931
+ result ^= ValueTypeMapEntryIdentify(*e);
1850
1932
  result = AUTOC_RCYCLE(result);
1851
1933
  }
1852
1934
  return result;
1853
1935
  }
1854
- void ValueTypeSetPurge(ValueTypeSet* self) {
1936
+ AUTOC_STATIC void ValueTypeMapSetPurge(ValueTypeMapSet* self) {
1855
1937
  assert(self);
1856
- ValueTypeSetDtor(self);
1938
+ ValueTypeMapSetDtor(self);
1857
1939
  self->buckets = NULL;
1858
- ValueTypeSetRehash(self);
1940
+ ValueTypeMapSetRehash(self);
1859
1941
  }
1860
- int ValueTypeSetContains(ValueTypeSet* self, ValueType element) {
1942
+ AUTOC_STATIC int ValueTypeMapSetContains(ValueTypeMapSet* self, ValueTypeMapEntry element) {
1861
1943
  assert(self);
1862
- return ValueTypeSetListContains(&self->buckets[ValueTypeIdentify(element) % self->bucket_count], element);
1944
+ return ValueTypeMapSetListContains(&self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count], element);
1863
1945
  }
1864
- ValueType ValueTypeSetGet(ValueTypeSet* self, ValueType element) {
1865
- ValueType result;
1946
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetGet(ValueTypeMapSet* self, ValueTypeMapEntry element) {
1947
+ ValueTypeMapEntry result;
1866
1948
  assert(self);
1867
- assert(ValueTypeSetContains(self, element));
1868
- result = ValueTypeSetListFind(&self->buckets[ValueTypeIdentify(element) % self->bucket_count], element);
1949
+ assert(ValueTypeMapSetContains(self, element));
1950
+ result = ValueTypeMapSetListFind(&self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count], element);
1869
1951
  return result;
1870
1952
  }
1871
- size_t ValueTypeSetSize(ValueTypeSet* self) {
1953
+ AUTOC_STATIC size_t ValueTypeMapSetSize(ValueTypeMapSet* self) {
1872
1954
  assert(self);
1873
1955
  return self->size;
1874
1956
  }
1875
- int ValueTypeSetPut(ValueTypeSet* self, ValueType element) {
1876
- ValueTypeSetList* bucket;
1957
+ AUTOC_STATIC int ValueTypeMapSetPut(ValueTypeMapSet* self, ValueTypeMapEntry element) {
1958
+ ValueTypeMapSetList* bucket;
1877
1959
  assert(self);
1878
- bucket = &self->buckets[ValueTypeIdentify(element) % self->bucket_count];
1879
- if(!ValueTypeSetListContains(bucket, element)) {
1880
- ValueTypeSetListPush(bucket, element);
1960
+ bucket = &self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count];
1961
+ if(!ValueTypeMapSetListContains(bucket, element)) {
1962
+ ValueTypeMapSetListPush(bucket, element);
1881
1963
  ++self->size;
1882
- ValueTypeSetRehash(self);
1964
+ ValueTypeMapSetRehash(self);
1883
1965
  return 1;
1884
1966
  }
1885
1967
  return 0;
1886
1968
  }
1887
- int ValueTypeSetReplace(ValueTypeSet* self, ValueType element) {
1888
- ValueTypeSetList* bucket;
1969
+ AUTOC_STATIC int ValueTypeMapSetReplace(ValueTypeMapSet* self, ValueTypeMapEntry element) {
1970
+ ValueTypeMapSetList* bucket;
1889
1971
  assert(self);
1890
- bucket = &self->buckets[ValueTypeIdentify(element) % self->bucket_count];
1891
- return ValueTypeSetListReplace(bucket, element);
1972
+ bucket = &self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count];
1973
+ return ValueTypeMapSetListReplace(bucket, element);
1892
1974
  }
1893
- int ValueTypeSetRemove(ValueTypeSet* self, ValueType element) {
1894
- ValueTypeSetList* bucket;
1975
+ AUTOC_STATIC int ValueTypeMapSetRemove(ValueTypeMapSet* self, ValueTypeMapEntry element) {
1976
+ ValueTypeMapSetList* bucket;
1895
1977
  assert(self);
1896
- bucket = &self->buckets[ValueTypeIdentify(element) % self->bucket_count];
1897
- if(ValueTypeSetListRemove(bucket, element)) {
1978
+ bucket = &self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count];
1979
+ if(ValueTypeMapSetListRemove(bucket, element)) {
1898
1980
  --self->size;
1899
- ValueTypeSetRehash(self);
1981
+ ValueTypeMapSetRehash(self);
1900
1982
  return 1;
1901
1983
  }
1902
1984
  return 0;
1903
1985
  }
1904
- void ValueTypeSetExclude(ValueTypeSet* self, ValueTypeSet* other) {
1905
- ValueTypeSetIt it;
1986
+ AUTOC_STATIC void ValueTypeMapSetExclude(ValueTypeMapSet* self, ValueTypeMapSet* other) {
1987
+ ValueTypeMapSetIt it;
1906
1988
  assert(self);
1907
1989
  assert(other);
1908
- ValueTypeSetItCtor(&it, other);
1909
- while(ValueTypeSetItMove(&it)) ValueTypeSetRemove(self, *ValueTypeSetItGetRef(&it));
1990
+ ValueTypeMapSetItCtor(&it, other);
1991
+ while(ValueTypeMapSetItMove(&it)) ValueTypeMapSetRemove(self, *ValueTypeMapSetItGetRef(&it));
1910
1992
  }
1911
- void ValueTypeSetInclude(ValueTypeSet* self, ValueTypeSet* other) {
1912
- ValueTypeSetIt it;
1993
+ AUTOC_STATIC void ValueTypeMapSetInclude(ValueTypeMapSet* self, ValueTypeMapSet* other) {
1994
+ ValueTypeMapSetIt it;
1913
1995
  assert(self);
1914
1996
  assert(other);
1915
- ValueTypeSetItCtor(&it, other);
1916
- while(ValueTypeSetItMove(&it)) ValueTypeSetPut(self, *ValueTypeSetItGetRef(&it));
1997
+ ValueTypeMapSetItCtor(&it, other);
1998
+ while(ValueTypeMapSetItMove(&it)) ValueTypeMapSetPut(self, *ValueTypeMapSetItGetRef(&it));
1917
1999
  }
1918
- void ValueTypeSetRetain(ValueTypeSet* self, ValueTypeSet* other) {
1919
- ValueTypeSetIt it;
1920
- ValueTypeSet set;
2000
+ AUTOC_STATIC void ValueTypeMapSetRetain(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2001
+ ValueTypeMapSetIt it;
2002
+ ValueTypeMapSet set;
1921
2003
  assert(self);
1922
2004
  assert(other);
1923
- ValueTypeSetCtor(&set);
1924
- ValueTypeSetItCtor(&it, self);
1925
- while(ValueTypeSetItMove(&it)) {
1926
- ValueType* e = ValueTypeSetItGetRef(&it);
1927
- if(ValueTypeSetContains(other, *e)) ValueTypeSetPut(&set, *e);
2005
+ ValueTypeMapSetCtor(&set);
2006
+ ValueTypeMapSetItCtor(&it, self);
2007
+ while(ValueTypeMapSetItMove(&it)) {
2008
+ ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2009
+ if(ValueTypeMapSetContains(other, *e)) ValueTypeMapSetPut(&set, *e);
1928
2010
  }
1929
- ValueTypeSetDtor(self);
2011
+ ValueTypeMapSetDtor(self);
1930
2012
  *self = set;
1931
2013
  }
1932
- void ValueTypeSetInvert(ValueTypeSet* self, ValueTypeSet* other) {
1933
- ValueTypeSetIt it;
1934
- ValueTypeSet set;
2014
+ AUTOC_STATIC void ValueTypeMapSetInvert(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2015
+ ValueTypeMapSetIt it;
2016
+ ValueTypeMapSet set;
1935
2017
  assert(self);
1936
2018
  assert(other);
1937
- ValueTypeSetCtor(&set);
1938
- ValueTypeSetItCtor(&it, self);
1939
- while(ValueTypeSetItMove(&it)) {
1940
- ValueType* e = ValueTypeSetItGetRef(&it);
1941
- if(!ValueTypeSetContains(other, *e)) ValueTypeSetPut(&set, *e);
2019
+ ValueTypeMapSetCtor(&set);
2020
+ ValueTypeMapSetItCtor(&it, self);
2021
+ while(ValueTypeMapSetItMove(&it)) {
2022
+ ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2023
+ if(!ValueTypeMapSetContains(other, *e)) ValueTypeMapSetPut(&set, *e);
1942
2024
  }
1943
- ValueTypeSetItCtor(&it, other);
1944
- while(ValueTypeSetItMove(&it)) {
1945
- ValueType* e = ValueTypeSetItGetRef(&it);
1946
- if(!ValueTypeSetContains(self, *e)) ValueTypeSetPut(&set, *e);
2025
+ ValueTypeMapSetItCtor(&it, other);
2026
+ while(ValueTypeMapSetItMove(&it)) {
2027
+ ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2028
+ if(!ValueTypeMapSetContains(self, *e)) ValueTypeMapSetPut(&set, *e);
1947
2029
  }
1948
- ValueTypeSetDtor(self);
2030
+ ValueTypeMapSetDtor(self);
1949
2031
  *self = set;
1950
2032
  }
1951
- void ValueTypeSetItCtor(ValueTypeSetIt* self, ValueTypeSet* set) {
2033
+ AUTOC_STATIC void ValueTypeMapSetItCtor(ValueTypeMapSetIt* self, ValueTypeMapSet* set) {
1952
2034
  assert(self);
1953
2035
  self->set = set;
1954
2036
  self->bucket_index = -1;
1955
2037
  }
1956
- int ValueTypeSetItMove(ValueTypeSetIt* self) {
2038
+ AUTOC_STATIC int ValueTypeMapSetItMove(ValueTypeMapSetIt* self) {
1957
2039
  assert(self);
1958
- if(self->bucket_index < 0) ValueTypeSetListItCtor(&self->it, &self->set->buckets[self->bucket_index = 0]);
1959
- if(ValueTypeSetListItMove(&self->it)) return 1;
2040
+ if(self->bucket_index < 0) ValueTypeMapSetListItCtor(&self->it, &self->set->buckets[self->bucket_index = 0]);
2041
+ if(ValueTypeMapSetListItMove(&self->it)) return 1;
1960
2042
  while(++self->bucket_index < self->set->bucket_count) {
1961
- ValueTypeSetListItCtor(&self->it, &self->set->buckets[self->bucket_index]);
1962
- if(ValueTypeSetListItMove(&self->it)) return 1;
2043
+ ValueTypeMapSetListItCtor(&self->it, &self->set->buckets[self->bucket_index]);
2044
+ if(ValueTypeMapSetListItMove(&self->it)) return 1;
1963
2045
  }
1964
2046
  return 0;
1965
2047
  }
1966
- ValueType ValueTypeSetItGet(ValueTypeSetIt* self) {
2048
+ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetItGet(ValueTypeMapSetIt* self) {
1967
2049
  assert(self);
1968
- return ValueTypeSetListItGet(&self->it);
2050
+ return ValueTypeMapSetListItGet(&self->it);
1969
2051
  }
1970
- ValueType* ValueTypeSetItGetRef(ValueTypeSetIt* self) {
2052
+ AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetItGetRef(ValueTypeMapSetIt* self) {
1971
2053
  assert(self);
1972
- return ValueTypeSetListItGetRef(&self->it);
2054
+ return ValueTypeMapSetListItGetRef(&self->it);
1973
2055
  }
1974
2056
 
1975
- #define AUTOC_VALID_VALUE 1
1976
- #define AUTOC_VALID_KEY 2
1977
- #define AUTOC_OWNED_VALUE 4
1978
- #define AUTOC_OWNED_KEY 8
1979
- static ValueTypeMapEntry ValueTypeMapEntryKeyOnlyRef(ValueType* key) {
1980
- ValueTypeMapEntry entry;
1981
- entry.key = *key;
1982
- entry.flags = AUTOC_VALID_KEY;
1983
- return entry;
1984
- }
1985
- static ValueTypeMapEntry ValueTypeMapEntryKeyValueRef(ValueType* key, ValueType* value) {
1986
- ValueTypeMapEntry entry;
1987
- entry.key = *key;
1988
- entry.value = *value;
1989
- entry.flags = (AUTOC_VALID_KEY | AUTOC_VALID_VALUE);
1990
- return entry;
2057
+ void ValueTypeMapCtor(ValueTypeMap* self) {
2058
+ assert(self);
2059
+ ValueTypeMapSetCtor(&self->entries);
1991
2060
  }
1992
- #define ValueTypeMapEntryIdentify(obj) ValueTypeMapEntryIdentifyRef(&obj)
1993
- static size_t ValueTypeMapEntryIdentifyRef(ValueTypeMapEntry* entry) {
1994
- return ValueTypeIdentify(entry->key);
2061
+ void ValueTypeMapDtor(ValueTypeMap* self) {
2062
+ assert(self);
2063
+ ValueTypeMapSetDtor(&self->entries);
1995
2064
  }
1996
- #define ValueTypeMapEntryEqual(lt, rt) ValueTypeMapEntryEqualRef(&lt, &rt)
1997
- static int ValueTypeMapEntryEqualRef(ValueTypeMapEntry* lt, ValueTypeMapEntry* rt) {
1998
- return ValueTypeEqual(lt->key, rt->key);
2065
+ static int ValueTypeMapPutEntryRef(ValueTypeMap* self, ValueTypeMapEntry* entry) {
2066
+ int absent;
2067
+ assert(self);
2068
+ assert(entry);
2069
+ if((absent = !ValueTypeMapContainsKey(self, entry->key))) {
2070
+ ValueTypeMapSetPut(&self->entries, *entry);
2071
+ }
2072
+ return absent;
1999
2073
  }
2000
- #define ValueTypeMapEntryCopy(dst, src) ValueTypeMapEntryCopyRef(&dst, &src)
2001
- static void ValueTypeMapEntryCopyRef(ValueTypeMapEntry* dst, ValueTypeMapEntry* src) {
2002
- assert(src->flags & AUTOC_VALID_KEY);
2003
- dst->flags = (AUTOC_VALID_KEY | AUTOC_OWNED_KEY);
2004
- ValueTypeCopy(dst->key, src->key);
2005
- if(src->flags & AUTOC_VALID_VALUE) {
2006
- dst->flags |= (AUTOC_VALID_VALUE | AUTOC_OWNED_VALUE);
2007
- ValueTypeCopy(dst->value, src->value);
2074
+ void ValueTypeMapCopy(ValueTypeMap* dst,ValueTypeMap* src) {
2075
+ ValueTypeMapIt it;
2076
+ assert(src);
2077
+ assert(dst);
2078
+ ValueTypeMapCtor(dst);
2079
+ ValueTypeMapItCtor(&it, src);
2080
+ while(ValueTypeMapItMove(&it)) {
2081
+ ValueTypeMapEntry* e = ValueTypeMapItGetEntryRef(&it);
2082
+ ValueTypeMapPutEntryRef(dst, e);
2008
2083
  }
2009
2084
  }
2010
- #define ValueTypeMapEntryDtor(obj) ValueTypeMapEntryDtorRef(&obj)
2011
- static void ValueTypeMapEntryDtorRef(ValueTypeMapEntry* entry) {
2012
- assert(entry->flags & AUTOC_VALID_KEY);
2013
- if(entry->flags & AUTOC_OWNED_KEY) ValueTypeDtor(entry->key);
2014
- if(entry->flags & AUTOC_VALID_VALUE && entry->flags & AUTOC_OWNED_VALUE) ValueTypeDtor(entry->value);
2085
+ int ValueTypeMapEqual(ValueTypeMap* lt,ValueTypeMap* rt) {
2086
+ assert(lt);
2087
+ assert(rt);
2088
+ return ValueTypeMapSize(lt) == ValueTypeMapSize(rt) && ValueTypeMapContainsAllOf(lt, rt) && ValueTypeMapContainsAllOf(rt, lt);
2015
2089
  }
2090
+ size_t ValueTypeMapIdentify(ValueTypeMap* self) {
2091
+ assert(self);
2092
+ return ValueTypeMapSetIdentify(&self->entries); /* TODO : make use of the values' hashes */
2093
+ }
2094
+ void ValueTypeMapPurge(ValueTypeMap* self) {
2095
+ assert(self);
2096
+ ValueTypeMapSetPurge(&self->entries);
2097
+ }
2098
+ size_t ValueTypeMapSize(ValueTypeMap* self) {
2099
+ assert(self);
2100
+ return ValueTypeMapSetSize(&self->entries);
2101
+ }
2102
+ int ValueTypeMapContainsKey(ValueTypeMap* self, ValueType key) {
2103
+ int result;
2104
+ ValueTypeMapEntry entry;
2105
+ assert(self);
2106
+ result = ValueTypeMapSetContains(&self->entries, entry = ValueTypeMapEntryKeyOnlyRef(&key));
2107
+ ValueTypeMapEntryDtor(entry);
2108
+ return result;
2109
+ }
2110
+ ValueType ValueTypeMapGet(ValueTypeMap* self, ValueType key) {
2111
+ ValueType result;
2112
+ ValueTypeMapEntry entry, existing_entry;
2113
+ assert(self);
2114
+ assert(ValueTypeMapContainsKey(self, key));
2115
+ existing_entry = ValueTypeMapSetGet(&self->entries, entry = ValueTypeMapEntryKeyOnlyRef(&key));
2116
+ ValueTypeCopy(result,existing_entry.value);
2117
+ ValueTypeMapEntryDtor(existing_entry);
2118
+ ValueTypeMapEntryDtor(entry);
2119
+ return result;
2120
+ }
2121
+ int ValueTypeMapPut(ValueTypeMap* self, ValueType key, ValueType value) {
2122
+ int result;
2123
+ ValueTypeMapEntry entry;
2124
+ assert(self);
2125
+ entry = ValueTypeMapEntryKeyValueRef(&key, &value);
2126
+ result = ValueTypeMapPutEntryRef(self, &entry);
2127
+ ValueTypeMapEntryDtor(entry);
2128
+ return result;
2129
+ }
2130
+ int ValueTypeMapReplace(ValueTypeMap* self, ValueType key, ValueType value) {
2131
+ int result;
2132
+ ValueTypeMapEntry entry;
2133
+ assert(self);
2134
+ entry = ValueTypeMapEntryKeyValueRef(&key, &value);
2135
+ result = ValueTypeMapSetReplace(&self->entries, entry);
2136
+ ValueTypeMapEntryDtor(entry);
2137
+ return result;
2138
+ }
2139
+ int ValueTypeMapRemove(ValueTypeMap* self, ValueType key) {
2140
+ int result;
2141
+ ValueTypeMapEntry entry;
2142
+ assert(self);
2143
+ result = ValueTypeMapSetRemove(&self->entries, entry = ValueTypeMapEntryKeyOnlyRef(&key));
2144
+ ValueTypeMapEntryDtor(entry);
2145
+ return result;
2146
+ }
2147
+ void ValueTypeMapItCtor(ValueTypeMapIt* self, ValueTypeMap* map) {
2148
+ assert(self);
2149
+ assert(map);
2150
+ ValueTypeMapSetItCtor(&self->it, &map->entries);
2151
+ }
2152
+ int ValueTypeMapItMove(ValueTypeMapIt* self) {
2153
+ assert(self);
2154
+ return ValueTypeMapSetItMove(&self->it);
2155
+ }
2156
+ ValueType ValueTypeMapItGetKey(ValueTypeMapIt* self) {
2157
+ ValueTypeMapEntry* e;
2158
+ ValueType key;
2159
+ assert(self);
2160
+ e = ValueTypeMapItGetEntryRef(self);
2161
+ ValueTypeCopy(key,e->key);
2162
+ return key;
2163
+ }
2164
+ ValueType ValueTypeMapItGetElement(ValueTypeMapIt* self) {
2165
+ ValueTypeMapEntry* e;
2166
+ ValueType value;
2167
+ assert(self);
2168
+ e = ValueTypeMapItGetEntryRef(self);
2169
+ assert(e->flags & AUTOC_VALID_VALUE);
2170
+ ValueTypeCopy(value,e->value);
2171
+ return value;
2172
+ }
2173
+ static ValueTypeMapEntry* ValueTypeMapItGetEntryRef(ValueTypeMapIt* self) {
2174
+ assert(self);
2175
+ return ValueTypeMapSetItGetRef(&self->it);
2176
+ }
2177
+ #undef AUTOC_VALID_VALUE
2178
+ #undef AUTOC_VALID_KEY
2179
+ #undef AUTOC_OWNED_VALUE
2180
+ #undef AUTOC_OWNED_KEY
2016
2181
 
2017
- AUTOC_STATIC void ValueTypeMapSetCtor(ValueTypeMapSet*);
2018
- AUTOC_STATIC void ValueTypeMapSetDtor(ValueTypeMapSet*);
2019
- AUTOC_STATIC void ValueTypeMapSetCopy(ValueTypeMapSet*, ValueTypeMapSet*);
2020
- AUTOC_STATIC int ValueTypeMapSetEqual(ValueTypeMapSet*, ValueTypeMapSet*);
2021
- AUTOC_STATIC size_t ValueTypeMapSetIdentify(ValueTypeMapSet*);
2022
- AUTOC_STATIC void ValueTypeMapSetPurge(ValueTypeMapSet*);
2023
- AUTOC_STATIC int ValueTypeMapSetContains(ValueTypeMapSet*, ValueTypeMapEntry);
2024
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetGet(ValueTypeMapSet*, ValueTypeMapEntry);
2025
- AUTOC_STATIC size_t ValueTypeMapSetSize(ValueTypeMapSet*);
2026
- #define ValueTypeMapSetEmpty(self) (ValueTypeMapSetSize(self) == 0)
2027
- AUTOC_STATIC int ValueTypeMapSetPut(ValueTypeMapSet*, ValueTypeMapEntry);
2028
- AUTOC_STATIC int ValueTypeMapSetReplace(ValueTypeMapSet*, ValueTypeMapEntry);
2029
- AUTOC_STATIC int ValueTypeMapSetRemove(ValueTypeMapSet*, ValueTypeMapEntry);
2030
- AUTOC_STATIC void ValueTypeMapSetExclude(ValueTypeMapSet*, ValueTypeMapSet*);
2031
- AUTOC_STATIC void ValueTypeMapSetRetain(ValueTypeMapSet*, ValueTypeMapSet*);
2032
- AUTOC_STATIC void ValueTypeMapSetInclude(ValueTypeMapSet*, ValueTypeMapSet*);
2033
- AUTOC_STATIC void ValueTypeMapSetInvert(ValueTypeMapSet*, ValueTypeMapSet*);
2034
- AUTOC_STATIC void ValueTypeMapSetItCtor(ValueTypeMapSetIt*, ValueTypeMapSet*);
2035
- AUTOC_STATIC int ValueTypeMapSetItMove(ValueTypeMapSetIt*);
2036
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetItGet(ValueTypeMapSetIt*);
2037
-
2038
- AUTOC_STATIC void ValueTypeMapSetListCtor(ValueTypeMapSetList*);
2039
- AUTOC_STATIC void ValueTypeMapSetListDtor(ValueTypeMapSetList*);
2040
- AUTOC_STATIC void ValueTypeMapSetListCopy(ValueTypeMapSetList*, ValueTypeMapSetList*);
2041
- AUTOC_STATIC int ValueTypeMapSetListEqual(ValueTypeMapSetList*, ValueTypeMapSetList*);
2042
- AUTOC_STATIC size_t ValueTypeMapSetListIdentify(ValueTypeMapSetList*);
2043
- AUTOC_STATIC void ValueTypeMapSetListPurge(ValueTypeMapSetList*);
2044
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPeek(ValueTypeMapSetList*);
2045
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPop(ValueTypeMapSetList*);
2046
- AUTOC_STATIC void ValueTypeMapSetListPush(ValueTypeMapSetList*, ValueTypeMapEntry);
2047
- AUTOC_STATIC int ValueTypeMapSetListContains(ValueTypeMapSetList*, ValueTypeMapEntry);
2048
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListFind(ValueTypeMapSetList*, ValueTypeMapEntry);
2049
- #define ValueTypeMapSetListReplace(self, with) ValueTypeMapSetListReplaceEx(self, with, 1)
2050
- #define ValueTypeMapSetListReplaceAll(self, with) ValueTypeMapSetListReplaceEx(self, with, -1)
2051
- AUTOC_STATIC int ValueTypeMapSetListReplaceEx(ValueTypeMapSetList*, ValueTypeMapEntry, int);
2052
- #define ValueTypeMapSetListRemove(self, what) ValueTypeMapSetListRemoveEx(self, what, 1)
2053
- #define ValueTypeMapSetListRemoveAll(self, what) ValueTypeMapSetListRemoveEx(self, what, -1)
2054
- AUTOC_STATIC int ValueTypeMapSetListRemoveEx(ValueTypeMapSetList*, ValueTypeMapEntry, int);
2055
- AUTOC_STATIC size_t ValueTypeMapSetListSize(ValueTypeMapSetList*);
2056
- #define ValueTypeMapSetListEmpty(self) (ValueTypeMapSetListSize(self) == 0)
2057
- AUTOC_STATIC void ValueTypeMapSetListItCtor(ValueTypeMapSetListIt*, ValueTypeMapSetList*);
2058
- AUTOC_STATIC int ValueTypeMapSetListItMove(ValueTypeMapSetListIt*);
2059
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListItGet(ValueTypeMapSetListIt*);
2182
+ #define _ValueTypeSetListCtor(self) ValueTypeSetListCtor(&self)
2183
+ #define _ValueTypeSetListDtor(self) ValueTypeSetListDtor(&self)
2184
+ #define _ValueTypeSetListIdentify(self) ValueTypeSetListIdentify(&self)
2185
+ #define _ValueTypeSetListCopy(dst,src) ValueTypeSetListCopy(&dst,&src)
2186
+ #define _ValueTypeSetListEqual(lt,rt) ValueTypeSetListEqual(&lt,&rt)
2187
+ #define _ValueTypeSetListLess(lt,rt) ValueTypeSetListLess(&lt,&rt)
2060
2188
 
2061
- AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetListItGetRef(ValueTypeMapSetListIt*);
2062
- AUTOC_STATIC void ValueTypeMapSetListCtor(ValueTypeMapSetList* self) {
2189
+ AUTOC_STATIC void ValueTypeSetListCtor(ValueTypeSetList*);
2190
+ AUTOC_STATIC void ValueTypeSetListDtor(ValueTypeSetList*);
2191
+ AUTOC_STATIC void ValueTypeSetListCopy(ValueTypeSetList*,ValueTypeSetList*);
2192
+ AUTOC_STATIC int ValueTypeSetListEqual(ValueTypeSetList*,ValueTypeSetList*);
2193
+ AUTOC_STATIC size_t ValueTypeSetListIdentify(ValueTypeSetList*);
2194
+ AUTOC_STATIC void ValueTypeSetListPurge(ValueTypeSetList*);
2195
+ AUTOC_STATIC ValueType ValueTypeSetListPeek(ValueTypeSetList*);
2196
+ AUTOC_STATIC ValueType ValueTypeSetListPop(ValueTypeSetList*);
2197
+ AUTOC_STATIC void ValueTypeSetListPush(ValueTypeSetList*, ValueType);
2198
+ AUTOC_STATIC int ValueTypeSetListContains(ValueTypeSetList*, ValueType);
2199
+ AUTOC_STATIC ValueType ValueTypeSetListFind(ValueTypeSetList*, ValueType);
2200
+ #define ValueTypeSetListReplace(self, with) ValueTypeSetListReplaceEx(self, with, 1)
2201
+ #define ValueTypeSetListReplaceAll(self, with) ValueTypeSetListReplaceEx(self, with, -1)
2202
+ AUTOC_STATIC int ValueTypeSetListReplaceEx(ValueTypeSetList*, ValueType, int);
2203
+ #define ValueTypeSetListRemove(self, what) ValueTypeSetListRemoveEx(self, what, 1)
2204
+ #define ValueTypeSetListRemoveAll(self, what) ValueTypeSetListRemoveEx(self, what, -1)
2205
+ AUTOC_STATIC int ValueTypeSetListRemoveEx(ValueTypeSetList*, ValueType, int);
2206
+ AUTOC_STATIC size_t ValueTypeSetListSize(ValueTypeSetList*);
2207
+ #define ValueTypeSetListEmpty(self) (ValueTypeSetListSize(self) == 0)
2208
+ AUTOC_STATIC void ValueTypeSetListItCtor(ValueTypeSetListIt*, ValueTypeSetList*);
2209
+ AUTOC_STATIC int ValueTypeSetListItMove(ValueTypeSetListIt*);
2210
+ AUTOC_STATIC ValueType ValueTypeSetListItGet(ValueTypeSetListIt*);
2211
+
2212
+ AUTOC_STATIC ValueType* ValueTypeSetListItGetRef(ValueTypeSetListIt*);
2213
+ AUTOC_STATIC void ValueTypeSetListCtor(ValueTypeSetList* self) {
2063
2214
  assert(self);
2064
2215
  self->head_node = NULL;
2065
2216
  self->node_count = 0;
2066
2217
  }
2067
- AUTOC_STATIC void ValueTypeMapSetListDtor(ValueTypeMapSetList* self) {
2068
- ValueTypeMapSetListNode* node;
2218
+ AUTOC_STATIC void ValueTypeSetListDtor(ValueTypeSetList* self) {
2219
+ ValueTypeSetListNode* node;
2069
2220
  assert(self);
2070
2221
  node = self->head_node;
2071
2222
  while(node) {
2072
- ValueTypeMapSetListNode* this_node = node;
2223
+ ValueTypeSetListNode* this_node = node;
2073
2224
  node = node->next_node;
2074
- ValueTypeMapEntryDtor(this_node->element);
2225
+ ValueTypeDtor(this_node->element);
2075
2226
  free(this_node);
2076
2227
  }
2077
2228
  }
2078
- AUTOC_STATIC void ValueTypeMapSetListCopy(ValueTypeMapSetList* dst, ValueTypeMapSetList* src) {
2079
- ValueTypeMapSetListIt it;
2229
+ AUTOC_STATIC void ValueTypeSetListCopy(ValueTypeSetList* dst,ValueTypeSetList* src) {
2230
+ ValueTypeSetListIt it;
2080
2231
  assert(src);
2081
2232
  assert(dst);
2082
- ValueTypeMapSetListCtor(dst);
2083
- ValueTypeMapSetListItCtor(&it, src);
2084
- while(ValueTypeMapSetListItMove(&it)) {
2085
- ValueTypeMapSetListPush(dst, *ValueTypeMapSetListItGetRef(&it));
2233
+ ValueTypeSetListCtor(dst);
2234
+ ValueTypeSetListItCtor(&it, src);
2235
+ while(ValueTypeSetListItMove(&it)) {
2236
+ ValueTypeSetListPush(dst, *ValueTypeSetListItGetRef(&it));
2086
2237
  }
2087
2238
  }
2088
- AUTOC_STATIC int ValueTypeMapSetListEqual(ValueTypeMapSetList* lt, ValueTypeMapSetList* rt) {
2089
- if(ValueTypeMapSetListSize(lt) == ValueTypeMapSetListSize(rt)) {
2090
- ValueTypeMapSetListIt lit, rit;
2091
- ValueTypeMapSetListItCtor(&lit, lt);
2092
- ValueTypeMapSetListItCtor(&rit, rt);
2093
- while(ValueTypeMapSetListItMove(&lit) && ValueTypeMapSetListItMove(&rit)) {
2239
+ AUTOC_STATIC int ValueTypeSetListEqual(ValueTypeSetList* lt,ValueTypeSetList* rt) {
2240
+ if(ValueTypeSetListSize(lt) == ValueTypeSetListSize(rt)) {
2241
+ ValueTypeSetListIt lit, rit;
2242
+ ValueTypeSetListItCtor(&lit, lt);
2243
+ ValueTypeSetListItCtor(&rit, rt);
2244
+ while(ValueTypeSetListItMove(&lit) && ValueTypeSetListItMove(&rit)) {
2094
2245
  int equal;
2095
- ValueTypeMapEntry *le, *re;
2096
- le = ValueTypeMapSetListItGetRef(&lit);
2097
- re = ValueTypeMapSetListItGetRef(&rit);
2098
- equal = ValueTypeMapEntryEqual(*le, *re);
2246
+ ValueType* le;
2247
+ ValueType* re;
2248
+ le = ValueTypeSetListItGetRef(&lit);
2249
+ re = ValueTypeSetListItGetRef(&rit);
2250
+ equal = ValueTypeEqual(*le,*re);
2099
2251
  if(!equal) return 0;
2100
2252
  }
2101
2253
  return 1;
2102
2254
  } else
2103
2255
  return 0;
2104
2256
  }
2105
- AUTOC_STATIC size_t ValueTypeMapSetListIdentify(ValueTypeMapSetList* self) {
2106
- ValueTypeMapSetListNode* node;
2257
+ AUTOC_STATIC size_t ValueTypeSetListIdentify(ValueTypeSetList* self) {
2258
+ ValueTypeSetListNode* node;
2107
2259
  size_t result = 0;
2108
2260
  assert(self);
2109
2261
  for(node = self->head_node; node != NULL; node = node->next_node) {
2110
- result ^= ValueTypeMapEntryIdentify(node->element);
2262
+ result ^= ValueTypeIdentify(node->element);
2111
2263
  result = AUTOC_RCYCLE(result);
2112
2264
  }
2113
2265
  return result;
2114
2266
  }
2115
- AUTOC_STATIC void ValueTypeMapSetListPurge(ValueTypeMapSetList* self) {
2116
- ValueTypeMapSetListDtor(self);
2117
- ValueTypeMapSetListCtor(self);
2267
+ AUTOC_STATIC void ValueTypeSetListPurge(ValueTypeSetList* self) {
2268
+ ValueTypeSetListDtor(self);
2269
+ ValueTypeSetListCtor(self);
2118
2270
  }
2119
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPeek(ValueTypeMapSetList* self) {
2120
- ValueTypeMapEntry result;
2271
+ AUTOC_STATIC ValueType ValueTypeSetListPeek(ValueTypeSetList* self) {
2272
+ ValueType result;
2121
2273
  assert(self);
2122
- assert(!ValueTypeMapSetListEmpty(self));
2123
- ValueTypeMapEntryCopy(result, self->head_node->element);
2274
+ assert(!ValueTypeSetListEmpty(self));
2275
+ ValueTypeCopy(result,self->head_node->element);
2124
2276
  return result;
2125
2277
  }
2126
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPop(ValueTypeMapSetList* self) {
2127
- ValueTypeMapSetListNode* node;
2128
- ValueTypeMapEntry result;
2278
+ AUTOC_STATIC ValueType ValueTypeSetListPop(ValueTypeSetList* self) {
2279
+ ValueTypeSetListNode* node;
2280
+ ValueType result;
2129
2281
  assert(self);
2130
- assert(!ValueTypeMapSetListEmpty(self));
2282
+ assert(!ValueTypeSetListEmpty(self));
2131
2283
  node = self->head_node;
2132
2284
  result = node->element;
2133
2285
  self->head_node = self->head_node->next_node;
@@ -2135,23 +2287,23 @@ AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListPop(ValueTypeMapSetList* self)
2135
2287
  free(node);
2136
2288
  return result;
2137
2289
  }
2138
- AUTOC_STATIC void ValueTypeMapSetListPush(ValueTypeMapSetList* self, ValueTypeMapEntry element) {
2139
- ValueTypeMapSetListNode* node;
2290
+ AUTOC_STATIC void ValueTypeSetListPush(ValueTypeSetList* self, ValueType element) {
2291
+ ValueTypeSetListNode* node;
2140
2292
  assert(self);
2141
- node = (ValueTypeMapSetListNode*)malloc(sizeof(ValueTypeMapSetListNode));
2293
+ node = (ValueTypeSetListNode*)malloc(sizeof(ValueTypeSetListNode));
2142
2294
  assert(node);
2143
- ValueTypeMapEntryCopy(node->element, element);
2295
+ ValueTypeCopy(node->element,element);
2144
2296
  node->next_node = self->head_node;
2145
2297
  self->head_node = node;
2146
2298
  ++self->node_count;
2147
2299
  }
2148
- AUTOC_STATIC int ValueTypeMapSetListContains(ValueTypeMapSetList* self, ValueTypeMapEntry what) {
2149
- ValueTypeMapSetListNode* node;
2300
+ AUTOC_STATIC int ValueTypeSetListContains(ValueTypeSetList* self, ValueType what) {
2301
+ ValueTypeSetListNode* node;
2150
2302
  int found = 0;
2151
2303
  assert(self);
2152
2304
  node = self->head_node;
2153
2305
  while(node) {
2154
- if(ValueTypeMapEntryEqual(node->element, what)) {
2306
+ if(ValueTypeEqual(node->element,what)) {
2155
2307
  found = 1;
2156
2308
  break;
2157
2309
  }
@@ -2159,31 +2311,31 @@ AUTOC_STATIC int ValueTypeMapSetListContains(ValueTypeMapSetList* self, ValueTyp
2159
2311
  }
2160
2312
  return found;
2161
2313
  }
2162
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListFind(ValueTypeMapSetList* self, ValueTypeMapEntry what) {
2163
- ValueTypeMapSetListNode* node;
2314
+ AUTOC_STATIC ValueType ValueTypeSetListFind(ValueTypeSetList* self, ValueType what) {
2315
+ ValueTypeSetListNode* node;
2164
2316
  assert(self);
2165
- assert(ValueTypeMapSetListContains(self, what));
2317
+ assert(ValueTypeSetListContains(self, what));
2166
2318
  node = self->head_node;
2167
2319
  while(node) {
2168
- if(ValueTypeMapEntryEqual(node->element, what)) {
2169
- ValueTypeMapEntry result;
2170
- ValueTypeMapEntryCopy(result, node->element);
2320
+ if(ValueTypeEqual(node->element,what)) {
2321
+ ValueType result;
2322
+ ValueTypeCopy(result,node->element);
2171
2323
  return result;
2172
2324
  }
2173
2325
  node = node->next_node;
2174
2326
  }
2175
2327
  abort();
2176
2328
  }
2177
- AUTOC_STATIC int ValueTypeMapSetListReplaceEx(ValueTypeMapSetList* self, ValueTypeMapEntry with, int count) {
2178
- ValueTypeMapSetListNode* node;
2329
+ AUTOC_STATIC int ValueTypeSetListReplaceEx(ValueTypeSetList* self, ValueType with, int count) {
2330
+ ValueTypeSetListNode* node;
2179
2331
  int replaced = 0;
2180
2332
  assert(self);
2181
2333
  if(count == 0) return 0;
2182
2334
  node = self->head_node;
2183
2335
  while(node) {
2184
- if(ValueTypeMapEntryEqual(node->element, with)) {
2185
- ValueTypeMapEntryDtor(node->element);
2186
- ValueTypeMapEntryCopy(node->element, with);
2336
+ if(ValueTypeEqual(node->element,with)) {
2337
+ ValueTypeDtor(node->element);
2338
+ ValueTypeCopy(node->element,with);
2187
2339
  ++replaced;
2188
2340
  if(count > 0 && replaced >= count) break;
2189
2341
  }
@@ -2191,16 +2343,16 @@ AUTOC_STATIC int ValueTypeMapSetListReplaceEx(ValueTypeMapSetList* self, ValueTy
2191
2343
  }
2192
2344
  return replaced;
2193
2345
  }
2194
- AUTOC_STATIC int ValueTypeMapSetListRemoveEx(ValueTypeMapSetList* self, ValueTypeMapEntry what, int count) {
2195
- ValueTypeMapSetListNode *node, *prev_node;
2346
+ AUTOC_STATIC int ValueTypeSetListRemoveEx(ValueTypeSetList* self, ValueType what, int count) {
2347
+ ValueTypeSetListNode *node, *prev_node;
2196
2348
  int removed = 0;
2197
2349
  assert(self);
2198
2350
  if(count == 0) return 0;
2199
2351
  node = self->head_node;
2200
2352
  prev_node = NULL;
2201
2353
  while(node) {
2202
- if(ValueTypeMapEntryEqual(node->element, what)) {
2203
- ValueTypeMapSetListNode* this_node;
2354
+ if(ValueTypeEqual(node->element,what)) {
2355
+ ValueTypeSetListNode* this_node;
2204
2356
  if(prev_node) {
2205
2357
  this_node = prev_node->next_node = node->next_node;
2206
2358
  } else {
@@ -2208,7 +2360,7 @@ AUTOC_STATIC int ValueTypeMapSetListRemoveEx(ValueTypeMapSetList* self, ValueTyp
2208
2360
  }
2209
2361
  ++removed;
2210
2362
  --self->node_count;
2211
- ValueTypeMapEntryDtor(node->element);
2363
+ ValueTypeDtor(node->element);
2212
2364
  free(node);
2213
2365
  node = this_node;
2214
2366
  if(count > 0 && removed >= count) break;
@@ -2219,17 +2371,17 @@ AUTOC_STATIC int ValueTypeMapSetListRemoveEx(ValueTypeMapSetList* self, ValueTyp
2219
2371
  }
2220
2372
  return removed;
2221
2373
  }
2222
- AUTOC_STATIC size_t ValueTypeMapSetListSize(ValueTypeMapSetList* self) {
2374
+ AUTOC_STATIC size_t ValueTypeSetListSize(ValueTypeSetList* self) {
2223
2375
  assert(self);
2224
2376
  return self->node_count;
2225
2377
  }
2226
- AUTOC_STATIC void ValueTypeMapSetListItCtor(ValueTypeMapSetListIt* self, ValueTypeMapSetList* list) {
2378
+ AUTOC_STATIC void ValueTypeSetListItCtor(ValueTypeSetListIt* self, ValueTypeSetList* list) {
2227
2379
  assert(self);
2228
2380
  assert(list);
2229
2381
  self->start = 1;
2230
2382
  self->list = list;
2231
2383
  }
2232
- AUTOC_STATIC int ValueTypeMapSetListItMove(ValueTypeMapSetListIt* self) {
2384
+ AUTOC_STATIC int ValueTypeSetListItMove(ValueTypeSetListIt* self) {
2233
2385
  assert(self);
2234
2386
  if(self->start) {
2235
2387
  self->this_node = self->list->head_node;
@@ -2239,22 +2391,22 @@ AUTOC_STATIC int ValueTypeMapSetListItMove(ValueTypeMapSetListIt* self) {
2239
2391
  }
2240
2392
  return self->this_node != NULL;
2241
2393
  }
2242
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetListItGet(ValueTypeMapSetListIt* self) {
2243
- ValueTypeMapEntry result;
2394
+ AUTOC_STATIC ValueType ValueTypeSetListItGet(ValueTypeSetListIt* self) {
2395
+ ValueType result;
2244
2396
  assert(self);
2245
2397
  assert(self->this_node);
2246
- ValueTypeMapEntryCopy(result, self->this_node->element);
2398
+ ValueTypeCopy(result,self->this_node->element);
2247
2399
  return result;
2248
2400
  }
2249
- AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetListItGetRef(ValueTypeMapSetListIt* self) {
2401
+ AUTOC_STATIC ValueType* ValueTypeSetListItGetRef(ValueTypeSetListIt* self) {
2250
2402
  assert(self);
2251
2403
  assert(self->this_node);
2252
2404
  return &self->this_node->element;
2253
2405
  }
2254
2406
 
2255
- AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetItGetRef(ValueTypeMapSetIt*);
2256
- static void ValueTypeMapSetRehash(ValueTypeMapSet* self) {
2257
- ValueTypeMapSetList* buckets;
2407
+ ValueType* ValueTypeSetItGetRef(ValueTypeSetIt*);
2408
+ static void ValueTypeSetRehash(ValueTypeSet* self) {
2409
+ ValueTypeSetList* buckets;
2258
2410
  size_t index, bucket_count, size, fill;
2259
2411
  assert(self);
2260
2412
  assert(self->min_fill > 0);
@@ -2278,28 +2430,38 @@ static void ValueTypeMapSetRehash(ValueTypeMapSet* self) {
2278
2430
  bucket_count = self->min_bucket_count;
2279
2431
  size = 0;
2280
2432
  }
2281
- buckets = (ValueTypeMapSetList*)malloc(bucket_count*sizeof(ValueTypeMapSetList));
2433
+ buckets = (ValueTypeSetList*)malloc(bucket_count*sizeof(ValueTypeSetList));
2282
2434
  assert(buckets);
2283
2435
  for(index = 0; index < bucket_count; ++index) {
2284
- ValueTypeMapSetListCtor(&buckets[index]);
2436
+ ValueTypeSetListCtor(&buckets[index]);
2285
2437
  }
2286
2438
  if(self->buckets) {
2287
- ValueTypeMapSetIt it;
2288
- ValueTypeMapSetItCtor(&it, self);
2289
- while(ValueTypeMapSetItMove(&it)) {
2290
- ValueTypeMapSetList* bucket;
2291
- ValueTypeMapEntry element = ValueTypeMapSetItGet(&it);
2292
- bucket = &buckets[ValueTypeMapEntryIdentify(element) % bucket_count];
2293
- ValueTypeMapSetListPush(bucket, element);
2294
- ValueTypeMapEntryDtor(element);
2439
+ ValueTypeSetIt it;
2440
+ ValueTypeSetItCtor(&it, self);
2441
+ while(ValueTypeSetItMove(&it)) {
2442
+ ValueTypeSetList* bucket;
2443
+ ValueType element = ValueTypeSetItGet(&it);
2444
+ bucket = &buckets[ValueTypeIdentify(element) % bucket_count];
2445
+ ValueTypeSetListPush(bucket, element);
2446
+ ValueTypeDtor(element);
2295
2447
  }
2296
- ValueTypeMapSetDtor(self);
2448
+ ValueTypeSetDtor(self);
2297
2449
  }
2298
2450
  self->buckets = buckets;
2299
2451
  self->bucket_count = bucket_count;
2300
2452
  self->size = size;
2301
2453
  }
2302
- AUTOC_STATIC void ValueTypeMapSetCtor(ValueTypeMapSet* self) {
2454
+ static int ValueTypeSetContainsAllOf(ValueTypeSet* self, ValueTypeSet* other) {
2455
+ ValueTypeSetIt it;
2456
+ ValueTypeSetItCtor(&it, self);
2457
+ while(ValueTypeSetItMove(&it)) {
2458
+ int found = 0;
2459
+ if(ValueTypeSetContains(other, *ValueTypeSetItGetRef(&it))) found = 1;
2460
+ if(!found) return 0;
2461
+ }
2462
+ return 1;
2463
+ }
2464
+ void ValueTypeSetCtor(ValueTypeSet* self) {
2303
2465
  assert(self);
2304
2466
  self->min_bucket_count = 16;
2305
2467
  self->min_fill = 20;
@@ -2308,362 +2470,687 @@ AUTOC_STATIC void ValueTypeMapSetCtor(ValueTypeMapSet* self) {
2308
2470
  self->max_size = (size_t)((float)self->max_fill/100*self->min_bucket_count);
2309
2471
  self->capacity_multiplier = 200;
2310
2472
  self->buckets = NULL;
2311
- ValueTypeMapSetRehash(self);
2473
+ ValueTypeSetRehash(self);
2312
2474
  }
2313
- AUTOC_STATIC void ValueTypeMapSetDtor(ValueTypeMapSet* self) {
2475
+ void ValueTypeSetDtor(ValueTypeSet* self) {
2314
2476
  size_t i;
2315
2477
  assert(self);
2316
2478
  for(i = 0; i < self->bucket_count; ++i) {
2317
- ValueTypeMapSetListDtor(&self->buckets[i]);
2479
+ ValueTypeSetListDtor(&self->buckets[i]);
2318
2480
  }
2319
2481
  free(self->buckets);
2320
2482
  }
2321
- AUTOC_STATIC void ValueTypeMapSetCopy(ValueTypeMapSet* dst, ValueTypeMapSet* src) {
2322
- ValueTypeMapSetIt it;
2483
+ void ValueTypeSetCopy(ValueTypeSet* dst,ValueTypeSet* src) {
2484
+ ValueTypeSetIt it;
2323
2485
  assert(src);
2324
2486
  assert(dst);
2325
- ValueTypeMapSetCtor(dst);
2326
- ValueTypeMapSetItCtor(&it, src);
2327
- while(ValueTypeMapSetItMove(&it)) ValueTypeMapSetPut(dst, *ValueTypeMapSetItGetRef(&it));
2328
- }
2329
- static int ValueTypeMapSetContainsAllOf(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2330
- ValueTypeMapSetIt it;
2331
- ValueTypeMapSetItCtor(&it, self);
2332
- while(ValueTypeMapSetItMove(&it)) {
2333
- int found = 0;
2334
- if(ValueTypeMapSetContains(other, *ValueTypeMapSetItGetRef(&it))) found = 1;
2335
- if(!found) return 0;
2336
- }
2337
- return 1;
2487
+ ValueTypeSetCtor(dst);
2488
+ ValueTypeSetItCtor(&it, src);
2489
+ while(ValueTypeSetItMove(&it)) ValueTypeSetPut(dst, *ValueTypeSetItGetRef(&it));
2338
2490
  }
2339
- AUTOC_STATIC int ValueTypeMapSetEqual(ValueTypeMapSet* lt, ValueTypeMapSet* rt) {
2491
+ int ValueTypeSetEqual(ValueTypeSet* lt,ValueTypeSet* rt) {
2340
2492
  assert(lt);
2341
2493
  assert(rt);
2342
- return ValueTypeMapSetSize(lt) == ValueTypeMapSetSize(rt) && ValueTypeMapSetContainsAllOf(lt, rt) && ValueTypeMapSetContainsAllOf(rt, lt);
2494
+ return ValueTypeSetSize(lt) == ValueTypeSetSize(rt) && ValueTypeSetContainsAllOf(lt, rt) && ValueTypeSetContainsAllOf(rt, lt);
2343
2495
  }
2344
- AUTOC_STATIC size_t ValueTypeMapSetIdentify(ValueTypeMapSet* self) {
2345
- ValueTypeMapSetIt it;
2496
+ size_t ValueTypeSetIdentify(ValueTypeSet* self) {
2497
+ ValueTypeSetIt it;
2346
2498
  size_t result = 0;
2347
2499
  assert(self);
2348
- ValueTypeMapSetItCtor(&it, self);
2349
- while(ValueTypeMapSetItMove(&it)) {
2350
- ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2351
- result ^= ValueTypeMapEntryIdentify(*e);
2500
+ ValueTypeSetItCtor(&it, self);
2501
+ while(ValueTypeSetItMove(&it)) {
2502
+ ValueType* e = ValueTypeSetItGetRef(&it);
2503
+ result ^= ValueTypeIdentify(*e);
2352
2504
  result = AUTOC_RCYCLE(result);
2353
2505
  }
2354
2506
  return result;
2355
2507
  }
2356
- AUTOC_STATIC void ValueTypeMapSetPurge(ValueTypeMapSet* self) {
2508
+ void ValueTypeSetPurge(ValueTypeSet* self) {
2357
2509
  assert(self);
2358
- ValueTypeMapSetDtor(self);
2510
+ ValueTypeSetDtor(self);
2359
2511
  self->buckets = NULL;
2360
- ValueTypeMapSetRehash(self);
2512
+ ValueTypeSetRehash(self);
2361
2513
  }
2362
- AUTOC_STATIC int ValueTypeMapSetContains(ValueTypeMapSet* self, ValueTypeMapEntry element) {
2514
+ int ValueTypeSetContains(ValueTypeSet* self, ValueType element) {
2363
2515
  assert(self);
2364
- return ValueTypeMapSetListContains(&self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count], element);
2516
+ return ValueTypeSetListContains(&self->buckets[ValueTypeIdentify(element) % self->bucket_count], element);
2365
2517
  }
2366
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetGet(ValueTypeMapSet* self, ValueTypeMapEntry element) {
2367
- ValueTypeMapEntry result;
2518
+ ValueType ValueTypeSetGet(ValueTypeSet* self, ValueType element) {
2519
+ ValueType result;
2368
2520
  assert(self);
2369
- assert(ValueTypeMapSetContains(self, element));
2370
- result = ValueTypeMapSetListFind(&self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count], element);
2521
+ assert(ValueTypeSetContains(self, element));
2522
+ result = ValueTypeSetListFind(&self->buckets[ValueTypeIdentify(element) % self->bucket_count], element);
2371
2523
  return result;
2372
2524
  }
2373
- AUTOC_STATIC size_t ValueTypeMapSetSize(ValueTypeMapSet* self) {
2525
+ size_t ValueTypeSetSize(ValueTypeSet* self) {
2374
2526
  assert(self);
2375
2527
  return self->size;
2376
2528
  }
2377
- AUTOC_STATIC int ValueTypeMapSetPut(ValueTypeMapSet* self, ValueTypeMapEntry element) {
2378
- ValueTypeMapSetList* bucket;
2529
+ int ValueTypeSetPut(ValueTypeSet* self, ValueType element) {
2530
+ ValueTypeSetList* bucket;
2379
2531
  assert(self);
2380
- bucket = &self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count];
2381
- if(!ValueTypeMapSetListContains(bucket, element)) {
2382
- ValueTypeMapSetListPush(bucket, element);
2532
+ bucket = &self->buckets[ValueTypeIdentify(element) % self->bucket_count];
2533
+ if(!ValueTypeSetListContains(bucket, element)) {
2534
+ ValueTypeSetListPush(bucket, element);
2383
2535
  ++self->size;
2384
- ValueTypeMapSetRehash(self);
2536
+ ValueTypeSetRehash(self);
2385
2537
  return 1;
2386
2538
  }
2387
2539
  return 0;
2388
2540
  }
2389
- AUTOC_STATIC int ValueTypeMapSetReplace(ValueTypeMapSet* self, ValueTypeMapEntry element) {
2390
- ValueTypeMapSetList* bucket;
2541
+ int ValueTypeSetReplace(ValueTypeSet* self, ValueType element) {
2542
+ ValueTypeSetList* bucket;
2391
2543
  assert(self);
2392
- bucket = &self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count];
2393
- return ValueTypeMapSetListReplace(bucket, element);
2544
+ bucket = &self->buckets[ValueTypeIdentify(element) % self->bucket_count];
2545
+ return ValueTypeSetListReplace(bucket, element);
2394
2546
  }
2395
- AUTOC_STATIC int ValueTypeMapSetRemove(ValueTypeMapSet* self, ValueTypeMapEntry element) {
2396
- ValueTypeMapSetList* bucket;
2547
+ int ValueTypeSetRemove(ValueTypeSet* self, ValueType element) {
2548
+ ValueTypeSetList* bucket;
2397
2549
  assert(self);
2398
- bucket = &self->buckets[ValueTypeMapEntryIdentify(element) % self->bucket_count];
2399
- if(ValueTypeMapSetListRemove(bucket, element)) {
2550
+ bucket = &self->buckets[ValueTypeIdentify(element) % self->bucket_count];
2551
+ if(ValueTypeSetListRemove(bucket, element)) {
2400
2552
  --self->size;
2401
- ValueTypeMapSetRehash(self);
2553
+ ValueTypeSetRehash(self);
2402
2554
  return 1;
2403
2555
  }
2404
2556
  return 0;
2405
2557
  }
2406
- AUTOC_STATIC void ValueTypeMapSetExclude(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2407
- ValueTypeMapSetIt it;
2558
+ void ValueTypeSetExclude(ValueTypeSet* self, ValueTypeSet* other) {
2559
+ ValueTypeSetIt it;
2408
2560
  assert(self);
2409
2561
  assert(other);
2410
- ValueTypeMapSetItCtor(&it, other);
2411
- while(ValueTypeMapSetItMove(&it)) ValueTypeMapSetRemove(self, *ValueTypeMapSetItGetRef(&it));
2562
+ ValueTypeSetItCtor(&it, other);
2563
+ while(ValueTypeSetItMove(&it)) ValueTypeSetRemove(self, *ValueTypeSetItGetRef(&it));
2412
2564
  }
2413
- AUTOC_STATIC void ValueTypeMapSetInclude(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2414
- ValueTypeMapSetIt it;
2565
+ void ValueTypeSetInclude(ValueTypeSet* self, ValueTypeSet* other) {
2566
+ ValueTypeSetIt it;
2415
2567
  assert(self);
2416
2568
  assert(other);
2417
- ValueTypeMapSetItCtor(&it, other);
2418
- while(ValueTypeMapSetItMove(&it)) ValueTypeMapSetPut(self, *ValueTypeMapSetItGetRef(&it));
2569
+ ValueTypeSetItCtor(&it, other);
2570
+ while(ValueTypeSetItMove(&it)) ValueTypeSetPut(self, *ValueTypeSetItGetRef(&it));
2419
2571
  }
2420
- AUTOC_STATIC void ValueTypeMapSetRetain(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2421
- ValueTypeMapSetIt it;
2422
- ValueTypeMapSet set;
2572
+ void ValueTypeSetRetain(ValueTypeSet* self, ValueTypeSet* other) {
2573
+ ValueTypeSetIt it;
2574
+ ValueTypeSet set;
2423
2575
  assert(self);
2424
2576
  assert(other);
2425
- ValueTypeMapSetCtor(&set);
2426
- ValueTypeMapSetItCtor(&it, self);
2427
- while(ValueTypeMapSetItMove(&it)) {
2428
- ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2429
- if(ValueTypeMapSetContains(other, *e)) ValueTypeMapSetPut(&set, *e);
2577
+ ValueTypeSetCtor(&set);
2578
+ ValueTypeSetItCtor(&it, self);
2579
+ while(ValueTypeSetItMove(&it)) {
2580
+ ValueType* e = ValueTypeSetItGetRef(&it);
2581
+ if(ValueTypeSetContains(other, *e)) ValueTypeSetPut(&set, *e);
2430
2582
  }
2431
- ValueTypeMapSetDtor(self);
2583
+ ValueTypeSetDtor(self);
2432
2584
  *self = set;
2433
2585
  }
2434
- AUTOC_STATIC void ValueTypeMapSetInvert(ValueTypeMapSet* self, ValueTypeMapSet* other) {
2435
- ValueTypeMapSetIt it;
2436
- ValueTypeMapSet set;
2586
+ void ValueTypeSetInvert(ValueTypeSet* self, ValueTypeSet* other) {
2587
+ ValueTypeSetIt it;
2588
+ ValueTypeSet set;
2437
2589
  assert(self);
2438
2590
  assert(other);
2439
- ValueTypeMapSetCtor(&set);
2440
- ValueTypeMapSetItCtor(&it, self);
2441
- while(ValueTypeMapSetItMove(&it)) {
2442
- ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2443
- if(!ValueTypeMapSetContains(other, *e)) ValueTypeMapSetPut(&set, *e);
2591
+ ValueTypeSetCtor(&set);
2592
+ ValueTypeSetItCtor(&it, self);
2593
+ while(ValueTypeSetItMove(&it)) {
2594
+ ValueType* e = ValueTypeSetItGetRef(&it);
2595
+ if(!ValueTypeSetContains(other, *e)) ValueTypeSetPut(&set, *e);
2444
2596
  }
2445
- ValueTypeMapSetItCtor(&it, other);
2446
- while(ValueTypeMapSetItMove(&it)) {
2447
- ValueTypeMapEntry* e = ValueTypeMapSetItGetRef(&it);
2448
- if(!ValueTypeMapSetContains(self, *e)) ValueTypeMapSetPut(&set, *e);
2597
+ ValueTypeSetItCtor(&it, other);
2598
+ while(ValueTypeSetItMove(&it)) {
2599
+ ValueType* e = ValueTypeSetItGetRef(&it);
2600
+ if(!ValueTypeSetContains(self, *e)) ValueTypeSetPut(&set, *e);
2449
2601
  }
2450
- ValueTypeMapSetDtor(self);
2602
+ ValueTypeSetDtor(self);
2451
2603
  *self = set;
2452
2604
  }
2453
- AUTOC_STATIC void ValueTypeMapSetItCtor(ValueTypeMapSetIt* self, ValueTypeMapSet* set) {
2605
+ void ValueTypeSetItCtor(ValueTypeSetIt* self, ValueTypeSet* set) {
2454
2606
  assert(self);
2455
2607
  self->set = set;
2456
2608
  self->bucket_index = -1;
2457
2609
  }
2458
- AUTOC_STATIC int ValueTypeMapSetItMove(ValueTypeMapSetIt* self) {
2610
+ int ValueTypeSetItMove(ValueTypeSetIt* self) {
2459
2611
  assert(self);
2460
- if(self->bucket_index < 0) ValueTypeMapSetListItCtor(&self->it, &self->set->buckets[self->bucket_index = 0]);
2461
- if(ValueTypeMapSetListItMove(&self->it)) return 1;
2612
+ if(self->bucket_index < 0) ValueTypeSetListItCtor(&self->it, &self->set->buckets[self->bucket_index = 0]);
2613
+ if(ValueTypeSetListItMove(&self->it)) return 1;
2462
2614
  while(++self->bucket_index < self->set->bucket_count) {
2463
- ValueTypeMapSetListItCtor(&self->it, &self->set->buckets[self->bucket_index]);
2464
- if(ValueTypeMapSetListItMove(&self->it)) return 1;
2615
+ ValueTypeSetListItCtor(&self->it, &self->set->buckets[self->bucket_index]);
2616
+ if(ValueTypeSetListItMove(&self->it)) return 1;
2465
2617
  }
2466
2618
  return 0;
2467
2619
  }
2468
- AUTOC_STATIC ValueTypeMapEntry ValueTypeMapSetItGet(ValueTypeMapSetIt* self) {
2620
+ ValueType ValueTypeSetItGet(ValueTypeSetIt* self) {
2469
2621
  assert(self);
2470
- return ValueTypeMapSetListItGet(&self->it);
2622
+ return ValueTypeSetListItGet(&self->it);
2471
2623
  }
2472
- AUTOC_STATIC ValueTypeMapEntry* ValueTypeMapSetItGetRef(ValueTypeMapSetIt* self) {
2624
+ ValueType* ValueTypeSetItGetRef(ValueTypeSetIt* self) {
2473
2625
  assert(self);
2474
- return ValueTypeMapSetListItGetRef(&self->it);
2626
+ return ValueTypeSetListItGetRef(&self->it);
2475
2627
  }
2476
2628
 
2477
- static ValueTypeMapEntry* ValueTypeMapItGetEntryRef(ValueTypeMapIt*);
2478
- void ValueTypeMapCtor(ValueTypeMap* self) {
2629
+ #define AUTOC_COUNTER(p) (*(size_t*)((char*)(p) + sizeof(ValueType)))
2630
+ ValueType* ValueTypeNew() {
2631
+ ValueType* self = (ValueType*)malloc(sizeof(ValueType) + sizeof(size_t));
2479
2632
  assert(self);
2480
- ValueTypeMapSetCtor(&self->entries);
2633
+ ValueTypeCtor(*self);
2634
+ AUTOC_COUNTER(self) = 1;
2635
+ return self;
2481
2636
  }
2482
- void ValueTypeMapDtor(ValueTypeMap* self) {
2637
+ ValueType* ValueTypeRef(ValueType* self) {
2483
2638
  assert(self);
2484
- ValueTypeMapSetDtor(&self->entries);
2639
+ ++AUTOC_COUNTER(self);
2640
+ return self;
2485
2641
  }
2486
- static int ValueTypeMapPutEntryRef(ValueTypeMap* self, ValueTypeMapEntry* entry) {
2487
- int absent;
2642
+ void ValueTypeFree(ValueType* self) {
2488
2643
  assert(self);
2489
- assert(entry);
2490
- if((absent = !ValueTypeMapContainsKey(self, entry->key))) {
2491
- ValueTypeMapSetPut(&self->entries, *entry);
2644
+ if(--AUTOC_COUNTER(self) == 0) {
2645
+ ValueTypeDtor(*self);
2646
+ free(self);
2492
2647
  }
2493
- return absent;
2494
2648
  }
2495
- void ValueTypeMapCopy(ValueTypeMap* dst, ValueTypeMap* src) {
2496
- ValueTypeMapIt it;
2649
+ #undef AUTOC_COUNTER
2650
+
2651
+ ValueType* ValueTypeListItGetRef(ValueTypeListIt*);
2652
+ void ValueTypeListCtor(ValueTypeList* self) {
2653
+ assert(self);
2654
+ self->head_node = NULL;
2655
+ self->node_count = 0;
2656
+ }
2657
+ void ValueTypeListDtor(ValueTypeList* self) {
2658
+ ValueTypeListNode* node;
2659
+ assert(self);
2660
+ node = self->head_node;
2661
+ while(node) {
2662
+ ValueTypeListNode* this_node = node;
2663
+ node = node->next_node;
2664
+ ValueTypeDtor(this_node->element);
2665
+ free(this_node);
2666
+ }
2667
+ }
2668
+ void ValueTypeListCopy(ValueTypeList* dst,ValueTypeList* src) {
2669
+ ValueTypeListIt it;
2497
2670
  assert(src);
2498
2671
  assert(dst);
2499
- ValueTypeMapCtor(dst);
2500
- ValueTypeMapItCtor(&it, src);
2501
- while(ValueTypeMapItMove(&it)) {
2502
- ValueTypeMapEntry* e = ValueTypeMapItGetEntryRef(&it);
2503
- ValueTypeMapPutEntryRef(dst, e);
2672
+ ValueTypeListCtor(dst);
2673
+ ValueTypeListItCtor(&it, src);
2674
+ while(ValueTypeListItMove(&it)) {
2675
+ ValueTypeListPush(dst, *ValueTypeListItGetRef(&it));
2504
2676
  }
2505
2677
  }
2506
- static int ValueTypeMapContainsAllOf(ValueTypeMap* self, ValueTypeMap* other) {
2507
- ValueTypeMapIt it;
2508
- ValueTypeMapItCtor(&it, self);
2509
- while(ValueTypeMapItMove(&it)) {
2510
- int found = 0;
2511
- ValueTypeMapEntry* e = ValueTypeMapItGetEntryRef(&it);
2512
- if(ValueTypeMapContainsKey(other, e->key)) {
2513
- ValueType other_value = ValueTypeMapGet(other, e->key);
2514
- found = ValueTypeEqual(e->value, other_value);
2515
- ValueTypeDtor(other_value);
2678
+ int ValueTypeListEqual(ValueTypeList* lt,ValueTypeList* rt) {
2679
+ if(ValueTypeListSize(lt) == ValueTypeListSize(rt)) {
2680
+ ValueTypeListIt lit, rit;
2681
+ ValueTypeListItCtor(&lit, lt);
2682
+ ValueTypeListItCtor(&rit, rt);
2683
+ while(ValueTypeListItMove(&lit) && ValueTypeListItMove(&rit)) {
2684
+ int equal;
2685
+ ValueType* le;
2686
+ ValueType* re;
2687
+ le = ValueTypeListItGetRef(&lit);
2688
+ re = ValueTypeListItGetRef(&rit);
2689
+ equal = ValueTypeEqual(*le,*re);
2690
+ if(!equal) return 0;
2516
2691
  }
2517
- if(!found) return 0;
2518
- }
2519
- return 1;
2520
- }
2521
- int ValueTypeMapEqual(ValueTypeMap* lt, ValueTypeMap* rt) {
2522
- assert(lt);
2523
- assert(rt);
2524
- return ValueTypeMapSize(lt) == ValueTypeMapSize(rt) && ValueTypeMapContainsAllOf(lt, rt) && ValueTypeMapContainsAllOf(rt, lt);
2692
+ return 1;
2693
+ } else
2694
+ return 0;
2525
2695
  }
2526
- size_t ValueTypeMapIdentify(ValueTypeMap* self) {
2696
+ size_t ValueTypeListIdentify(ValueTypeList* self) {
2697
+ ValueTypeListNode* node;
2698
+ size_t result = 0;
2527
2699
  assert(self);
2528
- return ValueTypeMapSetIdentify(&self->entries); /* TODO : make use of the values' hashes */
2700
+ for(node = self->head_node; node != NULL; node = node->next_node) {
2701
+ result ^= ValueTypeIdentify(node->element);
2702
+ result = AUTOC_RCYCLE(result);
2703
+ }
2704
+ return result;
2529
2705
  }
2530
- void ValueTypeMapPurge(ValueTypeMap* self) {
2706
+ void ValueTypeListPurge(ValueTypeList* self) {
2707
+ ValueTypeListDtor(self);
2708
+ ValueTypeListCtor(self);
2709
+ }
2710
+ ValueType ValueTypeListPeek(ValueTypeList* self) {
2711
+ ValueType result;
2531
2712
  assert(self);
2532
- ValueTypeMapSetPurge(&self->entries);
2713
+ assert(!ValueTypeListEmpty(self));
2714
+ ValueTypeCopy(result,self->head_node->element);
2715
+ return result;
2533
2716
  }
2534
- size_t ValueTypeMapSize(ValueTypeMap* self) {
2717
+ ValueType ValueTypeListPop(ValueTypeList* self) {
2718
+ ValueTypeListNode* node;
2719
+ ValueType result;
2535
2720
  assert(self);
2536
- return ValueTypeMapSetSize(&self->entries);
2721
+ assert(!ValueTypeListEmpty(self));
2722
+ node = self->head_node;
2723
+ result = node->element;
2724
+ self->head_node = self->head_node->next_node;
2725
+ --self->node_count;
2726
+ free(node);
2727
+ return result;
2537
2728
  }
2538
- int ValueTypeMapContainsKey(ValueTypeMap* self, ValueType key) {
2539
- int result;
2540
- ValueTypeMapEntry entry;
2729
+ void ValueTypeListPush(ValueTypeList* self, ValueType element) {
2730
+ ValueTypeListNode* node;
2541
2731
  assert(self);
2542
- result = ValueTypeMapSetContains(&self->entries, entry = ValueTypeMapEntryKeyOnlyRef(&key));
2543
- ValueTypeMapEntryDtor(entry);
2732
+ node = (ValueTypeListNode*)malloc(sizeof(ValueTypeListNode));
2733
+ assert(node);
2734
+ ValueTypeCopy(node->element,element);
2735
+ node->next_node = self->head_node;
2736
+ self->head_node = node;
2737
+ ++self->node_count;
2738
+ }
2739
+ int ValueTypeListContains(ValueTypeList* self, ValueType what) {
2740
+ ValueTypeListNode* node;
2741
+ int found = 0;
2742
+ assert(self);
2743
+ node = self->head_node;
2744
+ while(node) {
2745
+ if(ValueTypeEqual(node->element,what)) {
2746
+ found = 1;
2747
+ break;
2748
+ }
2749
+ node = node->next_node;
2750
+ }
2751
+ return found;
2752
+ }
2753
+ ValueType ValueTypeListFind(ValueTypeList* self, ValueType what) {
2754
+ ValueTypeListNode* node;
2755
+ assert(self);
2756
+ assert(ValueTypeListContains(self, what));
2757
+ node = self->head_node;
2758
+ while(node) {
2759
+ if(ValueTypeEqual(node->element,what)) {
2760
+ ValueType result;
2761
+ ValueTypeCopy(result,node->element);
2762
+ return result;
2763
+ }
2764
+ node = node->next_node;
2765
+ }
2766
+ abort();
2767
+ }
2768
+ int ValueTypeListReplaceEx(ValueTypeList* self, ValueType with, int count) {
2769
+ ValueTypeListNode* node;
2770
+ int replaced = 0;
2771
+ assert(self);
2772
+ if(count == 0) return 0;
2773
+ node = self->head_node;
2774
+ while(node) {
2775
+ if(ValueTypeEqual(node->element,with)) {
2776
+ ValueTypeDtor(node->element);
2777
+ ValueTypeCopy(node->element,with);
2778
+ ++replaced;
2779
+ if(count > 0 && replaced >= count) break;
2780
+ }
2781
+ node = node->next_node;
2782
+ }
2783
+ return replaced;
2784
+ }
2785
+ int ValueTypeListRemoveEx(ValueTypeList* self, ValueType what, int count) {
2786
+ ValueTypeListNode *node, *prev_node;
2787
+ int removed = 0;
2788
+ assert(self);
2789
+ if(count == 0) return 0;
2790
+ node = self->head_node;
2791
+ prev_node = NULL;
2792
+ while(node) {
2793
+ if(ValueTypeEqual(node->element,what)) {
2794
+ ValueTypeListNode* this_node;
2795
+ if(prev_node) {
2796
+ this_node = prev_node->next_node = node->next_node;
2797
+ } else {
2798
+ this_node = self->head_node = node->next_node;
2799
+ }
2800
+ ++removed;
2801
+ --self->node_count;
2802
+ ValueTypeDtor(node->element);
2803
+ free(node);
2804
+ node = this_node;
2805
+ if(count > 0 && removed >= count) break;
2806
+ } else {
2807
+ prev_node = node;
2808
+ node = node->next_node;
2809
+ }
2810
+ }
2811
+ return removed;
2812
+ }
2813
+ size_t ValueTypeListSize(ValueTypeList* self) {
2814
+ assert(self);
2815
+ return self->node_count;
2816
+ }
2817
+ void ValueTypeListItCtor(ValueTypeListIt* self, ValueTypeList* list) {
2818
+ assert(self);
2819
+ assert(list);
2820
+ self->start = 1;
2821
+ self->list = list;
2822
+ }
2823
+ int ValueTypeListItMove(ValueTypeListIt* self) {
2824
+ assert(self);
2825
+ if(self->start) {
2826
+ self->this_node = self->list->head_node;
2827
+ self->start = 0;
2828
+ } else {
2829
+ self->this_node = self->this_node ? self->this_node->next_node : NULL;
2830
+ }
2831
+ return self->this_node != NULL;
2832
+ }
2833
+ ValueType ValueTypeListItGet(ValueTypeListIt* self) {
2834
+ ValueType result;
2835
+ assert(self);
2836
+ assert(self->this_node);
2837
+ ValueTypeCopy(result,self->this_node->element);
2544
2838
  return result;
2545
2839
  }
2546
- ValueType ValueTypeMapGet(ValueTypeMap* self, ValueType key) {
2840
+ ValueType* ValueTypeListItGetRef(ValueTypeListIt* self) {
2841
+ assert(self);
2842
+ assert(self->this_node);
2843
+ return &self->this_node->element;
2844
+ }
2845
+
2846
+ ValueType* ValueTypeQueueItGetRef(ValueTypeQueueIt*);
2847
+ void ValueTypeQueueCtor(ValueTypeQueue* self) {
2848
+ assert(self);
2849
+ self->head_node = self->tail_node = NULL;
2850
+ self->node_count = 0;
2851
+ }
2852
+ void ValueTypeQueueDtor(ValueTypeQueue* self) {
2853
+ ValueTypeQueueNode* node;
2854
+ assert(self);
2855
+ node = self->head_node;
2856
+ while(node) {
2857
+ ValueTypeQueueNode* this_node = node;
2858
+ node = node->next_node;
2859
+ ValueTypeDtor(this_node->element);
2860
+ free(this_node);
2861
+ }
2862
+ }
2863
+ void ValueTypeQueueCopy(ValueTypeQueue* dst,ValueTypeQueue* src) {
2864
+ ValueTypeQueueIt it;
2865
+ assert(src);
2866
+ assert(dst);
2867
+ ValueTypeQueueCtor(dst);
2868
+ ValueTypeQueueItCtor(&it, src);
2869
+ while(ValueTypeQueueItMove(&it)) {
2870
+ ValueType element;
2871
+ ValueTypeQueuePushTail(dst, element = ValueTypeQueueItGet(&it));
2872
+ ValueTypeDtor(element);
2873
+ }
2874
+ }
2875
+ int ValueTypeQueueEqual(ValueTypeQueue* lt,ValueTypeQueue* rt) {
2876
+ if(ValueTypeQueueSize(lt) == ValueTypeQueueSize(rt)) {
2877
+ ValueTypeQueueIt lit, rit;
2878
+ ValueTypeQueueItCtor(&lit, lt);
2879
+ ValueTypeQueueItCtor(&rit, rt);
2880
+ while(ValueTypeQueueItMove(&lit) && ValueTypeQueueItMove(&rit)) {
2881
+ int equal;
2882
+ ValueType *le, *re;
2883
+ le = ValueTypeQueueItGetRef(&lit);
2884
+ re = ValueTypeQueueItGetRef(&rit);
2885
+ equal = ValueTypeEqual(*le,*re);
2886
+ if(!equal) return 0;
2887
+ }
2888
+ return 1;
2889
+ } else
2890
+ return 0;
2891
+ }
2892
+ size_t ValueTypeQueueIdentify(ValueTypeQueue* self) {
2893
+ ValueTypeQueueNode* node;
2894
+ size_t result = 0;
2895
+ assert(self);
2896
+ for(node = self->head_node; node != NULL; node = node->next_node) {
2897
+ result ^= ValueTypeIdentify(node->element);
2898
+ result = AUTOC_RCYCLE(result);
2899
+ }
2900
+ return result;
2901
+ }
2902
+ void ValueTypeQueuePurge(ValueTypeQueue* self) {
2903
+ ValueTypeQueueDtor(self);
2904
+ ValueTypeQueueCtor(self);
2905
+ }
2906
+ ValueType ValueTypeQueuePeekHead(ValueTypeQueue* self) {
2547
2907
  ValueType result;
2548
- ValueTypeMapEntry entry, existing_entry;
2549
2908
  assert(self);
2550
- assert(ValueTypeMapContainsKey(self, key));
2551
- existing_entry = ValueTypeMapSetGet(&self->entries, entry = ValueTypeMapEntryKeyOnlyRef(&key));
2552
- ValueTypeCopy(result, existing_entry.value);
2553
- ValueTypeMapEntryDtor(existing_entry);
2554
- ValueTypeMapEntryDtor(entry);
2909
+ assert(!ValueTypeQueueEmpty(self));
2910
+ ValueTypeCopy(result,self->head_node->element);
2555
2911
  return result;
2556
2912
  }
2557
- int ValueTypeMapPut(ValueTypeMap* self, ValueType key, ValueType value) {
2558
- int result;
2559
- ValueTypeMapEntry entry;
2913
+ ValueType ValueTypeQueuePeekTail(ValueTypeQueue* self) {
2914
+ ValueType result;
2560
2915
  assert(self);
2561
- entry = ValueTypeMapEntryKeyValueRef(&key, &value);
2562
- result = ValueTypeMapPutEntryRef(self, &entry);
2563
- ValueTypeMapEntryDtor(entry);
2916
+ assert(!ValueTypeQueueEmpty(self));
2917
+ ValueTypeCopy(result,self->tail_node->element);
2564
2918
  return result;
2565
2919
  }
2566
- int ValueTypeMapReplace(ValueTypeMap* self, ValueType key, ValueType value) {
2567
- int result;
2568
- ValueTypeMapEntry entry;
2920
+ ValueType ValueTypeQueuePopHead(ValueTypeQueue* self) {
2921
+ ValueTypeQueueNode* node;
2922
+ ValueType result;
2569
2923
  assert(self);
2570
- entry = ValueTypeMapEntryKeyValueRef(&key, &value);
2571
- result = ValueTypeMapSetReplace(&self->entries, entry);
2572
- ValueTypeMapEntryDtor(entry);
2924
+ assert(!ValueTypeQueueEmpty(self));
2925
+ node = self->head_node;
2926
+ result = node->element;
2927
+ self->head_node = self->head_node->next_node;
2928
+ self->head_node->prev_node = NULL;
2929
+ --self->node_count;
2930
+ free(node);
2931
+ return result;
2932
+ }
2933
+ ValueType ValueTypeQueuePopTail(ValueTypeQueue* self) {
2934
+ ValueTypeQueueNode* node;
2935
+ ValueType result;
2936
+ assert(self);
2937
+ assert(!ValueTypeQueueEmpty(self));
2938
+ node = self->tail_node;
2939
+ result = node->element;
2940
+ self->tail_node = self->tail_node->prev_node;
2941
+ self->tail_node->next_node = NULL;
2942
+ --self->node_count;
2943
+ free(node);
2573
2944
  return result;
2574
2945
  }
2575
- int ValueTypeMapRemove(ValueTypeMap* self, ValueType key) {
2576
- int result;
2577
- ValueTypeMapEntry entry;
2946
+ void ValueTypeQueuePushTail(ValueTypeQueue* self, ValueType element) {
2947
+ ValueTypeQueueNode* node;
2948
+ assert(self);
2949
+ node = (ValueTypeQueueNode*)malloc(sizeof(ValueTypeQueueNode));
2950
+ assert(node);
2951
+ ValueTypeCopy(node->element,element);
2952
+ if(ValueTypeQueueEmpty(self)) {
2953
+ node->prev_node = node->next_node = NULL;
2954
+ self->tail_node = self->head_node = node;
2955
+ } else {
2956
+ node->next_node = NULL;
2957
+ node->prev_node = self->tail_node;
2958
+ self->tail_node->next_node = node;
2959
+ self->tail_node = node;
2960
+ }
2961
+ ++self->node_count;
2962
+ }
2963
+ void ValueTypeQueuePushHead(ValueTypeQueue* self, ValueType element) {
2964
+ ValueTypeQueueNode* node;
2965
+ assert(self);
2966
+ node = (ValueTypeQueueNode*)malloc(sizeof(ValueTypeQueueNode));
2967
+ assert(node);
2968
+ ValueTypeCopy(node->element,element);
2969
+ if(ValueTypeQueueEmpty(self)) {
2970
+ node->prev_node = node->next_node = NULL;
2971
+ self->tail_node = self->head_node = node;
2972
+ } else {
2973
+ node->prev_node = NULL;
2974
+ node->next_node = self->head_node;
2975
+ self->head_node->prev_node = node;
2976
+ self->head_node = node;
2977
+ }
2978
+ ++self->node_count;
2979
+ }
2980
+ int ValueTypeQueueContains(ValueTypeQueue* self, ValueType what) {
2981
+ ValueTypeQueueNode* node;
2982
+ int found = 0;
2983
+ assert(self);
2984
+ node = self->head_node;
2985
+ while(node) {
2986
+ if(ValueTypeEqual(node->element,what)) {
2987
+ found = 1;
2988
+ break;
2989
+ }
2990
+ node = node->next_node;
2991
+ }
2992
+ return found;
2993
+ }
2994
+ ValueType ValueTypeQueueFind(ValueTypeQueue* self, ValueType what) {
2995
+ ValueTypeQueueNode* node;
2996
+ assert(self);
2997
+ assert(ValueTypeQueueContains(self, what));
2998
+ node = self->head_node;
2999
+ while(node) {
3000
+ if(ValueTypeEqual(node->element,what)) {
3001
+ ValueType result;
3002
+ ValueTypeCopy(result,node->element);
3003
+ return result;
3004
+ }
3005
+ node = node->next_node;
3006
+ }
3007
+ abort();
3008
+ }
3009
+ int ValueTypeQueueReplaceEx(ValueTypeQueue* self, ValueType with, int count) {
3010
+ ValueTypeQueueNode* node;
3011
+ int replaced = 0;
3012
+ assert(self);
3013
+ if(count == 0) return 0;
3014
+ node = self->head_node;
3015
+ while(node) {
3016
+ if(ValueTypeEqual(node->element,with)) {
3017
+ ValueTypeDtor(node->element);
3018
+ ValueTypeCopy(node->element,with);
3019
+ ++replaced;
3020
+ if(count > 0 && replaced >= count) break;
3021
+ }
3022
+ node = node->next_node;
3023
+ }
3024
+ return replaced;
3025
+ }
3026
+ int ValueTypeQueueRemoveEx(ValueTypeQueue* self, ValueType what, int count) {
3027
+ ValueTypeQueueNode* node;
3028
+ int removed = 0;
2578
3029
  assert(self);
2579
- result = ValueTypeMapSetRemove(&self->entries, entry = ValueTypeMapEntryKeyOnlyRef(&key));
2580
- ValueTypeMapEntryDtor(entry);
2581
- return result;
3030
+ if(count == 0) return 0;
3031
+ node = self->head_node;
3032
+ while(node) {
3033
+ if(ValueTypeEqual(node->element,what)) {
3034
+ ValueTypeQueueNode* this_node;
3035
+ if(node == self->head_node) {
3036
+ assert(!node->prev_node);
3037
+ this_node = self->head_node = node->next_node;
3038
+ if(self->head_node) self->head_node->prev_node = NULL;
3039
+ } else if(node == self->tail_node) {
3040
+ assert(!node->next_node);
3041
+ self->tail_node = node->prev_node;
3042
+ this_node = self->tail_node->next_node = NULL;
3043
+ } else {
3044
+ assert(node->prev_node);
3045
+ assert(node->next_node);
3046
+ this_node = node->next_node;
3047
+ node->next_node->prev_node = node->prev_node;
3048
+ node->prev_node->next_node = node->next_node;
3049
+ }
3050
+ ++removed;
3051
+ --self->node_count;
3052
+ ValueTypeDtor(node->element);
3053
+ free(node);
3054
+ node = this_node;
3055
+ if(count > 0 && removed >= count) break;
3056
+ } else {
3057
+ node = node->next_node;
3058
+ }
3059
+ }
3060
+ return removed;
2582
3061
  }
2583
- void ValueTypeMapItCtor(ValueTypeMapIt* self, ValueTypeMap* map) {
3062
+ size_t ValueTypeQueueSize(ValueTypeQueue* self) {
2584
3063
  assert(self);
2585
- assert(map);
2586
- ValueTypeMapSetItCtor(&self->it, &map->entries);
3064
+ return self->node_count;
2587
3065
  }
2588
- int ValueTypeMapItMove(ValueTypeMapIt* self) {
3066
+ void ValueTypeQueueItCtorEx(ValueTypeQueueIt* self, ValueTypeQueue* queue, int forward) {
2589
3067
  assert(self);
2590
- return ValueTypeMapSetItMove(&self->it);
3068
+ assert(queue);
3069
+ self->start = 1;
3070
+ self->queue = queue;
3071
+ self->forward = forward;
2591
3072
  }
2592
- ValueType ValueTypeMapItGetKey(ValueTypeMapIt* self) {
2593
- ValueTypeMapEntry* e;
2594
- ValueType key;
3073
+ int ValueTypeQueueItMove(ValueTypeQueueIt* self) {
2595
3074
  assert(self);
2596
- e = ValueTypeMapItGetEntryRef(self);
2597
- ValueTypeCopy(key, e->key);
2598
- return key;
3075
+ if(self->start) {
3076
+ self->this_node = self->forward ? self->queue->head_node : self->queue->tail_node;
3077
+ self->start = 0;
3078
+ } else {
3079
+ self->this_node = self->forward ? self->this_node->next_node : self->this_node->prev_node;
3080
+ }
3081
+ return self->this_node != NULL;
2599
3082
  }
2600
- ValueType ValueTypeMapItGetElement(ValueTypeMapIt* self) {
2601
- ValueTypeMapEntry* e;
2602
- ValueType value;
3083
+ ValueType ValueTypeQueueItGet(ValueTypeQueueIt* self) {
3084
+ ValueType result;
2603
3085
  assert(self);
2604
- e = ValueTypeMapItGetEntryRef(self);
2605
- assert(e->flags & AUTOC_VALID_VALUE);
2606
- ValueTypeCopy(value, e->value);
2607
- return value;
3086
+ assert(self->this_node);
3087
+ ValueTypeCopy(result,self->this_node->element);
3088
+ return result;
2608
3089
  }
2609
- static ValueTypeMapEntry* ValueTypeMapItGetEntryRef(ValueTypeMapIt* self) {
3090
+ ValueType* ValueTypeQueueItGetRef(ValueTypeQueueIt* self) {
2610
3091
  assert(self);
2611
- return ValueTypeMapSetItGetRef(&self->it);
3092
+ assert(self->this_node);
3093
+ return &self->this_node->element;
2612
3094
  }
2613
- #undef AUTOC_VALID_VALUE
2614
- #undef AUTOC_VALID_KEY
2615
- #undef AUTOC_OWNED_VALUE
2616
- #undef AUTOC_OWNED_KEY
2617
3095
 
2618
- static void ValueTypeVectorAllocate(ValueTypeVector* self, size_t element_count) {
3096
+ static void PVectorValueAllocate(PVectorValue* self, size_t element_count) {
2619
3097
  assert(self);
2620
3098
  assert(element_count > 0);
2621
3099
  self->element_count = element_count;
2622
- self->values = (ValueType*)malloc(element_count*sizeof(ValueType));
3100
+ self->values = (ValueType**)malloc(element_count*sizeof(ValueType*));
2623
3101
  assert(self->values);
2624
3102
  }
2625
- void ValueTypeVectorCtor(ValueTypeVector* self, size_t element_count) {
3103
+ void PVectorValueCtor(PVectorValue* self,size_t element_count) {
2626
3104
  size_t index;
2627
3105
  assert(self);
2628
- ValueTypeVectorAllocate(self, element_count);
2629
- for(index = 0; index < ValueTypeVectorSize(self); ++index) {
2630
- ValueTypeCtor(self->values[index]);
3106
+ PVectorValueAllocate(self, element_count);
3107
+ for(index = 0; index < PVectorValueSize(self); ++index) {
3108
+ ((self->values[index]) = ValueTypeNew());
2631
3109
  }
2632
3110
  }
2633
- void ValueTypeVectorDtor(ValueTypeVector* self) {
3111
+ void PVectorValueDtor(PVectorValue* self) {
2634
3112
  size_t index;
2635
3113
  assert(self);
2636
- for(index = 0; index < ValueTypeVectorSize(self); ++index) {
2637
- ValueTypeDtor(self->values[index]);
3114
+ for(index = 0; index < PVectorValueSize(self); ++index) {
3115
+ ValueTypeFree(self->values[index]);
2638
3116
  }
2639
3117
  free(self->values);
2640
3118
  }
2641
- void ValueTypeVectorCopy(ValueTypeVector* dst, ValueTypeVector* src) {
3119
+ void PVectorValueCopy(PVectorValue* dst,PVectorValue* src) {
2642
3120
  size_t index, size;
2643
3121
  assert(src);
2644
3122
  assert(dst);
2645
- ValueTypeVectorAllocate(dst, size = ValueTypeVectorSize(src));
3123
+ PVectorValueAllocate(dst, size = PVectorValueSize(src));
2646
3124
  for(index = 0; index < size; ++index) {
2647
- ValueTypeCopy(dst->values[index], src->values[index]);
3125
+ ((dst->values[index]) = ValueTypeRef(src->values[index]));
2648
3126
  }
2649
3127
  }
2650
- int ValueTypeVectorEqual(ValueTypeVector* lt, ValueTypeVector* rt) {
3128
+ int PVectorValueEqual(PVectorValue* lt,PVectorValue* rt) {
2651
3129
  size_t index, size;
2652
3130
  assert(lt);
2653
3131
  assert(rt);
2654
- if(ValueTypeVectorSize(lt) == (size = ValueTypeVectorSize(rt))) {
3132
+ if(PVectorValueSize(lt) == (size = PVectorValueSize(rt))) {
2655
3133
  for(index = 0; index < size; ++index) {
2656
- if(!ValueTypeEqual(lt->values[index], rt->values[index])) return 0;
3134
+ if(!ValueTypeEqual(*lt->values[index],*rt->values[index])) return 0;
2657
3135
  }
2658
3136
  return 1;
2659
3137
  } else
2660
3138
  return 0;
2661
3139
  }
2662
- void ValueTypeVectorResize(ValueTypeVector* self, size_t new_element_count) {
3140
+ size_t PVectorValueIdentify(PVectorValue* self) {
3141
+ size_t index, result = 0;
3142
+ assert(self);
3143
+ for(index = 0; index < self->element_count; ++index) {
3144
+ result ^= ValueTypeIdentify(*self->values[index]);
3145
+ result = AUTOC_RCYCLE(result);
3146
+ }
3147
+ return result;
3148
+ }
3149
+ void PVectorValueResize(PVectorValue* self, size_t new_element_count) {
2663
3150
  size_t index, element_count, from, to;
2664
3151
  assert(self);
2665
- if((element_count = ValueTypeVectorSize(self)) != new_element_count) {
2666
- ValueType* values = (ValueType*)malloc(new_element_count*sizeof(ValueType));
3152
+ if((element_count = PVectorValueSize(self)) != new_element_count) {
3153
+ ValueType** values = (ValueType**)malloc(new_element_count*sizeof(ValueType*));
2667
3154
  assert(values);
2668
3155
  from = AUTOC_MIN(element_count, new_element_count);
2669
3156
  to = AUTOC_MAX(element_count, new_element_count);
@@ -2672,11 +3159,11 @@ void ValueTypeVectorResize(ValueTypeVector* self, size_t new_element_count) {
2672
3159
  }
2673
3160
  if(element_count > new_element_count) {
2674
3161
  for(index = from; index < to; ++index) {
2675
- ValueTypeDtor(self->values[index]);
3162
+ ValueTypeFree(self->values[index]);
2676
3163
  }
2677
3164
  } else {
2678
3165
  for(index = from; index < to; ++index) {
2679
- ValueTypeCtor(values[index]);
3166
+ ((values[index]) = ValueTypeNew());
2680
3167
  }
2681
3168
  }
2682
3169
  free(self->values);
@@ -2684,28 +3171,237 @@ void ValueTypeVectorResize(ValueTypeVector* self, size_t new_element_count) {
2684
3171
  self->element_count = new_element_count;
2685
3172
  }
2686
3173
  }
2687
- size_t ValueTypeVectorIdentify(ValueTypeVector* self) {
2688
- size_t index, result = 0;
3174
+
3175
+ static int PVectorValueComparator(void* lp_, void* rp_) {
3176
+ ValueType** lp = (ValueType**)lp_;
3177
+ ValueType** rp = (ValueType**)rp_;
3178
+ if(ValueTypeEqual(**lp,**rp)) {
3179
+ return 0;
3180
+ } else if(ValueTypeLess(**lp,**rp)) {
3181
+ return -1;
3182
+ } else {
3183
+ return +1;
3184
+ }
3185
+ }
3186
+ void PVectorValueSort(PVectorValue* self) {
3187
+ typedef int (*F)(const void*, const void*);
2689
3188
  assert(self);
2690
- for(index = 0; index < self->element_count; ++index) {
2691
- result ^= ValueTypeIdentify(self->values[index]);
3189
+ qsort(self->values, PVectorValueSize(self), sizeof(ValueType*), (F)PVectorValueComparator);
3190
+ }
3191
+
3192
+ #define AUTOC_COUNTER(p) (*(size_t*)((char*)(p) + sizeof(PVectorValue)))
3193
+ PVectorValue* PVectorValueNew(size_t element_count) {
3194
+ PVectorValue* self = (PVectorValue*)malloc(sizeof(PVectorValue) + sizeof(size_t));
3195
+ assert(self);
3196
+ _PVectorValueCtor(*self,element_count);
3197
+ AUTOC_COUNTER(self) = 1;
3198
+ return self;
3199
+ }
3200
+ PVectorValue* PVectorValueRef(PVectorValue* self) {
3201
+ assert(self);
3202
+ ++AUTOC_COUNTER(self);
3203
+ return self;
3204
+ }
3205
+ void PVectorValueFree(PVectorValue* self) {
3206
+ assert(self);
3207
+ if(--AUTOC_COUNTER(self) == 0) {
3208
+ _PVectorValueDtor(*self);
3209
+ free(self);
3210
+ }
3211
+ }
3212
+ #undef AUTOC_COUNTER
3213
+
3214
+ PVectorValue** ListPVectorValueItGetRef(ListPVectorValueIt*);
3215
+ void ListPVectorValueCtor(ListPVectorValue* self) {
3216
+ assert(self);
3217
+ self->head_node = NULL;
3218
+ self->node_count = 0;
3219
+ }
3220
+ void ListPVectorValueDtor(ListPVectorValue* self) {
3221
+ ListPVectorValueNode* node;
3222
+ assert(self);
3223
+ node = self->head_node;
3224
+ while(node) {
3225
+ ListPVectorValueNode* this_node = node;
3226
+ node = node->next_node;
3227
+ PVectorValueFree(this_node->element);
3228
+ free(this_node);
3229
+ }
3230
+ }
3231
+ void ListPVectorValueCopy(ListPVectorValue* dst,ListPVectorValue* src) {
3232
+ ListPVectorValueIt it;
3233
+ assert(src);
3234
+ assert(dst);
3235
+ ListPVectorValueCtor(dst);
3236
+ ListPVectorValueItCtor(&it, src);
3237
+ while(ListPVectorValueItMove(&it)) {
3238
+ ListPVectorValuePush(dst, *ListPVectorValueItGetRef(&it));
3239
+ }
3240
+ }
3241
+ int ListPVectorValueEqual(ListPVectorValue* lt,ListPVectorValue* rt) {
3242
+ if(ListPVectorValueSize(lt) == ListPVectorValueSize(rt)) {
3243
+ ListPVectorValueIt lit, rit;
3244
+ ListPVectorValueItCtor(&lit, lt);
3245
+ ListPVectorValueItCtor(&rit, rt);
3246
+ while(ListPVectorValueItMove(&lit) && ListPVectorValueItMove(&rit)) {
3247
+ int equal;
3248
+ PVectorValue** le;
3249
+ PVectorValue** re;
3250
+ le = ListPVectorValueItGetRef(&lit);
3251
+ re = ListPVectorValueItGetRef(&rit);
3252
+ equal = _PVectorValueEqual(**le,**re);
3253
+ if(!equal) return 0;
3254
+ }
3255
+ return 1;
3256
+ } else
3257
+ return 0;
3258
+ }
3259
+ size_t ListPVectorValueIdentify(ListPVectorValue* self) {
3260
+ ListPVectorValueNode* node;
3261
+ size_t result = 0;
3262
+ assert(self);
3263
+ for(node = self->head_node; node != NULL; node = node->next_node) {
3264
+ result ^= _PVectorValueIdentify(*node->element);
2692
3265
  result = AUTOC_RCYCLE(result);
2693
3266
  }
2694
3267
  return result;
2695
3268
  }
2696
- static int ValueTypeVectorComparator(void* lp_, void* rp_) {
2697
- ValueType* lp = (ValueType*)lp_;
2698
- ValueType* rp = (ValueType*)rp_;
2699
- if(ValueTypeEqual(*lp, *rp)) {
2700
- return 0;
2701
- } else if(ValueTypeLess(*lp, *rp)) {
2702
- return -1;
3269
+ void ListPVectorValuePurge(ListPVectorValue* self) {
3270
+ ListPVectorValueDtor(self);
3271
+ ListPVectorValueCtor(self);
3272
+ }
3273
+ PVectorValue* ListPVectorValuePeek(ListPVectorValue* self) {
3274
+ PVectorValue* result;
3275
+ assert(self);
3276
+ assert(!ListPVectorValueEmpty(self));
3277
+ ((result) = PVectorValueRef(self->head_node->element));
3278
+ return result;
3279
+ }
3280
+ PVectorValue* ListPVectorValuePop(ListPVectorValue* self) {
3281
+ ListPVectorValueNode* node;
3282
+ PVectorValue* result;
3283
+ assert(self);
3284
+ assert(!ListPVectorValueEmpty(self));
3285
+ node = self->head_node;
3286
+ result = node->element;
3287
+ self->head_node = self->head_node->next_node;
3288
+ --self->node_count;
3289
+ free(node);
3290
+ return result;
3291
+ }
3292
+ void ListPVectorValuePush(ListPVectorValue* self, PVectorValue* element) {
3293
+ ListPVectorValueNode* node;
3294
+ assert(self);
3295
+ node = (ListPVectorValueNode*)malloc(sizeof(ListPVectorValueNode));
3296
+ assert(node);
3297
+ ((node->element) = PVectorValueRef(element));
3298
+ node->next_node = self->head_node;
3299
+ self->head_node = node;
3300
+ ++self->node_count;
3301
+ }
3302
+ int ListPVectorValueContains(ListPVectorValue* self, PVectorValue* what) {
3303
+ ListPVectorValueNode* node;
3304
+ int found = 0;
3305
+ assert(self);
3306
+ node = self->head_node;
3307
+ while(node) {
3308
+ if(_PVectorValueEqual(*node->element,*what)) {
3309
+ found = 1;
3310
+ break;
3311
+ }
3312
+ node = node->next_node;
3313
+ }
3314
+ return found;
3315
+ }
3316
+ PVectorValue* ListPVectorValueFind(ListPVectorValue* self, PVectorValue* what) {
3317
+ ListPVectorValueNode* node;
3318
+ assert(self);
3319
+ assert(ListPVectorValueContains(self, what));
3320
+ node = self->head_node;
3321
+ while(node) {
3322
+ if(_PVectorValueEqual(*node->element,*what)) {
3323
+ PVectorValue* result;
3324
+ ((result) = PVectorValueRef(node->element));
3325
+ return result;
3326
+ }
3327
+ node = node->next_node;
3328
+ }
3329
+ abort();
3330
+ }
3331
+ int ListPVectorValueReplaceEx(ListPVectorValue* self, PVectorValue* with, int count) {
3332
+ ListPVectorValueNode* node;
3333
+ int replaced = 0;
3334
+ assert(self);
3335
+ if(count == 0) return 0;
3336
+ node = self->head_node;
3337
+ while(node) {
3338
+ if(_PVectorValueEqual(*node->element,*with)) {
3339
+ PVectorValueFree(node->element);
3340
+ ((node->element) = PVectorValueRef(with));
3341
+ ++replaced;
3342
+ if(count > 0 && replaced >= count) break;
3343
+ }
3344
+ node = node->next_node;
3345
+ }
3346
+ return replaced;
3347
+ }
3348
+ int ListPVectorValueRemoveEx(ListPVectorValue* self, PVectorValue* what, int count) {
3349
+ ListPVectorValueNode *node, *prev_node;
3350
+ int removed = 0;
3351
+ assert(self);
3352
+ if(count == 0) return 0;
3353
+ node = self->head_node;
3354
+ prev_node = NULL;
3355
+ while(node) {
3356
+ if(_PVectorValueEqual(*node->element,*what)) {
3357
+ ListPVectorValueNode* this_node;
3358
+ if(prev_node) {
3359
+ this_node = prev_node->next_node = node->next_node;
3360
+ } else {
3361
+ this_node = self->head_node = node->next_node;
3362
+ }
3363
+ ++removed;
3364
+ --self->node_count;
3365
+ PVectorValueFree(node->element);
3366
+ free(node);
3367
+ node = this_node;
3368
+ if(count > 0 && removed >= count) break;
3369
+ } else {
3370
+ prev_node = node;
3371
+ node = node->next_node;
3372
+ }
3373
+ }
3374
+ return removed;
3375
+ }
3376
+ size_t ListPVectorValueSize(ListPVectorValue* self) {
3377
+ assert(self);
3378
+ return self->node_count;
3379
+ }
3380
+ void ListPVectorValueItCtor(ListPVectorValueIt* self, ListPVectorValue* list) {
3381
+ assert(self);
3382
+ assert(list);
3383
+ self->start = 1;
3384
+ self->list = list;
3385
+ }
3386
+ int ListPVectorValueItMove(ListPVectorValueIt* self) {
3387
+ assert(self);
3388
+ if(self->start) {
3389
+ self->this_node = self->list->head_node;
3390
+ self->start = 0;
2703
3391
  } else {
2704
- return +1;
3392
+ self->this_node = self->this_node ? self->this_node->next_node : NULL;
2705
3393
  }
3394
+ return self->this_node != NULL;
2706
3395
  }
2707
- void ValueTypeVectorSort(ValueTypeVector* self) {
2708
- typedef int (*F)(const void*, const void*);
3396
+ PVectorValue* ListPVectorValueItGet(ListPVectorValueIt* self) {
3397
+ PVectorValue* result;
2709
3398
  assert(self);
2710
- qsort(self->values, ValueTypeVectorSize(self), sizeof(ValueType), (F)ValueTypeVectorComparator);
3399
+ assert(self->this_node);
3400
+ ((result) = PVectorValueRef(self->this_node->element));
3401
+ return result;
3402
+ }
3403
+ PVectorValue** ListPVectorValueItGetRef(ListPVectorValueIt* self) {
3404
+ assert(self);
3405
+ assert(self->this_node);
3406
+ return &self->this_node->element;
2711
3407
  }