ecere/com/CustomAVLTree: Some optimizations for common int64 case
authorJerome St-Louis <jerome@ecere.com>
Mon, 25 Apr 2016 11:50:20 +0000 (07:50 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sat, 2 Jul 2016 20:41:03 +0000 (16:41 -0400)
ecere/src/com/containers/Container.ec
ecere/src/com/containers/CustomAVLTree.ec

index 483c362..d613b66 100644 (file)
@@ -275,6 +275,7 @@ public:
       return tempString;
    }
 
+   // TODO: Warn against the danger of using TakeOut with 'normal' classes, as they will be considered equivalent if onCompare says so
    void TakeOut(const D d)
    {
       IteratorPointer i = Find(d);
index 3db7c64..e23265b 100644 (file)
@@ -193,6 +193,7 @@ private:
       uint offset = 0;
       ClassType t = Tclass.type;
       int (* onCompare)(void *, void *, void *) = (void *)Tclass._vTbl[__ecereVMethodID_class_OnCompare];
+      bool isInt64 = onCompare == (void *)class(int64).OnCompare;
 
       reference = (t == systemClass && !Tclass.byValueSystemClass) || t == bitClass || t == enumClass || t == unitClass;
       offset = __ENDIAN_PAD(Tclass.typeSize);
@@ -226,10 +227,22 @@ private:
       }
       else
       {
+         int64 a64;
+         if(isInt64)
+            a64 = *(int64 *)a;
          while(this)
          {
             byte * b = reference ? ((byte *)&this.key) + offset : (byte *)(uintptr)this.key;
-            int result = onCompare(Tclass, a, b);
+            int result;
+            if(isInt64)
+            {
+               int64 b64 = *(int64 *)b;
+                    if(a64 > b64) result = 1;
+               else if(a64 < b64) result = -1;
+               else result = 0;
+            }
+            else
+               result = onCompare(Tclass, a, b);
             if(result)
             {
                thisclass node = result < 0 ? left : right;
@@ -506,11 +519,12 @@ public:
          root = node;
       else
       {
-         Class Tclass = class(BT).templateArgs[0].dataTypeClass;
+         Class btClass = class(BT);
+         Class Tclass = btClass.templateArgs[0].dataTypeClass;
          if(!Tclass)
          {
-            Tclass = class(BT).templateArgs[0].dataTypeClass =
-               eSystem_FindClass(__thisModule.application, class(BT).templateArgs[0].dataTypeString);
+            Tclass = btClass.templateArgs[0].dataTypeClass =
+               eSystem_FindClass(__thisModule.application, btClass.templateArgs[0].dataTypeString);
          }
          if(root.Add(Tclass, node, 0))
             root = node.Rebalance();