summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-07 13:46:27 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-02-07 13:46:27 +0100
commitc2b9597c49abeef3f333b1bf7221a51019d53668 (patch)
tree5dce36316710fb0ea3f113aaea191841a5d2248e
parentf6531b10353dacdcbab211a31926c165211cf3b3 (diff)
Fixed unregisterNode function
-rw-r--r--src/plugins/plain/DynamicTokenTree.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/plugins/plain/DynamicTokenTree.cpp b/src/plugins/plain/DynamicTokenTree.cpp
index 25f6a54..8b7bfc2 100644
--- a/src/plugins/plain/DynamicTokenTree.cpp
+++ b/src/plugins/plain/DynamicTokenTree.cpp
@@ -42,7 +42,8 @@ bool DynamicTokenTree::registerToken(const std::string &token,
const char c = token[i];
auto it = node->children.find(c);
if (it == node->children.end()) {
- it = node->children.emplace(c, std::unique_ptr<Node>(new Node{})).first;
+ it = node->children.emplace(c, std::unique_ptr<Node>(new Node{}))
+ .first;
}
node = it->second.get();
}
@@ -69,7 +70,7 @@ bool DynamicTokenTree::unregisterToken(const std::string &token) noexcept
Node *subtreeRoot = &root;
char subtreeKey = token[0];
Node *node = &root;
- for (size_t i = 0; i < token.size() - 1; i++) {
+ for (size_t i = 0; i < token.size(); i++) {
// Go to the next node, abort if the tree ends unexpectedly
auto it = node->children.find(token[i]);
if (it == node->children.end()) {
@@ -77,15 +78,20 @@ bool DynamicTokenTree::unregisterToken(const std::string &token) noexcept
}
// Reset the subtree handler if this node has another descriptor
- Node *child = it->second.get();
- if ((child->descriptor != nullptr || child->children.size() > 1)) {
- subtreeRoot = child;
+ node = it->second.get();
+ if ((node->descriptor != nullptr || node->children.size() > 1) &&
+ (i + 1 != token.size())) {
+ subtreeRoot = node;
subtreeKey = token[i + 1];
}
- node = child;
}
- // If the leaf node, we cannot delete the subtree. Set the
+ // If the node descriptor is already nullptr, we cannot do anything here
+ if (node->descriptor == nullptr) {
+ return false;
+ }
+
+ // If the target node has children, we cannot delete the subtree. Set the
// descriptor to nullptr instead
if (!node->children.empty()) {
node->descriptor = nullptr;