1 /*******************************************************************
2 uLan Utilities Library - C library of basic reusable constructions
4 ul_hashtabprim.c - primitives to support hash tables
6 (C) Copyright 2009 by Pavel Pisa - Originator
8 The uLan utilities library can be used, copied and modified under
10 - GPL - GNU General Public License
11 - LGPL - GNU Lesser General Public License
12 - MPL - Mozilla Public License
13 - and other licenses added by project originators
14 Code can be modified and re-distributed under any combination
15 of the above listed licenses. If contributor does not agree with
16 some of the licenses, he/she can delete appropriate line.
17 Warning, if you delete all lines, you are not allowed to
18 distribute source code and/or binaries utilizing code.
20 See files COPYING and README for details.
22 *******************************************************************/
25 #include "ul_utmalloc.h"
26 #include "ul_hashtab.h"
28 void ul_hashtab_init_table_field_primitive(ul_hashtab_cust_table_field_t *table_field)
30 table_field->hashmask=0;
32 table_field->treeroots.treesingle.treeroot=NULL;
35 int ul_hashtab_delete_all_primitive(ul_hashtab_cust_table_field_t *table_field)
37 if(table_field->hashmask)
38 free(table_field->treeroots.treetable);
39 table_field->hashmask=0;
41 table_field->treeroots.treesingle.treeroot=NULL;
45 int ul_hashtab_resize_primitive(ul_hashtab_cust_table_field_t *table_field,
46 ul_hashtab_hashval_t newsize, ul_hashtab_resize_insert_fnc_t *ins_fnc)
48 ul_hashtab_hashval_t oldsize=table_field->hashmask+1;
49 ul_hashtab_treeroot_t oldsingle;
50 ul_hashtab_treeroot_t *pt;
51 ul_hashtab_treeroot_t *oldtable;
52 gavl_node_t *treenode;
59 oldtable=table_field->treeroots.treetable;
61 oldsingle.treeroot=table_field->treeroots.treesingle.treeroot;
66 pt=malloc(sizeof(*pt)*newsize);
69 memset(pt,0,sizeof(*pt)*newsize);
70 table_field->treeroots.treetable=pt;
72 table_field->treeroots.treesingle.treeroot=NULL;
74 table_field->hashmask=newsize-1;
76 pt = oldtable!=NULL? oldtable: &oldsingle;
79 while(pt->treeroot!=NULL) {
80 treenode=gavl_cut_first_primitive(&pt->treeroot);
81 res=ins_fnc(table_field, treenode);
92 gavl_node_t *ul_hashtab_next_it_primitive(const ul_hashtab_cust_table_field_t *table_field,
93 ul_hashtab_treeroot_t **pptreeroot, gavl_node_t *treenode)
96 treenode=gavl_next_node(treenode);
97 if((treenode!=NULL) || !table_field->hashmask)
99 if(table_field->treeroots.treetable+table_field->hashmask==*pptreeroot)
103 if(!table_field->hashmask) {
104 const ul_hashtab_treeroot_t *treeroot=&table_field->treeroots.treesingle;
105 *pptreeroot=(ul_hashtab_treeroot_t *)treeroot;
107 *pptreeroot=table_field->treeroots.treetable;
112 treenode=(*pptreeroot)->treeroot;
114 while(treenode->left!=NULL)
115 treenode=treenode->left;
119 if(!table_field->hashmask)
121 if(table_field->treeroots.treetable+table_field->hashmask==*pptreeroot)