trying to debug map
This commit is contained in:
@@ -274,6 +274,7 @@ public:
|
|||||||
inline mapped_type& operator[](const key_type& key)
|
inline mapped_type& operator[](const key_type& key)
|
||||||
{
|
{
|
||||||
root = splay(root, key);
|
root = splay(root, key);
|
||||||
|
verifyTree();
|
||||||
markIteratorDirty();
|
markIteratorDirty();
|
||||||
if (root >= nodeContainer.size()
|
if (root >= nodeContainer.size()
|
||||||
|| comp(getNode(root)->pair.key, key)
|
|| comp(getNode(root)->pair.key, key)
|
||||||
@@ -287,6 +288,7 @@ public:
|
|||||||
inline mapped_type& operator[](key_type&& key)
|
inline mapped_type& operator[](key_type&& key)
|
||||||
{
|
{
|
||||||
root = splay(root, std::move(key));
|
root = splay(root, std::move(key));
|
||||||
|
verifyTree();
|
||||||
markIteratorDirty();
|
markIteratorDirty();
|
||||||
if (root >= nodeContainer.size()
|
if (root >= nodeContainer.size()
|
||||||
|| comp(getNode(root)->pair.key, key)
|
|| comp(getNode(root)->pair.key, key)
|
||||||
@@ -300,6 +302,7 @@ public:
|
|||||||
iterator find(const key_type& key)
|
iterator find(const key_type& key)
|
||||||
{
|
{
|
||||||
root = splay(root, key);
|
root = splay(root, key);
|
||||||
|
verifyTree();
|
||||||
refreshIterators();
|
refreshIterators();
|
||||||
if (!isValid(root)
|
if (!isValid(root)
|
||||||
|| comp(getNode(root)->pair.key, key)
|
|| comp(getNode(root)->pair.key, key)
|
||||||
@@ -312,6 +315,7 @@ public:
|
|||||||
iterator find(key_type&& key)
|
iterator find(key_type&& key)
|
||||||
{
|
{
|
||||||
root = splay(root, std::move(key));
|
root = splay(root, std::move(key));
|
||||||
|
verifyTree();
|
||||||
refreshIterators();
|
refreshIterators();
|
||||||
if (!isValid(root)
|
if (!isValid(root)
|
||||||
|| comp(getNode(root)->pair.key, key)
|
|| comp(getNode(root)->pair.key, key)
|
||||||
@@ -324,12 +328,14 @@ public:
|
|||||||
iterator erase(const key_type& key)
|
iterator erase(const key_type& key)
|
||||||
{
|
{
|
||||||
root = remove(root, key);
|
root = remove(root, key);
|
||||||
|
verifyTree();
|
||||||
refreshIterators();
|
refreshIterators();
|
||||||
return iterator(root, &nodeContainer);
|
return iterator(root, &nodeContainer);
|
||||||
}
|
}
|
||||||
iterator erase(K&& key)
|
iterator erase(K&& key)
|
||||||
{
|
{
|
||||||
root = remove(root, std::move(key));
|
root = remove(root, std::move(key));
|
||||||
|
verifyTree();
|
||||||
refreshIterators();
|
refreshIterators();
|
||||||
return iterator(root, &nodeContainer);
|
return iterator(root, &nodeContainer);
|
||||||
}
|
}
|
||||||
@@ -386,6 +392,34 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void verifyTree()
|
||||||
|
{
|
||||||
|
for(size_t i = 0; i < nodeContainer.size(); ++i)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
for(auto it : nodeContainer)
|
||||||
|
{
|
||||||
|
if(it.leftChild == i)
|
||||||
|
{
|
||||||
|
assert(!found);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if(it.rightChild == i)
|
||||||
|
{
|
||||||
|
assert(!found);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isValid(nodeContainer[i].leftChild))
|
||||||
|
{
|
||||||
|
assert(comp(nodeContainer[nodeContainer[i].leftChild].pair.key, nodeContainer[i].pair.key));
|
||||||
|
}
|
||||||
|
if(isValid(nodeContainer[i].rightChild))
|
||||||
|
{
|
||||||
|
assert(comp(nodeContainer[i].pair.key, nodeContainer[nodeContainer[i].rightChild].pair.key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Node* getNode(size_t index) const
|
Node* getNode(size_t index) const
|
||||||
{
|
{
|
||||||
if(!isValid(index)) return nullptr;
|
if(!isValid(index)) return nullptr;
|
||||||
@@ -477,11 +511,11 @@ private:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
r = splay(r, key);
|
r = splay(r, key);
|
||||||
|
Node* node = getNode(r);
|
||||||
|
|
||||||
if (!(comp(node->pair.key, key) || comp(key, node->pair.key)))
|
if (!(comp(node->pair.key, key) || comp(key, node->pair.key)))
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
Node* node = getNode(r);
|
|
||||||
Node *newNode = &nodeContainer.emplace(std::forward<KeyType>(key));
|
Node *newNode = &nodeContainer.emplace(std::forward<KeyType>(key));
|
||||||
|
|
||||||
if (comp(key, node->pair.key))
|
if (comp(key, node->pair.key))
|
||||||
|
|||||||
Reference in New Issue
Block a user