#define UL_HASTAB_CUST_NODE_INT_IMP(cust_prefix, cust_table_t, cust_item_t, cust_key_t,\
cust_table_field, cust_item_node, cust_item_key, cust_cmp_fnc, cust_hash_fnc, \
- cust_hash_get_fnc, cust_hash_prep_fnc, cust_expand_ratio, cust_shrink_ratio) \
+ cust_hash_get_fnc, cust_hash_prep_fnc, cust_sizestep) \
GAVL_CUST_NODE_INT_DEC_SCOPE(static, cust_prefix##_privtree, ul_hashtab_treeroot_t, cust_item_t, cust_key_t,\
treeroot, cust_item_node.treenode, cust_item_key, cust_cmp_fnc) \
GAVL_CUST_NODE_INT_IMP(cust_prefix##_privtree, ul_hashtab_treeroot_t, cust_item_t, cust_key_t,\
&(table->cust_table_field.treeroots.treetable[cust_hash_fnc(key)&table->cust_table_field.hashmask]);\
} \
\
+static inline \
+void cust_prefix##_privdummy(cust_table_t *table) \
+{/*used to suppress warning about unused static function generated by GAVL*/\
+ cust3_privtree_init_root_field(&(table->cust_table_field.treeroots.treesingle));\
+} \
+\
static \
int cust_prefix##_privinternal_insert(cust_table_t *table, cust_item_t *item)\
{\
int cust_prefix##_insert(cust_table_t *table, cust_item_t *item)\
{\
int res;\
- if(cust_expand_ratio<=0?0:(table->cust_table_field.count/cust_expand_ratio>table->cust_table_field.hashmask)) \
- cust_prefix##_resize_table(table, (table->cust_table_field.hashmask+1)<<1);\
+ if((cust_sizestep)!=ul_hashtab_sizestep_null) \
+ if((table->cust_table_field.sizestep<ul_hashtab_sizestep_max(cust_sizestep))&& \
+ (table->cust_table_field.count>=(cust_sizestep)[table->cust_table_field.sizestep].toexpand)) {\
+ table->cust_table_field.sizestep++; \
+ cust_prefix##_resize_table(table, (cust_sizestep)[table->cust_table_field.sizestep].size);\
+ } \
cust_hash_prep_fnc(item);\
res=cust_prefix##_privinternal_insert(table, item);\
if(res>0) \
res=cust_prefix##_privtree_delete(cust_prefix##_privtree_tree4item(table, item), item);\
if(res>0) { \
table->cust_table_field.count--; \
- if(cust_shrink_ratio<=0?0:(table->cust_table_field.count/cust_shrink_ratio<table->cust_table_field.hashmask)) \
- cust_prefix##_resize_table(table, (table->cust_table_field.hashmask>>1)+1);\
+ if(((cust_sizestep)!=ul_hashtab_sizestep_null)&&table->cust_table_field.sizestep) {\
+ if(table->cust_table_field.sizestep>ul_hashtab_sizestep_max(cust_sizestep)) \
+ table->cust_table_field.sizestep=ul_hashtab_sizestep_max(cust_sizestep); \
+ if(table->cust_table_field.count<=(cust_sizestep)[table->cust_table_field.sizestep].toshrink) {\
+ table->cust_table_field.sizestep--; \
+ cust_prefix##_resize_table(table, (cust_sizestep)[table->cust_table_field.sizestep].size);\
+ } \
+ } \
}\
return res; \
} \
if(cust_prefix##_privtree_search_node(treeroot, key, &node)) \
return NULL; \
cust_prefix##_privtree_delete_node((ul_hashtab_treeroot_t *)treeroot, node); \
+ table->cust_table_field.count--; \
return cust_prefix##_privtree_node2item(NULL,node); \
} \
\