From afc09e86322023fb7617e47422f826a2b1373c07 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Tue, 15 Nov 2016 21:56:32 +0300 Subject: [PATCH] Review fixes. --- base/string_utils.hpp | 2 +- search/feature_offset_match.hpp | 76 ++++++++++++++++----------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/base/string_utils.hpp b/base/string_utils.hpp index 7875c55890..8a9c925ef4 100644 --- a/base/string_utils.hpp +++ b/base/string_utils.hpp @@ -506,7 +506,7 @@ size_t EditDistance(TIter const & b1, TIter const & e1, TIter const & b2, TIter // dynamic programming table. vector prev(m + 1); vector curr(m + 1); - for (size_t j = 0; j <= m; j++) + for (size_t j = 0; j <= m; ++j) prev[j] = j; auto it1 = b1; // 1-based to avoid corner cases. diff --git a/search/feature_offset_match.hpp b/search/feature_offset_match.hpp index 8edd9292e5..8ed6447b3e 100644 --- a/search/feature_offset_match.hpp +++ b/search/feature_offset_match.hpp @@ -49,22 +49,24 @@ bool FindLangIndex(trie::Iterator> const & trieRoot, uint8_t la } } // namespace -template +template bool MatchInTrie(trie::Iterator> const & trieRoot, - strings::UniChar const * rootPrefix, size_t rootPrefixSize, DFAIt dfa, + strings::UniChar const * rootPrefix, size_t rootPrefixSize, DFA const & dfa, ToDo && toDo) { - using TrieDFA = shared_ptr>>; - using State = pair; - - for (size_t i = 0; i < rootPrefixSize; ++i) - dfa.Move(rootPrefix[i]); - - if (dfa.Rejects()) - return false; + using TrieDFAIt = shared_ptr>>; + using DFAIt = typename DFA::Iterator; + using State = pair; queue q; - q.emplace(trieRoot.Clone(), dfa); + + { + auto it = dfa.Begin(); + DFAMove(it, rootPrefix, rootPrefix + rootPrefixSize); + if (it.Rejects()) + return false; + q.emplace(trieRoot.Clone(), it); + } bool found = false; @@ -73,26 +75,24 @@ bool MatchInTrie(trie::Iterator> const & trieRoot, auto const p = q.front(); q.pop(); - auto const & trie = p.first; - auto const & dfa = p.second; + auto const & trieIt = p.first; + auto const & dfaIt = p.second; - if (dfa.Accepts()) + if (dfaIt.Accepts()) { - trie->m_valueList.ForEach(toDo); + trieIt->m_valueList.ForEach(toDo); found = true; } - size_t const numEdges = trie->m_edge.size(); + size_t const numEdges = trieIt->m_edge.size(); for (size_t i = 0; i < numEdges; ++i) { - auto const & edge = trie->m_edge[i]; + auto const & edge = trieIt->m_edge[i]; - auto cur = dfa; - for (auto c : edge.m_label) - cur.Move(c); - - if (!cur.Rejects()) - q.emplace(trie->GoToEdge(i), cur); + auto curIt = dfaIt; + strings::DFAMove(curIt, edge.m_label.begin(), edge.m_label.end()); + if (!curIt.Rejects()) + q.emplace(trieIt->GoToEdge(i), curIt); } } @@ -100,7 +100,7 @@ bool MatchInTrie(trie::Iterator> const & trieRoot, } template -class OffsetIntersecter +class OffsetIntersector { struct Hash { @@ -122,7 +122,7 @@ class OffsetIntersecter unique_ptr m_set; public: - explicit OffsetIntersecter(Filter const & filter) : m_filter(filter), m_set(make_unique()) {} + explicit OffsetIntersector(Filter const & filter) : m_filter(filter), m_set(make_unique()) {} void operator()(Value const & v) { @@ -220,7 +220,7 @@ template void MatchInTrie(vector const & dfas, TrieRootPrefix const & trieRoot, ToDo && toDo) { for (auto const & dfa : dfas) - impl::MatchInTrie(trieRoot.m_root, trieRoot.m_prefix, trieRoot.m_prefixSize, dfa.Begin(), toDo); + impl::MatchInTrie(trieRoot.m_root, trieRoot.m_prefix, trieRoot.m_prefixSize, dfa, toDo); } // Calls |toDo| for each feature in categories branch matching to |request|. @@ -278,16 +278,16 @@ void MatchFeaturesInTrie(SearchTrieRequest const & request, TrieValuesHolder categoriesHolder(filter); bool const categoriesMatched = MatchCategoriesInTrie(request, trieRoot, categoriesHolder); - impl::OffsetIntersecter intersecter(filter); - ForEachLangPrefix(request, trieRoot, [&](TrieRootPrefix & langRoot, int8_t lang) - { - MatchInTrie(request.m_dfas, langRoot, intersecter); + impl::OffsetIntersector intersector(filter); + ForEachLangPrefix(request, trieRoot, + [&request, &intersector](TrieRootPrefix & langRoot, int8_t lang) { + MatchInTrie(request.m_dfas, langRoot, intersector); }); if (categoriesMatched) - categoriesHolder.ForEachValue(intersecter); + categoriesHolder.ForEachValue(intersector); - intersecter.NextStep(); - intersecter.ForEachResult(forward(toDo)); + intersector.NextStep(); + intersector.ForEachResult(forward(toDo)); } template @@ -304,7 +304,7 @@ void MatchPostcodesInTrie(TokenSlice const & slice, auto const & edge = trieRoot.m_edge[langIx].m_label; auto const postcodesRoot = trieRoot.GoToEdge(langIx); - impl::OffsetIntersecter intersecter(filter); + impl::OffsetIntersector intersector(filter); for (size_t i = 0; i < slice.Size(); ++i) { if (slice.IsPrefix(i)) @@ -313,19 +313,19 @@ void MatchPostcodesInTrie(TokenSlice const & slice, for (auto const & s : slice.Get(i)) dfas.emplace_back(UniStringDFA(s)); - MatchInTrie(dfas, TrieRootPrefix(*postcodesRoot, edge), intersecter); + MatchInTrie(dfas, TrieRootPrefix(*postcodesRoot, edge), intersector); } else { vector dfas; for (auto const & s : slice.Get(i)) dfas.emplace_back(s); - MatchInTrie(dfas, TrieRootPrefix(*postcodesRoot, edge), intersecter); + MatchInTrie(dfas, TrieRootPrefix(*postcodesRoot, edge), intersector); } - intersecter.NextStep(); + intersector.NextStep(); } - intersecter.ForEachResult(forward(toDo)); + intersector.ForEachResult(forward(toDo)); } } // namespace search