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

Reply via email to