add a way to set a free callback for the keys in ecore_tree

SVN revision: 30228
This commit is contained in:
Peter Wehrfritz 2007-06-04 15:28:29 +00:00
parent 849e428e7f
commit f3ae942b0a
2 changed files with 51 additions and 20 deletions

View File

@ -252,10 +252,10 @@ extern "C" {
int index; /* The current index into the bucket table */ int index; /* The current index into the bucket table */
Ecore_Compare_Cb compare; /* The function used to compare node values */ Ecore_Compare_Cb compare; /* The function used to compare node values */
Ecore_Hash_Cb hash_func; /* The function used to compare node values */ Ecore_Hash_Cb hash_func; /* The callback function to determine hash */
Ecore_Free_Cb free_key; /* The callback function to free key */ Ecore_Free_Cb free_key; /* The callback function to free key */
Ecore_Free_Cb free_value; /* The callback function to determine hash */ Ecore_Free_Cb free_value; /* The callback function to free value */
}; };
/* Create and initialize a hash */ /* Create and initialize a hash */
@ -398,7 +398,7 @@ extern "C" {
struct _Ecore_Tree_Node { struct _Ecore_Tree_Node {
/* The actual data for each node */ /* The actual data for each node */
const void *key; void *key;
void *value; void *value;
/* Pointers to surrounding nodes */ /* Pointers to surrounding nodes */
@ -421,7 +421,9 @@ extern "C" {
Ecore_Compare_Cb compare_func; Ecore_Compare_Cb compare_func;
/* Callback for freeing node data, default is NULL */ /* Callback for freeing node data, default is NULL */
Ecore_Free_Cb free_func; Ecore_Free_Cb free_value;
/* Callback for freeing node key, default is NULL */
Ecore_Free_Cb free_key;
}; };
/* Some basic tree functions */ /* Some basic tree functions */
@ -444,7 +446,7 @@ extern "C" {
EAPI void *ecore_tree_get_closest_smaller(Ecore_Tree * tree, const void *key); EAPI void *ecore_tree_get_closest_smaller(Ecore_Tree * tree, const void *key);
/* Set the value associated with key to value */ /* Set the value associated with key to value */
EAPI int ecore_tree_set(Ecore_Tree * tree, const void *key, void *value); EAPI int ecore_tree_set(Ecore_Tree * tree, void *key, void *value);
/* Remove the key from the tree */ /* Remove the key from the tree */
EAPI int ecore_tree_remove(Ecore_Tree * tree, const void *key); EAPI int ecore_tree_remove(Ecore_Tree * tree, const void *key);
@ -468,12 +470,13 @@ extern "C" {
/* Allocate and initialize a new node */ /* Allocate and initialize a new node */
EAPI Ecore_Tree_Node *ecore_tree_node_new(void); EAPI Ecore_Tree_Node *ecore_tree_node_new(void);
/* Free the desired node */ /* Free the desired node */
EAPI int ecore_tree_node_destroy(Ecore_Tree_Node * node, Ecore_Free_Cb free_data); EAPI int ecore_tree_node_destroy(Ecore_Tree_Node * node,
Ecore_Free_Cb free_value, Ecore_Free_Cb free_key);
/* Set the node's key to key */ /* Set the node's key to key */
EAPI int ecore_tree_node_key_set(Ecore_Tree_Node * node, const void *key); EAPI int ecore_tree_node_key_set(Ecore_Tree_Node * node, void *key);
/* Retrieve the key in node */ /* Retrieve the key in node */
EAPI const void *ecore_tree_node_key_get(Ecore_Tree_Node * node); EAPI void *ecore_tree_node_key_get(Ecore_Tree_Node * node);
/* Set the node's value to value */ /* Set the node's value to value */
EAPI int ecore_tree_node_value_set(Ecore_Tree_Node * node, void *value); EAPI int ecore_tree_node_value_set(Ecore_Tree_Node * node, void *value);
@ -481,7 +484,9 @@ extern "C" {
EAPI void *ecore_tree_node_value_get(Ecore_Tree_Node * node); EAPI void *ecore_tree_node_value_get(Ecore_Tree_Node * node);
/* Add a function to free the data stored in nodes */ /* Add a function to free the data stored in nodes */
EAPI int ecore_tree_set_free_cb(Ecore_Tree * tree, Ecore_Free_Cb free_func); EAPI int ecore_tree_set_free_value(Ecore_Tree * tree, Ecore_Free_Cb free_value);
/* Add a function to free the keys stored in nodes */
EAPI int ecore_tree_set_free_key(Ecore_Tree * tree, Ecore_Free_Cb free_key);
EAPI Ecore_Strbuf * ecore_strbuf_new(void); EAPI Ecore_Strbuf * ecore_strbuf_new(void);

View File

@ -73,11 +73,27 @@ ecore_tree_init(Ecore_Tree *new_tree, Ecore_Compare_Cb compare_func)
* @return Returns TRUE on successful set, FALSE otherwise. * @return Returns TRUE on successful set, FALSE otherwise.
*/ */
EAPI int EAPI int
ecore_tree_set_free_cb(Ecore_Tree *tree, Ecore_Free_Cb free_func) ecore_tree_set_free_value(Ecore_Tree *tree, Ecore_Free_Cb free_value)
{ {
CHECK_PARAM_POINTER_RETURN("tree", tree, FALSE); CHECK_PARAM_POINTER_RETURN("tree", tree, FALSE);
tree->free_func = free_func; tree->free_value = free_value;
return TRUE;
}
/*
* @brief Add a function to be called at node destroy time
* @param tree: the tree that will use this function when nodes are destroyed
* @param free_key: the function that will be passed the node being freed
* @return Returns TRUE on successful set, FALSE otherwise.
*/
EAPI int
ecore_tree_set_free_key(Ecore_Tree *tree, Ecore_Free_Cb free_key)
{
CHECK_PARAM_POINTER_RETURN("tree", tree, FALSE);
tree->free_key = free_key;
return TRUE; return TRUE;
} }
@ -134,12 +150,14 @@ ecore_tree_node_new()
* If you don't want the children free'd then you need to remove the node first. * If you don't want the children free'd then you need to remove the node first.
*/ */
EAPI int EAPI int
ecore_tree_node_destroy(Ecore_Tree_Node *node, Ecore_Free_Cb data_free) ecore_tree_node_destroy(Ecore_Tree_Node *node, Ecore_Free_Cb value_free, Ecore_Free_Cb key_free)
{ {
CHECK_PARAM_POINTER_RETURN("node", node, FALSE); CHECK_PARAM_POINTER_RETURN("node", node, FALSE);
if (data_free) if (key_free)
data_free(node->value); key_free(node->key);
if (value_free)
value_free(node->value);
FREE(node); FREE(node);
@ -185,7 +203,7 @@ ecore_tree_node_value_get(Ecore_Tree_Node *node)
* @return Returns TRUE if the node is set successfully, FALSE if not. * @return Returns TRUE if the node is set successfully, FALSE if not.
*/ */
EAPI int EAPI int
ecore_tree_node_key_set(Ecore_Tree_Node *node, const void *key) ecore_tree_node_key_set(Ecore_Tree_Node *node, void *key)
{ {
CHECK_PARAM_POINTER_RETURN("node", node, FALSE); CHECK_PARAM_POINTER_RETURN("node", node, FALSE);
@ -200,10 +218,10 @@ ecore_tree_node_key_set(Ecore_Tree_Node *node, const void *key)
* *
* @return Returns NULL if an error occurs, otherwise the key is returned * @return Returns NULL if an error occurs, otherwise the key is returned
*/ */
EAPI const void * EAPI void *
ecore_tree_node_key_get(Ecore_Tree_Node *node) ecore_tree_node_key_get(Ecore_Tree_Node *node)
{ {
const void *ret; void *ret;
CHECK_PARAM_POINTER_RETURN("node", node, NULL); CHECK_PARAM_POINTER_RETURN("node", node, NULL);
ret = node->key; ret = node->key;
@ -227,7 +245,7 @@ ecore_tree_destroy(Ecore_Tree *tree)
while ((node = tree->tree)) while ((node = tree->tree))
{ {
ecore_tree_remove_node(tree, node); ecore_tree_remove_node(tree, node);
ecore_tree_node_destroy(node, tree->free_func); ecore_tree_node_destroy(node, tree->free_value, tree->free_key);
} }
FREE(tree); FREE(tree);
@ -334,7 +352,7 @@ ecore_tree_get_closest_smaller(Ecore_Tree *tree, const void *key)
* @return TRUE if successful, FALSE if not. * @return TRUE if successful, FALSE if not.
*/ */
EAPI int EAPI int
ecore_tree_set(Ecore_Tree *tree, const void *key, void *value) ecore_tree_set(Ecore_Tree *tree, void *key, void *value)
{ {
Ecore_Tree_Node *node = NULL; Ecore_Tree_Node *node = NULL;
@ -348,6 +366,14 @@ ecore_tree_set(Ecore_Tree *tree, const void *key, void *value)
if (!ecore_tree_add_node(tree, node)) if (!ecore_tree_add_node(tree, node))
return FALSE; return FALSE;
} }
else
{
if (tree->free_key)
tree->free_key(key);
if (node->value && tree->free_value)
tree->free_value(node->value);
}
ecore_tree_node_value_set(node, value); ecore_tree_node_value_set(node, value);
for (; node; node = node->parent) for (; node; node = node->parent)
@ -537,7 +563,7 @@ ecore_tree_remove(Ecore_Tree *tree, const void *key)
if (!ecore_tree_remove_node(tree, node)) if (!ecore_tree_remove_node(tree, node))
return FALSE; return FALSE;
ecore_tree_node_destroy(node, tree->free_func); ecore_tree_node_destroy(node, tree->free_value, tree->free_key);
return TRUE; return TRUE;
} }