25 #ifndef DOXYGEN_SHOULD_SKIP_THIS
27 template<
class T>
struct CSetNode
53 CSet(int32_t size=41, int32_t reserved=128,
bool tracable=
true)
63 hash_array=(CSetNode<T>**) calloc(size,
sizeof(CSetNode<T>*));
65 for (int32_t i=0; i<size; i++)
101 virtual const char*
get_name()
const {
return "Set"; }
107 void add(
const T& element)
109 int32_t index=hash(element);
110 if (chain_search(index, element)==NULL)
112 insert_key(index, element);
123 int32_t index=hash(element);
124 if (chain_search(index, element)!=NULL)
134 void remove(
const T& element)
136 int32_t index=hash(element);
137 CSetNode<T>* result=chain_search(index, element);
141 delete_key(index, result);
153 int32_t index=hash(element);
154 CSetNode<T>* result=chain_search(index, element);
157 return result->index;
216 int32_t hash(
const T& element)
222 bool is_free(CSetNode<T>*
node)
224 if (node->free==
true)
231 CSetNode<T>* chain_search(int32_t index,
const T& element)
243 if (current->element==element)
246 current=current->right;
248 }
while (current!=NULL);
255 void insert_key(int32_t index,
const T& element)
266 new_node=(CSetNode<T>*) calloc(1,
sizeof(CSetNode<T>));
276 ASSERT(is_free(new_node));
282 new_node->index=new_index;
283 new_node->free=
false;
284 new_node->element=element;
286 new_node->right=NULL;
303 void delete_key(int32_t index, CSetNode<T>* node)
310 if (node->right!=NULL)
311 node->right->left = node->left;
313 if (node->left!=NULL)
314 node->left->right = node->right;