@@ -118,8 +118,6 @@ typedef struct A
118
118
float max_load_factor ;
119
119
void (* free )(T * );
120
120
T (* copy )(T * );
121
- size_t (* hash )(T * );
122
- int (* equal )(T * , T * );
123
121
#if CTL_USET_SECURITY_COLLCOUNTING == 4
124
122
bool is_sorted_vector ;
125
123
#elif CTL_USET_SECURITY_COLLCOUNTING == 5
@@ -144,11 +142,11 @@ static inline size_t JOIN(A, bucket_count)(A *self)
144
142
static inline size_t JOIN (I , index )(A * self , T value )
145
143
{
146
144
#ifdef CTL_USET_GROWTH_POWER2
147
- return self -> hash (& value ) & self -> bucket_max ;
145
+ return JOIN ( T , hash ) (& value ) & self -> bucket_max ;
148
146
#elif __WORDSIZE == 127
149
- return ((uint64_t ) self -> hash (& value ) * ((uint64_t ) self -> bucket_max + 1 )) >> 32 ;
147
+ return ((uint64_t ) JOIN ( T , hash ) (& value ) * ((uint64_t ) self -> bucket_max + 1 )) >> 32 ;
150
148
#else
151
- return self -> hash (& value ) % (self -> bucket_max + 1 );
149
+ return JOIN ( T , hash ) (& value ) % (self -> bucket_max + 1 );
152
150
#endif
153
151
}
154
152
@@ -322,10 +320,12 @@ JOIN(I, range)(A* container, I* begin, I* end)
322
320
}
323
321
*/
324
322
323
+ // needed for algorithm
325
324
static inline int JOIN (A , _equal )(A * self , T * a , T * b )
326
325
{
327
- ASSERT (self -> equal || !"equal undefined" );
328
- return self -> equal (a , b );
326
+ //ASSERT(JOIN(T, equal) || !"equal undefined");
327
+ (void )self ;
328
+ return JOIN (T , equal )(a , b );
329
329
}
330
330
331
331
static inline A JOIN (A , init_from )(A * copy );
@@ -518,15 +518,15 @@ static inline B **JOIN(A, _bucket_hash)(A *self, size_t hash)
518
518
static inline B * * JOIN (A , _bucket )(A * self , T value )
519
519
{
520
520
const size_t hash = JOIN (I , index )(self , value );
521
- //LOG ("_bucket %lx %% %lu => %zu\n", self-> hash(&value), self->bucket_max + 1, hash);
521
+ //LOG ("_bucket %lx %% %lu => %zu\n", JOIN(T, hash) (&value), self->bucket_max + 1, hash);
522
522
return & self -> buckets [hash ];
523
523
}
524
524
#endif
525
525
526
526
static inline size_t JOIN (A , bucket )(A * self , T value )
527
527
{
528
528
const size_t hash = JOIN (I , index )(self , value );
529
- //LOG ("bucket %lx %% %lu => %zu\n", self-> hash(&value), self->bucket_max + 1, hash);
529
+ //LOG ("bucket %lx %% %lu => %zu\n", JOIN(T, hash) (&value), self->bucket_max + 1, hash);
530
530
return hash ;
531
531
}
532
532
@@ -613,12 +613,10 @@ static inline void JOIN(A, reserve)(A *self, size_t desired_count)
613
613
JOIN (A , _rehash )(self , new_size );
614
614
}
615
615
616
- static inline A JOIN (A , init )(size_t ( * _hash )( T * ), int ( * _equal )( T * , T * ) )
616
+ static inline A JOIN (A , init )(void )
617
617
{
618
618
static A zero ;
619
619
A self = zero ;
620
- self .hash = _hash ;
621
- self .equal = _equal ;
622
620
#ifdef POD
623
621
self .copy = JOIN (A , implicit_copy );
624
622
_JOIN (A , _set_default_methods )(& self );
@@ -633,24 +631,15 @@ static inline A JOIN(A, init)(size_t (*_hash)(T *), int (*_equal)(T *, T *))
633
631
634
632
static inline A JOIN (A , init_from )(A * copy )
635
633
{
636
- static A zero ;
637
- A self = zero ;
638
- #ifdef POD
639
- self .copy = JOIN (A , implicit_copy );
640
- #else
641
- self .free = JOIN (T , free );
642
- self .copy = JOIN (T , copy );
643
- #endif
644
- self .hash = copy -> hash ;
645
- self .equal = copy -> equal ;
646
- return self ;
634
+ (void )copy ;
635
+ return JOIN (A , init )();
647
636
}
648
637
649
638
static inline void JOIN (A , rehash )(A * self , size_t desired_count )
650
639
{
651
640
if (desired_count == (self -> bucket_max + 1 ))
652
641
return ;
653
- A rehashed = JOIN (A , init )(self -> hash , self -> equal );
642
+ A rehashed = JOIN (A , init )();
654
643
JOIN (A , reserve )(& rehashed , desired_count );
655
644
if (LIKELY (self -> buckets && self -> size )) // if desired_count 0
656
645
{
@@ -681,7 +670,7 @@ static inline void JOIN(A, _rehash)(A *self, size_t count)
681
670
// we do allow shrink here
682
671
if (count == self -> bucket_max + 1 )
683
672
return ;
684
- A rehashed = JOIN (A , init )(self -> hash , self -> equal );
673
+ A rehashed = JOIN (A , init )();
685
674
//LOG("_rehash %zu => %zu\n", self->size, count);
686
675
JOIN (A , _reserve )(& rehashed , count );
687
676
@@ -714,7 +703,7 @@ static inline B *JOIN(A, find_node)(A *self, T value)
714
703
if (self -> size )
715
704
{
716
705
#ifdef CTL_USET_CACHED_HASH
717
- size_t hash = self -> hash (& value );
706
+ size_t hash = JOIN ( T , hash ) (& value );
718
707
B * * buckets = JOIN (A , _bucket_hash )(self , hash );
719
708
#else
720
709
B * * buckets = JOIN (A , _bucket )(self , value );
@@ -739,7 +728,7 @@ static inline B *JOIN(A, find_node)(A *self, T value)
739
728
if (n -> cached_hash != hash )
740
729
continue ;
741
730
#endif
742
- if (self -> equal (& value , & n -> value ))
731
+ if (JOIN ( T , equal ) (& value , & n -> value ))
743
732
{
744
733
#if 0 // not yet
745
734
// speedup subsequent read accesses?
@@ -802,7 +791,7 @@ static inline B **JOIN(A, push_cached)(A *self, T *value)
802
791
#endif
803
792
804
793
#ifdef CTL_USET_CACHED_HASH
805
- size_t hash = self -> hash (value );
794
+ size_t hash = JOIN ( T , hash ) (value );
806
795
B * * buckets = JOIN (A , _bucket_hash )(self , hash );
807
796
JOIN (B , push )(buckets , JOIN (B , init_cached )(* value , hash ));
808
797
#else
@@ -899,7 +888,7 @@ static inline I JOIN(A, emplace_hint)(I *pos, T *value)
899
888
if (!JOIN (I , done )(pos ))
900
889
{
901
890
#ifdef CTL_USET_CACHED_HASH
902
- size_t hash = self -> hash (value );
891
+ size_t hash = JOIN ( T , hash ) (value );
903
892
B * * buckets = JOIN (A , _bucket_hash )(self , hash );
904
893
#else
905
894
B * * buckets = JOIN (A , _bucket )(self , * value );
@@ -924,7 +913,7 @@ static inline I JOIN(A, emplace_hint)(I *pos, T *value)
924
913
if (n -> cached_hash != hash )
925
914
continue ;
926
915
#endif
927
- if (self -> equal (value , & n -> value ))
916
+ if (JOIN ( T , equal ) (value , & n -> value ))
928
917
{
929
918
FREE_VALUE (self , * value );
930
919
return JOIN (I , iter )(self , n );
@@ -1060,7 +1049,7 @@ static inline void JOIN(A, _linked_erase)(A *self, B **bucket, B *n, B *prev, B
1060
1049
static inline void JOIN (A , erase )(A * self , T value )
1061
1050
{
1062
1051
#ifdef CTL_USET_CACHED_HASH
1063
- size_t hash = self -> hash (& value );
1052
+ size_t hash = JOIN ( T , hash ) (& value );
1064
1053
B * * buckets = JOIN (A , _bucket_hash )(self , hash );
1065
1054
#else
1066
1055
B * * buckets = JOIN (A , _bucket )(self , value );
@@ -1078,7 +1067,7 @@ static inline void JOIN(A, erase)(A *self, T value)
1078
1067
continue ;
1079
1068
}
1080
1069
#endif
1081
- if (self -> equal (& value , & n -> value ))
1070
+ if (JOIN ( T , equal ) (& value , & n -> value ))
1082
1071
{
1083
1072
JOIN (A , _linked_erase )(self , buckets , n , prev , next );
1084
1073
break ;
@@ -1115,7 +1104,7 @@ static inline size_t JOIN(A, erase_if)(A *self, int (*_match)(T *))
1115
1104
static inline A JOIN (A , copy )(A * self )
1116
1105
{
1117
1106
// LOG ("copy\norig size: %lu\n", self->size);
1118
- A other = JOIN (A , init )(self -> hash , self -> equal );
1107
+ A other = JOIN (A , init )();
1119
1108
JOIN (A , _reserve )(& other , self -> bucket_max + 1 );
1120
1109
foreach (A , self , it )
1121
1110
{
@@ -1154,7 +1143,7 @@ static inline void JOIN(A, erase_generic)(A* self, GI *range)
1154
1143
1155
1144
static inline A JOIN (A , union )(A * a , A * b )
1156
1145
{
1157
- A self = JOIN (A , init )(a -> hash , a -> equal );
1146
+ A self = JOIN (A , init )();
1158
1147
JOIN (A , _reserve )(& self , 1 + MAX (a -> bucket_max , b -> bucket_max ));
1159
1148
foreach (A , a , it1 )
1160
1149
JOIN (A , insert )(& self , self .copy (it1 .ref ));
@@ -1182,7 +1171,7 @@ static inline A JOIN(A, union_range)(I *r1, GI *r2)
1182
1171
1183
1172
static inline A JOIN (A , intersection )(A * a , A * b )
1184
1173
{
1185
- A self = JOIN (A , init )(a -> hash , a -> equal );
1174
+ A self = JOIN (A , init )();
1186
1175
foreach (A , a , it )
1187
1176
if (JOIN (A , find_node )(b , * it .ref ))
1188
1177
JOIN (A , insert )(& self , self .copy (it .ref ));
@@ -1192,7 +1181,7 @@ static inline A JOIN(A, intersection)(A *a, A *b)
1192
1181
static inline A JOIN (A , intersection_range )(I * r1 , GI * r2 )
1193
1182
{
1194
1183
A * a = r1 -> container ;
1195
- A self = JOIN (A , init )(a -> hash , a -> equal );
1184
+ A self = JOIN (A , init )();
1196
1185
void (* next2 )(struct I * ) = r2 -> vtable .next ;
1197
1186
T * (* ref2 )(struct I * ) = r2 -> vtable .ref ;
1198
1187
int (* done2 )(struct I * ) = r2 -> vtable .done ;
@@ -1214,7 +1203,7 @@ static inline A JOIN(A, intersection_range)(I *r1, GI *r2)
1214
1203
1215
1204
static inline A JOIN (A , difference )(A * a , A * b )
1216
1205
{
1217
- A self = JOIN (A , init )(a -> hash , a -> equal );
1206
+ A self = JOIN (A , init )();
1218
1207
foreach (A , a , it )
1219
1208
if (!JOIN (A , find_node )(b , * it .ref ))
1220
1209
JOIN (A , insert )(& self , self .copy (it .ref ));
0 commit comments