Add containers hashing implementation
This commit is contained in:
		
							parent
							
								
									4e6d83c4cf
								
							
						
					
					
						commit
						5c39f4970c
					
				| @ -4,17 +4,20 @@ | |||||||
| #include "include.h" | #include "include.h" | ||||||
| #include "../__internal/assert.h" | #include "../__internal/assert.h" | ||||||
| 
 | 
 | ||||||
| size_t array_size (const arr_t* x) { | /*#####################################################################################################################*/ | ||||||
|     return x->size; |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| size_t array_nmemb(const arr_t* x) { | hash_t array_hash(const arr_t* s) { | ||||||
|     return x->size*vtype_size(x->type); |     hash_t hash = 0; | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void* array_at(const arr_t* x, ssize_t i) { |     if (s->size > 0) | ||||||
|     if (i < 0 && (i += x->size) < 0) i = 0; |         hash = vtype_hash(s->mem, s->type); | ||||||
|     return x->mem + i*vtype_size(x->type); | 
 | ||||||
|  |     if (s->size > 1) | ||||||
|  |         hash += vtype_hash(array_internal_at(s, s->size - 1), s->type); | ||||||
|  | 
 | ||||||
|  |     hash ^= s->size; | ||||||
|  | 
 | ||||||
|  |     return hash + VTYPE_ARRAY; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void array_init(arr_t* x, vtype t) { | void array_init(arr_t* x, vtype t) { | ||||||
| @ -52,6 +55,23 @@ void array_free(arr_t* x) { | |||||||
|     memset(x, 0, sizeof(*x)); |     memset(x, 0, sizeof(*x)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*#####################################################################################################################*/ | ||||||
|  | 
 | ||||||
|  | size_t array_size (const arr_t* x) { | ||||||
|  |     return x->size; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | size_t array_nmemb(const arr_t* x) { | ||||||
|  |     return x->size*vtype_size(x->type); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void* array_at(const arr_t* x, ssize_t i) { | ||||||
|  |     if (i < 0 && (i += x->size) < 0) i = 0; | ||||||
|  |     return x->mem + i*vtype_size(x->type); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*#####################################################################################################################*/ | ||||||
|  | 
 | ||||||
| int array_compare(const arr_t* s0, const arr_t* s1) { | int array_compare(const arr_t* s0, const arr_t* s1) { | ||||||
| 
 | 
 | ||||||
|     void  *e; |     void  *e; | ||||||
|  | |||||||
| @ -5,6 +5,22 @@ | |||||||
| 
 | 
 | ||||||
| /*#####################################################################################################################*/ | /*#####################################################################################################################*/ | ||||||
| 
 | 
 | ||||||
|  | hash_t list_hash(const list_t* s) { | ||||||
|  | 
 | ||||||
|  |     hash_t hash = 0; | ||||||
|  | 
 | ||||||
|  |     if (!is_null(s->first)) { | ||||||
|  |         hash = vnode_hash(&s->first->node, s->first->type); | ||||||
|  | 
 | ||||||
|  |         if (s->first != s->last) { | ||||||
|  |             hash += vnode_hash(&s->first->node, s->first->type); | ||||||
|  |             hash ^= list_size(s); | ||||||
|  |         } else hash ^= 1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return hash + VTYPE_LIST; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void list_init(list_t* x) { | void list_init(list_t* x) { | ||||||
|     memset(x, 0, sizeof(*x)); |     memset(x, 0, sizeof(*x)); | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,6 +3,22 @@ | |||||||
| 
 | 
 | ||||||
| #include "include.h" | #include "include.h" | ||||||
| 
 | 
 | ||||||
|  | hash_t string_hash(const str_t* s) { | ||||||
|  |     hash_t hash  = 0; | ||||||
|  |     size_t nmemb = string_nmemb(s); | ||||||
|  | 
 | ||||||
|  |     if (nmemb > 0) | ||||||
|  |         hash = s->buffer[0]; | ||||||
|  | 
 | ||||||
|  |     if (nmemb > 1) | ||||||
|  |         hash += s->buffer[nmemb-1]; | ||||||
|  | 
 | ||||||
|  |     hash ^= nmemb; | ||||||
|  | 
 | ||||||
|  |     return hash + VTYPE_STRING; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| size_t string_nmemb(const str_t* s) { | size_t string_nmemb(const str_t* s) { | ||||||
|     return (!is_null(s->buffer)) ? strlen(s->buffer) : 0; |     return (!is_null(s->buffer)) ? strlen(s->buffer) : 0; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user