|  |  |  | @ -314,8 +314,8 @@ NOTES - HASH MAP | 
			
		
	
		
			
				
					|  |  |  |  |     a strong random number to stbds_rand_seed. | 
			
		
	
		
			
				
					|  |  |  |  |      
 | 
			
		
	
		
			
				
					|  |  |  |  |   * The default value for the hash table is stored in foo[-1], so if you | 
			
		
	
		
			
				
					|  |  |  |  |     use code like 'hmget(T,k)->value = 5' you can overwrite the value | 
			
		
	
		
			
				
					|  |  |  |  |     stored by hmdefault if 'k' is not present. | 
			
		
	
		
			
				
					|  |  |  |  |     use code like 'hmget(T,k)->value = 5' you can accidentally overwrite | 
			
		
	
		
			
				
					|  |  |  |  |     the value stored by hmdefault if 'k' is not present. | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | CREDITS | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -324,8 +324,9 @@ CREDITS | 
			
		
	
		
			
				
					|  |  |  |  |   Rafael Sachetto -- arrpop() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   Bugfixes: | 
			
		
	
		
			
				
					|  |  |  |  |     Vinh Truong | 
			
		
	
		
			
				
					|  |  |  |  |     Andy Durdin | 
			
		
	
		
			
				
					|  |  |  |  |     Shane Liesgang | 
			
		
	
		
			
				
					|  |  |  |  |     Vinh Truong | 
			
		
	
		
			
				
					|  |  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef STBDS_UNIT_TESTS | 
			
		
	
	
		
			
				
					|  |  |  | @ -519,18 +520,18 @@ extern void * stbds_shmode_func(size_t elemsize, int mode); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define stbds_shput(t, k, v) \ | 
			
		
	
		
			
				
					|  |  |  |  |     ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_HM_STRING),   \
 | 
			
		
	
		
			
				
					|  |  |  |  |      (t)[stbds_temp(t-1)].value = (v)) | 
			
		
	
		
			
				
					|  |  |  |  |      (t)[stbds_temp((t)-1)].value = (v)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define stbds_shputs(t, s) \ | 
			
		
	
		
			
				
					|  |  |  |  |     ((t) = stbds_hmput_key_wrapper((t), sizeof *(t), (void*) (s).key, sizeof (s).key, STBDS_HM_STRING), \
 | 
			
		
	
		
			
				
					|  |  |  |  |      (t)[stbds_temp(t-1)] = (s)) | 
			
		
	
		
			
				
					|  |  |  |  |      (t)[stbds_temp((t)-1)] = (s)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define stbds_shgeti(t,k) \ | 
			
		
	
		
			
				
					|  |  |  |  |      ((t) = stbds_hmget_key_wrapper((t), sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_HM_STRING), \
 | 
			
		
	
		
			
				
					|  |  |  |  |       stbds_temp(t)) | 
			
		
	
		
			
				
					|  |  |  |  |       stbds_temp((t)-1)) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define stbds_shgetp(t, k) \ | 
			
		
	
		
			
				
					|  |  |  |  |     ((void) stbds_shgeti(t,k), &(t)[stbds_temp(t-1)]) | 
			
		
	
		
			
				
					|  |  |  |  |     ((void) stbds_shgeti(t,k), &(t)[stbds_temp((t)-1)]) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define stbds_shdel(t,k) \ | 
			
		
	
		
			
				
					|  |  |  |  |     (((t) = stbds_hmdel_key_wrapper((t),sizeof *(t), (void*) (k), sizeof (t)->key, STBDS_OFFSETOF((t),key), STBDS_HM_STRING)),(t)?stbds_temp((t)-1):0) | 
			
		
	
	
		
			
				
					|  |  |  | @ -1514,6 +1515,7 @@ void stbds_unit_tests(void) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   int i,j; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   STBDS_ASSERT(arrlen(arr)==0); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < 20000; i += 50) { | 
			
		
	
		
			
				
					|  |  |  |  |     for (j=0; j < i; ++j) | 
			
		
	
		
			
				
					|  |  |  |  |       arrpush(arr,j); | 
			
		
	
	
		
			
				
					|  |  |  | @ -1538,27 +1540,30 @@ void stbds_unit_tests(void) | 
			
		
	
		
			
				
					|  |  |  |  |     arrfree(arr); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   hmdefault(intmap, -1); | 
			
		
	
		
			
				
					|  |  |  |  |   i=1; STBDS_ASSERT(hmget(intmap, i) == -1); | 
			
		
	
		
			
				
					|  |  |  |  |   i = 1; | 
			
		
	
		
			
				
					|  |  |  |  |   STBDS_ASSERT(hmgeti(intmap,i) == -1); | 
			
		
	
		
			
				
					|  |  |  |  |   hmdefault(intmap, -2); | 
			
		
	
		
			
				
					|  |  |  |  |   STBDS_ASSERT(hmgeti(intmap, i) == -1); | 
			
		
	
		
			
				
					|  |  |  |  |   STBDS_ASSERT(hmget (intmap, i) == -2); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=2) | 
			
		
	
		
			
				
					|  |  |  |  |     hmput(intmap, i, i*5); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |     if (i & 1) STBDS_ASSERT(hmget(intmap, i) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |     if (i & 1) STBDS_ASSERT(hmget(intmap, i) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |     else       STBDS_ASSERT(hmget(intmap, i) == i*5); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=2) | 
			
		
	
		
			
				
					|  |  |  |  |     hmput(intmap, i, i*3); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |     if (i & 1) STBDS_ASSERT(hmget(intmap, i) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |     if (i & 1) STBDS_ASSERT(hmget(intmap, i) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |     else       STBDS_ASSERT(hmget(intmap, i) == i*3); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=2; i < testsize; i+=4) | 
			
		
	
		
			
				
					|  |  |  |  |     hmdel(intmap, i); // delete half the entries
 | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |     if (i & 3) STBDS_ASSERT(hmget(intmap, i) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |     if (i & 3) STBDS_ASSERT(hmget(intmap, i) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |     else       STBDS_ASSERT(hmget(intmap, i) == i*3); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |     hmdel(intmap, i); // delete the rest of the entries    
 | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |     STBDS_ASSERT(hmget(intmap, i) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |     STBDS_ASSERT(hmget(intmap, i) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |   hmfree(intmap); | 
			
		
	
		
			
				
					|  |  |  |  |   for (i=0; i < testsize; i+=2) | 
			
		
	
		
			
				
					|  |  |  |  |     hmput(intmap, i, i*3); | 
			
		
	
	
		
			
				
					|  |  |  | @ -1581,25 +1586,28 @@ void stbds_unit_tests(void) | 
			
		
	
		
			
				
					|  |  |  |  |   strreset(&sa); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   for (j=0; j < 2; ++j) { | 
			
		
	
		
			
				
					|  |  |  |  |     STBDS_ASSERT(shgeti(strmap,"foo") == -1); | 
			
		
	
		
			
				
					|  |  |  |  |     if (j == 0) | 
			
		
	
		
			
				
					|  |  |  |  |       sh_new_strdup(strmap); | 
			
		
	
		
			
				
					|  |  |  |  |     else | 
			
		
	
		
			
				
					|  |  |  |  |       sh_new_arena(strmap); | 
			
		
	
		
			
				
					|  |  |  |  |     shdefault(strmap, -1); | 
			
		
	
		
			
				
					|  |  |  |  |     STBDS_ASSERT(shgeti(strmap,"foo") == -1); | 
			
		
	
		
			
				
					|  |  |  |  |     shdefault(strmap, -2); | 
			
		
	
		
			
				
					|  |  |  |  |     STBDS_ASSERT(shgeti(strmap,"foo") == -1); | 
			
		
	
		
			
				
					|  |  |  |  |     for (i=0; i < testsize; i+=2) | 
			
		
	
		
			
				
					|  |  |  |  |       shput(strmap, strkey(i), i*3); | 
			
		
	
		
			
				
					|  |  |  |  |     for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |       if (i & 1) STBDS_ASSERT(shget(strmap, strkey(i)) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |       if (i & 1) STBDS_ASSERT(shget(strmap, strkey(i)) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |       else       STBDS_ASSERT(shget(strmap, strkey(i)) == i*3); | 
			
		
	
		
			
				
					|  |  |  |  |     for (i=2; i < testsize; i+=4) | 
			
		
	
		
			
				
					|  |  |  |  |       shdel(strmap, strkey(i)); // delete half the entries
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |       if (i & 3) STBDS_ASSERT(shget(strmap, strkey(i)) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |       if (i & 3) STBDS_ASSERT(shget(strmap, strkey(i)) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |       else       STBDS_ASSERT(shget(strmap, strkey(i)) == i*3); | 
			
		
	
		
			
				
					|  |  |  |  |     for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |       shdel(strmap, strkey(i)); // delete the rest of the entries    
 | 
			
		
	
		
			
				
					|  |  |  |  |     for (i=0; i < testsize; i+=1) | 
			
		
	
		
			
				
					|  |  |  |  |       STBDS_ASSERT(shget(strmap, strkey(i)) == -1 ); | 
			
		
	
		
			
				
					|  |  |  |  |       STBDS_ASSERT(shget(strmap, strkey(i)) == -2 ); | 
			
		
	
		
			
				
					|  |  |  |  |     shfree(strmap); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |