namespace com;
+#if !defined(_DEBUG) || defined(MEMINFO)
import "instance" // TOFIX: This is required to build Debug on Ubuntu 10.04, GCC 4.4.3
+#endif
import "CustomAVLTree"
default:
}
}
- void Remove(MapNode<MT, V> node)
+ void FreeKey(MapNode<MT, V> node)
{
- CustomAVLTree::Remove(node);
if(class(MT).type == structClass)
{
// TODO: Make this easier...
}
else
delete node.key;
+ }
+
+ void Remove(MapNode<MT, V> node)
+ {
+ CustomAVLTree::Remove(node);
+ FreeKey(node);
delete node;
}
void Free()
{
MapNode<MT, V> node = root;
- uintsize offset = class(MT).type == structClass ? class(MT).structSize - sizeof(node.AVLNode::key) : 0;
while(node)
{
if(node.left)
else
{
MapNode<MT, V> parent = node.parent;
- MapNode<MT, V> n = (MapNode<MT, V>)((byte *)node + offset);
- delete n.value;
+ V value = GetData(node);
+ delete value;
+ FreeKey(node);
delete node;
node = parent;
void Delete(MapNode<MT, V> node)
{
- MapNode<MT, V> n = node;
-
- // Adjust node pointer for non-standard AVLNode
- if(class(MT).type == structClass)
- n = (MapNode<MT, V>)(((byte *) node) + class(MT).structSize - sizeof(node.AVLNode::key));
-
- delete n.value;
-
+ V value = GetData(node);
+ delete value;
+ FreeKey(node);
Remove(node);
}
node = MapNode<MT, V> { key = pos };
}
if((Tclass.type == systemClass && !Tclass.byValueSystemClass) || Tclass.type == bitClass || Tclass.type == enumClass || Tclass.type == unitClass)
- onCopy(Tclass, (byte *)&node.key + __ENDIAN_PAD(Tclass.typeSize), (byte *)&pos + __ENDIAN_PAD(Tclass.typeSize));
+ // onCopy(Tclass, (byte *)&node.key + __ENDIAN_PAD(Tclass.typeSize), (byte *)&pos + __ENDIAN_PAD(Tclass.typeSize));
+ memcpy((byte *)&node.key + __ENDIAN_PAD(Tclass.typeSize), (byte *)&pos + __ENDIAN_PAD(Tclass.typeSize), Tclass.typeSize);
else
onCopy(Tclass, (byte *)&node.key + __ENDIAN_PAD(sizeof(void *)), (void *)pos);
- CustomAVLTree::AddEx((T)node, (T)addNode, addSide);
+ CustomAVLTree::AddEx((T)(uintptr)node, (T)(uintptr)addNode, addSide);
if(justAdded) *justAdded = true;
}
return node;