3 import "instance" // TOFIX: This is required to build Debug on Ubuntu 10.04, GCC 4.4.3
7 extern int __ecereVMethodID_class_OnCopy;
10 public class MapNode<class KT, class V> : private AVLNode<KT>
16 // THIS IS MISSING CODE FOR struct KEYS
19 get { return AVLNode::key; }
20 set { AVLNode::key = value; }
24 get { return this ? this.value : (V)0; }
25 set { this.value = value; }
29 // BECAUSE WE'RE PRIVATELY INHERITING, UNTIL public() works
30 property thisclass prev { get { return (MapNode<KT,V>)AVLNode::prev; } }
31 property thisclass next { get { return (MapNode<KT,V>)AVLNode::next; } }
32 property thisclass minimum { get { return (MapNode<KT,V>)AVLNode::minimum; } }
33 property thisclass maximum { get { return (MapNode<KT,V>)AVLNode::maximum; } }
36 public struct MapIterator<class KT, class V> : Iterator<V, IT = KT>
40 set { container = (Container<V, IT>)value; }
41 get { return (Map<KT, V>)container; }
45 get { return ((Map<KT, V>)container).GetKey((MapNode<KT, V>)pointer); }
49 get { return container.GetData(pointer); }
50 set { container.SetData(pointer, value); }
54 public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D = V, KT = MT>
58 MT GetKey(MapNode<KT, V> node)
60 if(class(MT).type == structClass)
61 return (MT)(((byte *)&(uint64)node.key) + __ENDIAN_PAD(sizeof(void *)));
65 V GetData(MapNode<MT, V> node)
69 // Adjust node pointer for non-standard AVLNode
70 if(class(MT).type == structClass)
71 node = (MapNode<MT, V>)(((byte *) node) + class(MT).structSize - sizeof(node.AVLNode::key));
72 return (class(V).type == structClass) ? (MT)&node.value : node.value;
77 bool SetData(MapNode<MT, V> node, MT value)
79 // Adjust node pointer for non-standard AVLNode
80 if(class(MT).type == structClass)
81 node = (MapNode<MT, V>)(((byte *) node) + class(MT).structSize - sizeof(node.AVLNode::key));
83 if(class(V).type == structClass)
84 memcpy((void *)&node.value, (void *)value, class(V).structSize);
90 MapNode<MT, V> Add(BT _newNode)
92 MapNode<MT, V> newNode = (MapNode<MT, V>) _newNode;
93 if(class(MT).type == structClass || class(V).type == structClass)
95 MapNode<MT, V> realNode = (MapNode<MT, V>)GetAtPosition(newNode.key, true);
96 SetData(realNode, newNode.value);
101 MapNode<MT, V> node = root ? root.Find(class(MT), (T)newNode.key) : null;
104 Class Tclass = class(MT);
106 if(Tclass.type == systemClass || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass)
108 Tclass._vTbl[__ecereVMethodID_class_OnCopy](Tclass, (((byte *)&(uint64)newNode.key) + __ENDIAN_PAD(Tclass.typeSize)),
109 (((byte *)&(uint64)newNode.key) + __ENDIAN_PAD(Tclass.typeSize)));
112 Tclass._vTbl[__ecereVMethodID_class_OnCopy](Tclass, (((byte *)&(uint64)newNode.key) + __ENDIAN_PAD(sizeof(void *))), (void *)newNode.key);
114 CustomAVLTree::Add((T)newNode);
125 void Remove(MapNode<MT, V> node)
127 CustomAVLTree::Remove(node);
142 void Delete(MapNode<MT, V> node)
148 MapNode<MT, V> Find(V value)
150 return (MapNode<MT, V>)Container::Find(value);
153 MapNode<MT, V> GetAtPosition(MT pos, bool create)
155 MapNode<MT, V> node = root ? root.Find(class(MT), pos) : null;
158 Class Tclass = class(MT);
159 if(class(MT).type == structClass || class(V).type == structClass)
161 uint size = sizeof(class MapNode<MT, V>);
163 if(class(MT).type == structClass) size += class(MT).typeSize - sizeof(node.AVLNode::key);
164 if(class(V).type == structClass) size += class(V).typeSize - sizeof(*&node.value);
165 node = (MapNode<MT, V>)new0 byte[size];
169 node = MapNode<MT, V> { key = pos };
171 if(Tclass.type == systemClass || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass)
173 Tclass._vTbl[__ecereVMethodID_class_OnCopy](Tclass, (((byte *)&(uint64)node.key) + __ENDIAN_PAD(Tclass.typeSize)),
174 (((byte *)&(uint64)pos) + __ENDIAN_PAD(Tclass.typeSize)));
177 Tclass._vTbl[__ecereVMethodID_class_OnCopy](Tclass, (((byte *)&(uint64)node.key) + __ENDIAN_PAD(sizeof(void *))), (void *)pos);
178 CustomAVLTree::Add((T)node);
183 void Copy(Container<T> source)
187 if(!eClass_IsDerived(source._class, class(Map)))
189 for(i = source.GetFirst(); i; i = source.GetNext(i))
191 MapNode<MT, V> srcNode = (MapNode<MT, V>)source.GetData(i);
192 MapNode<MT, V> destNode = (MapNode<MT, V>)GetAtPosition(srcNode.key, true);
193 SetData(destNode, srcNode.value);
195 // ADDED THIS HERE TO FREE BUILTIN CONTAINERS ASSIGNED TO A MAP
196 if(source._class == class(BuiltInContainer))
201 public property Map mapSrc
207 if(eClass_IsDerived(value._class, class(Map)))
209 for(i = value.GetFirst(); i; i = value.GetNext(i))
211 MapNode<MT, V> srcNode = (MapNode<MT, V>)i;
212 MapNode<MT, V> destNode = (MapNode<MT, V>)GetAtPosition(srcNode.key, true);
213 SetData(destNode, GetData(srcNode));