diff --git a/base/mem_trie.hpp b/base/mem_trie.hpp index 234a4e0cd0..38eb9280c5 100644 --- a/base/mem_trie.hpp +++ b/base/mem_trie.hpp @@ -227,7 +227,7 @@ public: while (it != key.end()) { bool created; - curr = &curr->GetOrCreateMove(*it, created); + curr = &curr->GetOrCreateMove(*it++, created); auto & edge = curr->m_edge; @@ -238,9 +238,6 @@ public: continue; } - ASSERT(!edge.Empty(), ()); - ASSERT_EQUAL(edge[0], *it, ()); - size_t i = 0; SkipEqual(edge, key.end(), i, it); @@ -261,6 +258,7 @@ public: ASSERT(!edge.Empty(), ()); auto const next = edge[0]; + edge.Drop(1); node->Swap(*curr); curr->AddChild(next, std::move(node)); @@ -362,6 +360,8 @@ private: return prefix; } + void Prepend(Char c) { m_label.push_back(c); } + void Prepend(Edge const & prefix) { m_label.insert(m_label.end(), prefix.m_label.begin(), prefix.m_label.end()); @@ -467,7 +467,7 @@ private: { ASSERT(it != prefix.end(), ()); - cur = cur->GetMove(*it); + cur = cur->GetMove(*it++); if (!cur) return; @@ -502,14 +502,19 @@ private: if (root.m_values.Empty() && root.m_moves.Size() == 1) { Node child; - root.m_moves.ForEach([&](Char const & /* c */, Node & node) { child.Swap(node); }); + Char c; + root.m_moves.ForEach([&](Char const & mc, Node & mn) { + c = mc; + child.Swap(mn); + }); + child.m_edge.Prepend(c); child.m_edge.Prepend(root.m_edge); root.Swap(child); } return; } - auto const symbol = *cur; + auto const symbol = *cur++; auto * child = root.GetMove(symbol); if (!child) @@ -539,6 +544,7 @@ private: { auto const size = prefix.size(); auto const edge = node.m_edge.template As(); + prefix.push_back(c); prefix.insert(prefix.end(), edge.begin(), edge.end()); ForEachInSubtree(node, prefix, toDo); prefix.resize(size); diff --git a/indexer/trie.hpp b/indexer/trie.hpp index eb67580b93..c2c243e74b 100644 --- a/indexer/trie.hpp +++ b/indexer/trie.hpp @@ -60,7 +60,10 @@ public: Base::m_values = inIt.GetValues(); inIt.ForEachMove([&](Char c, InnerIterator it) { auto const label = it.GetLabel(); - Base::m_edges.emplace_back(label.begin(), label.end()); + Base::m_edges.emplace_back(); + auto & edge = Base::m_edges.back().m_label; + edge.push_back(c); + edge.append(label); m_moves.push_back(it); }); }