@@ -17,7 +17,7 @@ typedef struct {
17
17
18
18
static inline uint8_t
19
19
key_comparer (instance_data_t data , size_t lhs , size_t rhs ) {
20
- return ((data .f == 4.20f ) || (lhs == rhs ));
20
+ return ((data .f == 4.20f ) || (lhs == rhs ));
21
21
}
22
22
23
23
#define DN_SIMDHASH_T dn_simdhash_size_t_size_t
@@ -67,7 +67,7 @@ void foreach_callback (size_t key, size_t value, void * user_data) {
67
67
}
68
68
69
69
int main () {
70
- const int c = 10240 ;
70
+ const int c = 320000 ;
71
71
dn_simdhash_size_t_size_t_t * test = dn_simdhash_size_t_size_t_new (0 , NULL );
72
72
dn_simdhash_instance_data (instance_data_t , test ).f = 3.14f ;
73
73
dn_simdhash_instance_data (instance_data_t , test ).i = 42 ;
@@ -78,99 +78,106 @@ int main () {
78
78
srand (1 );
79
79
80
80
for (int i = 0 ; i < c ; i ++ ) {
81
- DN_SIMDHASH_KEY_T key = rand ();
82
- dn_vector_push_back (keys , key );
83
81
DN_SIMDHASH_VALUE_T value = (i * 2 ) + 1 ;
84
- dn_vector_push_back (values , value );
85
-
86
- uint8_t ok = dn_simdhash_size_t_size_t_try_add (test , key , value );
87
- tassert (ok , "Insert failed" );
88
- }
89
-
90
- if (!tasserteq (dn_simdhash_count (test ), c , "count did not match" ))
91
- return 1 ;
92
-
93
- printf ("Calling foreach:\n" );
94
- uint32_t foreach_count = 0 ;
95
- dn_simdhash_size_t_size_t_foreach (test , foreach_callback , & foreach_count );
96
- printf ("Foreach iterated %u time(s)\n" , foreach_count );
97
- printf ("Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
98
-
99
- for (int i = 0 ; i < c ; i ++ ) {
100
- DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
101
- DN_SIMDHASH_VALUE_T value , expected_value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
102
-
103
- uint8_t ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
104
- if (tassert1 (ok , key , "did not find key" ))
105
- tasserteq (value , expected_value , "value did not match" );
106
- }
107
-
108
- // NOTE: Adding duplicates could grow the table if we're unlucky, since the add operation
109
- // eagerly grows before doing a table scan if we're at the grow threshold.
110
- for (int i = 0 ; i < c ; i ++ ) {
111
- DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
112
- DN_SIMDHASH_VALUE_T value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
82
+ DN_SIMDHASH_KEY_T key ;
113
83
84
+ retry : {
85
+ key = rand ();
114
86
uint8_t ok = dn_simdhash_size_t_size_t_try_add (test , key , value );
115
- tassert1 (!ok , key , "added duplicate key successfully" );
116
- }
117
-
118
- printf ("After adding dupes: Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
119
- uint32_t final_capacity = dn_simdhash_capacity (test );
120
-
121
- for (int i = 0 ; i < c ; i ++ ) {
122
- DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
123
- uint8_t ok = dn_simdhash_size_t_size_t_try_remove (test , key );
124
- tassert1 (ok , key , "could not remove key" );
125
-
126
- DN_SIMDHASH_VALUE_T value ;
127
- ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
128
- tassert1 (!ok , key , "found key after removal" );
129
- }
130
-
131
- if (!tasserteq (dn_simdhash_count (test ), 0 , "was not empty" ))
132
- return 1 ;
133
- if (!tasserteq (dn_simdhash_capacity (test ), final_capacity , "capacity changed by emptying" ))
134
- return 1 ;
135
-
136
- printf ("Calling foreach after emptying:\n" );
137
- foreach_count = 0 ;
138
- dn_simdhash_size_t_size_t_foreach (test , foreach_callback , & foreach_count );
139
- printf ("Foreach iterated %u time(s)\n" , foreach_count );
140
- printf ("Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
141
-
142
- for (int i = 0 ; i < c ; i ++ ) {
143
- DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
144
- DN_SIMDHASH_VALUE_T value ;
145
- uint8_t ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
146
- tassert1 (!ok , key , "found key after removal" );
147
- }
148
-
149
- for (int i = 0 ; i < c ; i ++ ) {
150
- DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
151
- DN_SIMDHASH_VALUE_T value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
152
-
153
- uint8_t ok = dn_simdhash_size_t_size_t_try_add (test , key , value );
154
- tassert1 (ok , key , "could not re-insert key after emptying" );
155
- }
156
-
157
- if (!tasserteq (dn_simdhash_capacity (test ), final_capacity , "expected capacity not to change after refilling" ))
158
- return 1 ;
159
-
160
- for (int i = 0 ; i < c ; i ++ ) {
161
- DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
162
- DN_SIMDHASH_VALUE_T value , expected_value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
87
+ if (!ok )
88
+ goto retry ;
89
+ }
163
90
164
- uint8_t ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
165
- if (tassert1 (ok , key , "did not find key after refilling" ))
166
- tasserteq (value , expected_value , "value did not match after refilling" );
91
+ dn_vector_push_back (keys , key );
92
+ dn_vector_push_back (values , value );
167
93
}
168
94
169
- printf ("Calling foreach after refilling:\n" );
170
- foreach_count = 0 ;
171
- dn_simdhash_size_t_size_t_foreach (test , foreach_callback , & foreach_count );
172
- printf ("Foreach iterated %u time(s)\n" , foreach_count );
173
- printf ("Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
95
+ for (int iter = 0 ; iter < 100 ; iter ++ ) {
96
+ if (!tasserteq (dn_simdhash_count (test ), c , "count did not match" ))
97
+ return 1 ;
98
+
99
+ printf ("Calling foreach:\n" );
100
+ uint32_t foreach_count = 0 ;
101
+ dn_simdhash_size_t_size_t_foreach (test , foreach_callback , & foreach_count );
102
+ printf ("Foreach iterated %u time(s)\n" , foreach_count );
103
+ printf ("Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
104
+
105
+ for (int i = 0 ; i < c ; i ++ ) {
106
+ DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
107
+ DN_SIMDHASH_VALUE_T value , expected_value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
108
+
109
+ uint8_t ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
110
+ if (tassert1 (ok , key , "did not find key" ))
111
+ tasserteq (value , expected_value , "value did not match" );
112
+ }
113
+
114
+ // NOTE: Adding duplicates could grow the table if we're unlucky, since the add operation
115
+ // eagerly grows before doing a table scan if we're at the grow threshold.
116
+ for (int i = 0 ; i < c ; i ++ ) {
117
+ DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
118
+ DN_SIMDHASH_VALUE_T value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
119
+
120
+ uint8_t ok = dn_simdhash_size_t_size_t_try_add (test , key , value );
121
+ tassert1 (!ok , key , "added duplicate key successfully" );
122
+ }
123
+
124
+ printf ("After adding dupes: Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
125
+ uint32_t final_capacity = dn_simdhash_capacity (test );
126
+
127
+ for (int i = 0 ; i < c ; i ++ ) {
128
+ DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
129
+ uint8_t ok = dn_simdhash_size_t_size_t_try_remove (test , key );
130
+ tassert1 (ok , key , "could not remove key" );
131
+
132
+ DN_SIMDHASH_VALUE_T value ;
133
+ ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
134
+ tassert1 (!ok , key , "found key after removal" );
135
+ }
136
+
137
+ if (!tasserteq (dn_simdhash_count (test ), 0 , "was not empty" ))
138
+ return 1 ;
139
+ if (!tasserteq (dn_simdhash_capacity (test ), final_capacity , "capacity changed by emptying" ))
140
+ return 1 ;
141
+
142
+ printf ("Calling foreach after emptying:\n" );
143
+ foreach_count = 0 ;
144
+ dn_simdhash_size_t_size_t_foreach (test , foreach_callback , & foreach_count );
145
+ printf ("Foreach iterated %u time(s)\n" , foreach_count );
146
+ printf ("Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
147
+
148
+ for (int i = 0 ; i < c ; i ++ ) {
149
+ DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
150
+ DN_SIMDHASH_VALUE_T value ;
151
+ uint8_t ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
152
+ tassert1 (!ok , key , "found key after removal" );
153
+ }
154
+
155
+ for (int i = 0 ; i < c ; i ++ ) {
156
+ DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
157
+ DN_SIMDHASH_VALUE_T value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
158
+
159
+ uint8_t ok = dn_simdhash_size_t_size_t_try_add (test , key , value );
160
+ tassert1 (ok , key , "could not re-insert key after emptying" );
161
+ }
162
+
163
+ if (!tasserteq (dn_simdhash_capacity (test ), final_capacity , "expected capacity not to change after refilling" ))
164
+ return 1 ;
165
+
166
+ for (int i = 0 ; i < c ; i ++ ) {
167
+ DN_SIMDHASH_KEY_T key = * dn_vector_index_t (keys , DN_SIMDHASH_KEY_T , i );
168
+ DN_SIMDHASH_VALUE_T value , expected_value = * dn_vector_index_t (values , DN_SIMDHASH_VALUE_T , i );
169
+
170
+ uint8_t ok = dn_simdhash_size_t_size_t_try_get_value (test , key , & value );
171
+ if (tassert1 (ok , key , "did not find key after refilling" ))
172
+ tasserteq (value , expected_value , "value did not match after refilling" );
173
+ }
174
+
175
+ printf ("Calling foreach after refilling:\n" );
176
+ foreach_count = 0 ;
177
+ dn_simdhash_size_t_size_t_foreach (test , foreach_callback , & foreach_count );
178
+ printf ("Foreach iterated %u time(s)\n" , foreach_count );
179
+ printf ("Count: %u, Capacity: %u, Cascaded item count: %u\n" , dn_simdhash_count (test ), dn_simdhash_capacity (test ), count_cascaded_buckets (test ));
180
+ }
174
181
175
182
printf ("done\n" );
176
183
0 commit comments