ecere/com/containers/CustomAVLTree: Freeing Keys (e.g. for AVLTree)
authorJerome St-Louis <jerome@ecere.com>
Thu, 28 Jul 2016 21:31:01 +0000 (17:31 -0400)
committerJerome St-Louis <jerome@ecere.com>
Thu, 28 Jul 2016 21:35:15 +0000 (17:35 -0400)
ecere/src/com/containers/CustomAVLTree.ec

index e23265b..96fedd3 100644 (file)
@@ -6,6 +6,7 @@ default:
 
 extern int __ecereVMethodID_class_OnCompare;
 extern int __ecereVMethodID_class_OnCopy;
+extern int __ecereVMethodID_class_OnFree;
 private:
 
 enum AddSide : int { compare = 0, left = -1, right = 1};
@@ -573,9 +574,22 @@ public:
       BT item = (BT)_item;
       // THIS SHOULDN'T BE CALLING THE VIRTUAL FUNCTION
       CustomAVLTree::Remove(_item);
+      FreeKey((BT)item);
       delete item;
    }
 
+   void FreeKey(BT item)
+   {
+      if(class(BT).type == structClass)
+      {
+         // TODO: Make this easier...
+         Class Tclass = class(BT);
+         ((void (*)(void *, void *))(void *)Tclass._vTbl[__ecereVMethodID_class_OnFree])(Tclass, (((byte *)&item.key) + __ENDIAN_PAD(sizeof(void *))));
+      }
+      else
+         delete item.key;
+   }
+
    void Free()
    {
       BT item;
@@ -597,6 +611,7 @@ public:
          else
          {
             BT parent = item.parent;
+            FreeKey((BT)item);
             delete item;
             item = parent;
          }