29 hash = ((hash << 5) + hash) +
c;
36 papisde_list_entry_t *list_head, *new_entry;
41 if( NULL == list_head->item ){
42 list_head->item = sde_counter;
43 list_head->next = NULL;
49 new_entry = (papisde_list_entry_t *)calloc(1,
sizeof(papisde_list_entry_t));
50 new_entry->item = sde_counter;
51 new_entry->next = list_head->next;
52 list_head->next = new_entry;
67 int i, item_cnt = 0, index=0;
68 papisde_list_entry_t *list_head, *curr;
77 if(NULL != list_head->item){
80 for(curr = list_head->next; NULL != curr; curr=curr->next){
81 if(NULL == curr->item){
82 SDE_ERROR(
"ht_to_array(): the hash table is clobbered.");
90 sde_counter_t *
array = (sde_counter_t *)malloc( item_cnt *
sizeof(sde_counter_t));
96 if(NULL != list_head->item){
97 memcpy( &
array[index], list_head->item,
sizeof(sde_counter_t) );
100 for(curr = list_head->next; NULL != curr; curr=curr->next){
101 if(NULL == curr->item){
102 SDE_ERROR(
"ht_to_array(): the hash table is clobbered.");
104 memcpy( &
array[index], curr->item,
sizeof(sde_counter_t) );
116 papisde_list_entry_t *list_head, *curr, *prev;
120 if( NULL == list_head->item ){
121 SDE_ERROR(
"ht_delete(): the entry does not exist.");
126 if( list_head->item->glb_uniq_id == uniq_id ){
127 item = list_head->item;
128 if( NULL != list_head->next){
129 *list_head = *(list_head->next);
131 memset(list_head, 0,
sizeof(papisde_list_entry_t));
138 for(curr=list_head->next; NULL != curr; curr=curr->next){
139 if(NULL == curr->item){
140 SDE_ERROR(
"ht_delete(): the hash table is clobbered.");
143 if(curr->item->glb_uniq_id == uniq_id){
144 prev->next = curr->next;
152 SDE_ERROR(
"ht_delete(): the item is not in the list.");
158 papisde_list_entry_t *list_head, *curr;
161 if( NULL == list_head->item ){
165 for(curr=list_head; NULL != curr; curr=curr->next){
166 if(NULL == curr->item){
167 SDE_ERROR(
"ht_lookup_by_name() the hash table is clobbered.");
170 if( !strcmp(curr->item->name,
name) ){
180 papisde_list_entry_t *list_head, *curr;
183 if( NULL == list_head->item ){
187 for(curr=list_head; NULL != curr; curr=curr->next){
188 if(NULL == curr->item){
189 SDE_ERROR(
"ht_lookup_by_id() the hash table is clobbered.");
192 if(curr->item->glb_uniq_id == uniq_id){
205 long long current_size, typesize, used_entries, tmp_size = 0;
209 typesize = exp_container->typesize;
210 used_entries = exp_container->used_entries;
214 src = exp_container->ptr_array[
i];
215 dst = (
char *)cont_buffer + tmp_size*typesize;
216 if ( (tmp_size+current_size) <= used_entries){
217 memcpy(dst, src, current_size*typesize);
218 if ( (tmp_size+current_size) == used_entries){
222 memcpy(dst, src, (used_entries-tmp_size)*typesize);
225 tmp_size += current_size;
230 long long used_entries, total_entries, prev_entries, offset;
234 if( NULL == exp_container || NULL == exp_container->ptr_array[0]){
235 SDE_ERROR(
"exp_container_insert_element(): Exponential container is clobbered. Unable to insert element.");
239 used_entries = exp_container->used_entries;
240 total_entries = exp_container->total_entries;
241 assert(used_entries <= total_entries);
246 long long factor = (
long long)1<<
i;
247 prev_entries = tmp_size;
252 if (total_entries == tmp_size)
258 offset = used_entries - prev_entries;
260 if( used_entries == total_entries ){
261 long long new_segment_size;
268 exp_container->ptr_array[chunk] = malloc(new_segment_size*typesize);
269 exp_container->total_entries += new_segment_size;
272 void *dest = (
char *)(exp_container->ptr_array[chunk]) + offset*typesize;
274 (void)memcpy( dest, value, typesize );
275 exp_container->used_entries++;
287 int element_found = 0;
288 uint32_t
i, occupied;
291 if( NULL == hash_ptr ){
295 bucket_ptr = hash_ptr->
buckets;
297 uint64_t seed = (uint64_t)79365;
300 uint64_t *key_ptr = bucket_ptr[bucket_idx].
keys;
302 occupied = bucket_ptr[bucket_idx].
occupied;
304 SDE_ERROR(
"cset_insert_elem(): Counting set is clobbered, bucket %d has exceeded capacity.",bucket_idx);
310 for(
i=0;
i<occupied;
i++){
313 if( (
key == key_ptr[
i]) && (type_id == obj_ptr[
i].type_id) && (hashable_size <= obj_ptr[
i].type_size) ){
325 if( !element_found ){
334 obj_ptr[
i].
ptr = malloc(element_size);
335 (void)memcpy(obj_ptr[
i].ptr, element, element_size);
337 bucket_ptr[bucket_idx].
occupied += 1;
341 cset_list_object_t *new_list_element = (cset_list_object_t *)malloc(
sizeof(cset_list_object_t));
342 new_list_element->next = NULL;
343 new_list_element->count = 1;
344 new_list_element->type_id = type_id;
345 new_list_element->type_size = element_size;
346 new_list_element->ptr = malloc(element_size);
347 (void)memcpy(new_list_element->ptr, element, element_size);
353 cset_list_object_t *list_runner;
354 for( list_runner = hash_ptr->
overflow_list; list_runner != NULL; list_runner = list_runner->next){
358 if( (hashable_size <= list_runner->type_size) && (type_id == list_runner->type_id) && !memcmp(element, list_runner->ptr, hashable_size) ){
359 list_runner->count += 1;
364 if( NULL == list_runner ){
365 cset_list_object_t *new_list_element = (cset_list_object_t *)malloc(
sizeof(cset_list_object_t));
368 new_list_element->count = 1;
369 new_list_element->type_id = type_id;
370 new_list_element->type_size = element_size;
371 new_list_element->ptr = malloc(element_size);
372 (void)memcpy(new_list_element->ptr, element, element_size);
387 int element_found = 0;
388 uint32_t
i, occupied;
391 if( NULL == hash_ptr ){
395 bucket_ptr = hash_ptr->
buckets;
397 uint64_t seed = (uint64_t)79365;
400 uint64_t *key_ptr = bucket_ptr[bucket_idx].
keys;
402 occupied = bucket_ptr[bucket_idx].
occupied;
404 SDE_ERROR(
"cset_remove_elem(): Counting set is clobbered, bucket %d has exceeded capacity.",bucket_idx);
410 for(
i=0;
i<occupied;
i++){
413 if( (
key == key_ptr[
i]) && (type_id == obj_ptr[
i].type_id) && (hashable_size <= obj_ptr[
i].type_size) ){
419 if( 0 == obj_ptr[
i].
count ){
422 free(obj_ptr[
i].ptr);
424 for(j=
i; j<occupied-1; j++){
425 key_ptr[j] = key_ptr[j+1];
426 obj_ptr[j] = obj_ptr[j+1];
428 bucket_ptr[bucket_idx].
occupied -= 1;
438 if( !element_found ){
441 SDE_ERROR(
"cset_remove_elem(): Attempted to remove element that is NOT in the counting set.");
444 cset_list_object_t *list_runner, *prev;
446 for( list_runner = hash_ptr->
overflow_list; list_runner != NULL; list_runner = list_runner->next){
448 if( (hashable_size <= list_runner->type_size) && (type_id == list_runner->type_id) && !memcmp(element, list_runner->ptr, hashable_size) ){
449 list_runner->count -= 1;
451 if( 0 == list_runner->count ){
453 free(list_runner->ptr);
457 prev->next = list_runner->next;
479 uint32_t
i, occupied;
480 cset_list_object_t *head_ptr = NULL;
482 if( NULL == hash_ptr ){
485 bucket_ptr = hash_ptr->
buckets;
489 occupied = bucket_ptr[bucket_idx].
occupied;
491 for(
i=0;
i<occupied;
i++){
493 cset_list_object_t *new_list_element = (cset_list_object_t *)malloc(
sizeof(cset_list_object_t));
495 new_list_element->next = head_ptr;
496 new_list_element->count = obj_ptr[
i].
count;
497 new_list_element->type_id = obj_ptr[
i].
type_id;
498 new_list_element->type_size = type_size;
499 new_list_element->ptr = malloc(type_size);
500 (void)memcpy(new_list_element->ptr, obj_ptr[
i].
ptr, type_size);
502 head_ptr = new_list_element;
506 cset_list_object_t *list_runner;
508 for( list_runner = hash_ptr->
overflow_list; list_runner != NULL; list_runner = list_runner->next){
509 int type_size = list_runner->type_size;
510 cset_list_object_t *new_list_element = (cset_list_object_t *)malloc(
sizeof(cset_list_object_t));
512 new_list_element->next = head_ptr;
513 new_list_element->count = list_runner->count;
514 new_list_element->type_id = list_runner->type_id;
515 new_list_element->type_size = type_size;
516 new_list_element->ptr = malloc(type_size);
517 (void)memcpy(new_list_element->ptr, list_runner->ptr, type_size);
519 head_ptr = new_list_element;
529 uint32_t
i, occupied;
531 if( NULL == hash_ptr ){
534 bucket_ptr = hash_ptr->
buckets;
538 occupied = bucket_ptr[bucket_idx].
occupied;
540 for(
i=0;
i<occupied;
i++){
541 free(obj_ptr[
i].ptr);
543 bucket_ptr[bucket_idx].
occupied = 0;
546 cset_list_object_t *list_runner, *ptr_to_free=NULL;
548 for( list_runner = hash_ptr->
overflow_list; list_runner != NULL; list_runner = list_runner->next){
551 free(list_runner->ptr);
553 ptr_to_free = list_runner;
static double c[MATRIX_SIZE][MATRIX_SIZE]
static double array[ARRAYSIZE]
static void SDE_ERROR(const char *format,...)
int cset_delete(cset_hash_table_t *hash_ptr)
int cset_insert_elem(cset_hash_table_t *hash_ptr, size_t element_size, size_t hashable_size, const void *element, uint32_t type_id)
uint32_t ht_hash_name(const char *str)
void exp_container_to_contiguous(recorder_data_t *exp_container, void *cont_buffer)
void ht_insert(papisde_list_entry_t *hash_table, int ht_key, sde_counter_t *sde_counter)
int ht_to_array(papisde_list_entry_t *hash_table, sde_counter_t **rslt_array)
int exp_container_insert_element(recorder_data_t *exp_container, size_t typesize, const void *value)
sde_counter_t * ht_delete(papisde_list_entry_t *hash_table, int ht_key, uint32_t uniq_id)
int cset_remove_elem(cset_hash_table_t *hash_ptr, size_t hashable_size, const void *element, uint32_t type_id)
sde_counter_t * ht_lookup_by_name(papisde_list_entry_t *hash_table, const char *name)
sde_counter_t * ht_lookup_by_id(papisde_list_entry_t *hash_table, uint32_t uniq_id)
uint32_t ht_hash_id(uint32_t uniq_id)
cset_list_object_t * cset_to_list(cset_hash_table_t *hash_ptr)
#define EXP_CONTAINER_MIN_SIZE
#define _SDE_HASH_BUCKET_COUNT_
static uint64_t fasthash64(const void *buf, size_t len, uint64_t seed)
#define SDE_HASH_IS_FUZZY
#define EXP_CONTAINER_ENTRIES
#define _SDE_HASH_BUCKET_WIDTH_
cset_hash_decorated_object_t objects[_SDE_HASH_BUCKET_WIDTH_]
uint64_t keys[_SDE_HASH_BUCKET_WIDTH_]
cset_list_object_t * overflow_list
cset_hash_bucket_t buckets[_SDE_HASH_BUCKET_COUNT_]