forked from organicmaps/organicmaps
[base] Compressed MemTrie optimization.
This commit is contained in:
parent
ccef4a9f61
commit
bb81febba8
2 changed files with 17 additions and 8 deletions
|
@ -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<String>();
|
||||
prefix.push_back(c);
|
||||
prefix.insert(prefix.end(), edge.begin(), edge.end());
|
||||
ForEachInSubtree(node, prefix, toDo);
|
||||
prefix.resize(size);
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue