Enlightenment CVS committal Author : pfritz Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore Modified Files: Ecore_Data.h ecore_tree.c Log Message: add a way to set a free callback for the keys in ecore_tree =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/Ecore_Data.h,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- Ecore_Data.h 23 May 2007 15:20:55 -0000 1.43 +++ Ecore_Data.h 4 Jun 2007 15:28:29 -0000 1.44 @@ -252,10 +252,10 @@ int index; /* The current index into the bucket table */ 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_value; /* The callback function to determine hash */ + Ecore_Free_Cb free_value; /* The callback function to free value */ }; /* Create and initialize a hash */ @@ -398,7 +398,7 @@ struct _Ecore_Tree_Node { /* The actual data for each node */ - const void *key; + void *key; void *value; /* Pointers to surrounding nodes */ @@ -421,7 +421,9 @@ Ecore_Compare_Cb compare_func; /* 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 */ @@ -444,7 +446,7 @@ EAPI void *ecore_tree_get_closest_smaller(Ecore_Tree * tree, const void *key); /* 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 */ EAPI int ecore_tree_remove(Ecore_Tree * tree, const void *key); @@ -468,12 +470,13 @@ /* Allocate and initialize a new node */ EAPI Ecore_Tree_Node *ecore_tree_node_new(void); /* 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 */ - 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 */ - 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 */ EAPI int ecore_tree_node_value_set(Ecore_Tree_Node * node, void *value); @@ -481,7 +484,9 @@ EAPI void *ecore_tree_node_value_get(Ecore_Tree_Node * node); /* 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); =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore/ecore_tree.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- ecore_tree.c 23 May 2007 15:20:55 -0000 1.11 +++ ecore_tree.c 4 Jun 2007 15:28:29 -0000 1.12 @@ -73,11 +73,27 @@ * @return Returns TRUE on successful set, FALSE otherwise. */ 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); - 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; } @@ -134,12 +150,14 @@ * If you don't want the children free'd then you need to remove the node first. */ 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); - if (data_free) - data_free(node->value); + if (key_free) + key_free(node->key); + if (value_free) + value_free(node->value); FREE(node); @@ -185,7 +203,7 @@ * @return Returns TRUE if the node is set successfully, FALSE if not. */ 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); @@ -200,10 +218,10 @@ * * @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) { - const void *ret; + void *ret; CHECK_PARAM_POINTER_RETURN("node", node, NULL); ret = node->key; @@ -227,7 +245,7 @@ while ((node = tree->tree)) { 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); @@ -334,7 +352,7 @@ * @return TRUE if successful, FALSE if not. */ 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; @@ -348,6 +366,14 @@ if (!ecore_tree_add_node(tree, node)) 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); for (; node; node = node->parent) @@ -537,7 +563,7 @@ if (!ecore_tree_remove_node(tree, node)) return FALSE; - ecore_tree_node_destroy(node, tree->free_func); + ecore_tree_node_destroy(node, tree->free_value, tree->free_key); return TRUE; } ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs