sdk: const correctness
[sdk] / ecere / src / com / containers / AVLTree.ec
1 namespace com;
2
3 import "CustomAVLTree"
4
5 public class AVLTree<class AT> : CustomAVLTree<BT = AVLNode<AT>, KT = AT, T = AT, D = AT>
6 {
7    class_fixed
8
9    AT GetData(AVLNode<AT> node)
10    {
11       return node ? ((class(AT).type == structClass) ? (AT)(((byte *)&(uint64)node.key) + __ENDIAN_PAD(sizeof(void *))) : node.key) : (AT)0;
12    }
13
14    bool SetData(AVLNode<AT> node, AT value)
15    {
16       if(!Find(value))
17       {
18          Remove(node);
19          if(class(AT).type == structClass)
20             memcpy((void *)(((byte *)&(uint64)node.key) + __ENDIAN_PAD(sizeof(void *))), (void *)value, class(AT).structSize);
21          else
22             node.key = value;
23          AVLTree::Add((AT)node);
24          return true;
25       }
26       return false;
27    }
28
29    AVLNode<AT> Add(AT value)
30    {
31       AVLNode<AT> node;
32       if(class(AT).type == structClass)
33       {
34          node = (AVLNode<AT>)new0 byte[sizeof(class AVLNode) + class(AT).structSize - sizeof(node.key)];
35          memcpy((void *)(((byte *)&(uint64)node.key) + __ENDIAN_PAD(sizeof(void *))), (void *)value, class(AT).structSize);
36       }
37       else
38          node = (AVLNode<AT>)AVLNode { key = value };
39       if(!CustomAVLTree::Add((AT)node))
40          delete node;
41       return node;
42    }
43
44    void Remove(AVLNode<AT> node)
45    {
46       CustomAVLTree::Remove(node);
47       delete node;
48    }
49
50    AVLNode<AT> Find(const AT key)
51    {
52       AVLNode<AT> root = this.root;
53       return root ? root.Find(class(AT), key) : null;
54    }
55
56    // *** FIND ALL COMPARES KEY FOR EQUALITY, NOT USING OnCompare ***
57    AVLNode<AT> FindAll(const AT key)
58    {
59       AVLNode<AT> root = this.root;
60       return root ? root.FindAll(key) : null;
61    }
62 };