diff --git a/coding/coding_tests/succinct_trie_test.cpp b/coding/coding_tests/succinct_trie_test.cpp index 7ae8cb6db9..d757ce2dc8 100644 --- a/coding/coding_tests/succinct_trie_test.cpp +++ b/coding/coding_tests/succinct_trie_test.cpp @@ -107,16 +107,15 @@ void ReadAllValues(trie::SuccinctTrieIterator & ro values.push_back(root.GetValue(i)); } -void CollectInSubtree( - unique_ptr> const & root, - vector & collectedValues) +void CollectInSubtree(trie::SuccinctTrieIterator & root, + vector & collectedValues) { - ReadAllValues(*root.get(), collectedValues); + ReadAllValues(root, collectedValues); - if (auto l = root->GoToEdge(0)) - CollectInSubtree(l, collectedValues); - if (auto r = root->GoToEdge(1)) - CollectInSubtree(r, collectedValues); + if (auto l = root.GoToEdge(0)) + CollectInSubtree(*l, collectedValues); + if (auto r = root.GoToEdge(1)) + CollectInSubtree(*r, collectedValues); } } // namespace @@ -188,9 +187,10 @@ UNIT_TEST(SuccinctTrie_Iterator) using TEmptyValue = trie::EmptyValueReader::ValueType; auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader()); + TEST(trieRoot, ()); vector collectedValues; - CollectInSubtree(trieRoot, collectedValues); + CollectInSubtree(*trieRoot, collectedValues); sort(collectedValues.begin(), collectedValues.end()); TEST_EQUAL(collectedValues.size(), 5, ()); for (size_t i = 0; i < collectedValues.size(); ++i) diff --git a/coding/coding_tests/trie_test.cpp b/coding/coding_tests/trie_test.cpp index be14a55d92..ce8f4ecd2d 100644 --- a/coding/coding_tests/trie_test.cpp +++ b/coding/coding_tests/trie_test.cpp @@ -238,7 +238,7 @@ UNIT_TEST(TrieBuilder_Build) MemReader memReader = MemReader(&serial[0], serial.size()); using IteratorType = trie::Iterator::ValueType>; - unique_ptr const root(trie::ReadTrie(memReader, trie::FixedSizeValueReader<4>())); + auto const root = trie::ReadTrie(memReader, trie::FixedSizeValueReader<4>()); vector res; KeyValuePairBackInserter f; trie::ForEachRef(*root, f, vector()); diff --git a/coding/succinct_trie_reader.hpp b/coding/succinct_trie_reader.hpp index fa049ebf73..cc61d6b0f2 100644 --- a/coding/succinct_trie_reader.hpp +++ b/coding/succinct_trie_reader.hpp @@ -10,6 +10,7 @@ #include "base/macros.hpp" #include "base/string_utils.hpp" +#include "std/unique_ptr.hpp" #include "std/utility.hpp" #include "std/vector.hpp" diff --git a/coding/trie.hpp b/coding/trie.hpp index 2d98e937c2..7df24ff237 100644 --- a/coding/trie.hpp +++ b/coding/trie.hpp @@ -4,8 +4,7 @@ #include "base/base.hpp" #include "base/buffer_vector.hpp" -#include "std/unique_ptr.hpp" - +#include "std/shared_ptr.hpp" namespace trie { @@ -34,8 +33,8 @@ public: virtual ~Iterator() {} - virtual Iterator * Clone() const = 0; - virtual Iterator * GoToEdge(size_t i) const = 0; + virtual shared_ptr> Clone() const = 0; + virtual shared_ptr> GoToEdge(size_t i) const = 0; }; struct EmptyValueReader @@ -75,8 +74,8 @@ void ForEachRef(Iterator const & iter, F & f, TString const & s) { TString s1(s); s1.insert(s1.end(), iter.m_edge[i].m_str.begin(), iter.m_edge[i].m_str.end()); - unique_ptr> const pIter1(iter.GoToEdge(i)); - ForEachRef(*pIter1, f, s1); + auto it = iter.GoToEdge(i); + ForEachRef(*it, f, s1); } } diff --git a/coding/trie_reader.hpp b/coding/trie_reader.hpp index 777aad0bfa..08d5b06f77 100644 --- a/coding/trie_reader.hpp +++ b/coding/trie_reader.hpp @@ -13,7 +13,7 @@ template class LeafIterator0 : public Iterator { public: - typedef typename TValueReader::ValueType ValueType; + using ValueType = typename TValueReader::ValueType; template LeafIterator0(TReader const & reader, TValueReader const & valueReader) @@ -33,9 +33,12 @@ public: } // trie::Iterator overrides: - Iterator * Clone() const override { return new LeafIterator0(*this); } + shared_ptr> Clone() const override + { + return make_shared>(*this); + } - Iterator * GoToEdge(size_t i) const override + shared_ptr> GoToEdge(size_t i) const override { ASSERT(false, (i)); UNUSED_VALUE(i); @@ -71,9 +74,12 @@ public: } // trie::Iterator overrides: - Iterator * Clone() const override { return new Iterator0(*this); } + shared_ptr> Clone() const override + { + return make_shared>(*this); + } - Iterator * GoToEdge(size_t i) const override + shared_ptr> GoToEdge(size_t i) const override { ASSERT_LESS(i, this->m_edge.size(), ()); uint32_t const offset = m_edgeInfo[i].m_offset; @@ -87,10 +93,10 @@ public: SharedMemReader memReader(size); m_reader.Read(offset, memReader.Data(), size); if (m_edgeInfo[i].m_isLeaf) - return new LeafIterator0( + return make_shared>( memReader, m_valueReader); else - return new Iterator0( + return make_shared>( memReader, m_valueReader, this->m_edge[i].m_str.back()); } @@ -98,10 +104,11 @@ public: */ { if (m_edgeInfo[i].m_isLeaf) - return new LeafIterator0(m_reader.SubReader(offset, size), m_valueReader); + return make_shared>(m_reader.SubReader(offset, size), + m_valueReader); else - return new Iterator0(m_reader.SubReader(offset, size), m_valueReader, - this->m_edge[i].m_str.back()); + return make_shared>( + m_reader.SubReader(offset, size), m_valueReader, this->m_edge[i].m_str.back()); } } @@ -183,10 +190,10 @@ private: // Returns iterator to the root of the trie. template -Iterator * ReadTrie(TReader const & reader, - TValueReader valueReader = TValueReader()) +shared_ptr> ReadTrie( + TReader const & reader, TValueReader valueReader = TValueReader()) { - return new Iterator0(reader, valueReader, DEFAULT_CHAR); + return make_shared>(reader, valueReader, DEFAULT_CHAR); } } // namespace trie diff --git a/generator/dumper.cpp b/generator/dumper.cpp index 0c39673fb4..daed6b2d1f 100644 --- a/generator/dumper.cpp +++ b/generator/dumper.cpp @@ -200,8 +200,8 @@ namespace feature feature::DataHeader header(container); serial::CodingParams cp(trie::GetCodingParams(header.GetDefCodingParams())); - unique_ptr const pTrieRoot( - trie::ReadTrie(container.GetReader(SEARCH_INDEX_FILE_TAG), trie::ValueReader(cp))); + auto const pTrieRoot = + trie::ReadTrie(container.GetReader(SEARCH_INDEX_FILE_TAG), trie::ValueReader(cp)); SearchTokensCollector f; trie::ForEachRef(*pTrieRoot, f, strings::UniString()); diff --git a/search/feature_offset_match.hpp b/search/feature_offset_match.hpp index bccfa178a4..15838eb584 100644 --- a/search/feature_offset_match.hpp +++ b/search/feature_offset_match.hpp @@ -30,15 +30,14 @@ size_t CalcEqualLength(TSrcIter b, TSrcIter e, TCompIter bC, TCompIter eC) return count; } -inline trie::DefaultIterator * MoveTrieIteratorToString(trie::DefaultIterator const & trieRoot, - strings::UniString const & queryS, - size_t & symbolsMatched, - bool & bFullEdgeMatched) +inline shared_ptr MoveTrieIteratorToString( + trie::DefaultIterator const & trieRoot, strings::UniString const & queryS, + size_t & symbolsMatched, bool & bFullEdgeMatched) { symbolsMatched = 0; bFullEdgeMatched = false; - unique_ptr pIter(trieRoot.Clone()); + auto it = trieRoot.Clone(); size_t const szQuery = queryS.size(); @@ -46,22 +45,19 @@ inline trie::DefaultIterator * MoveTrieIteratorToString(trie::DefaultIterator co { bool bMatched = false; - ASSERT_LESS(pIter->m_edge.size(), std::numeric_limits::max(), ()); - uint32_t const edgeCount = static_cast(pIter->m_edge.size()); + ASSERT_LESS(it->m_edge.size(), std::numeric_limits::max(), ()); + uint32_t const edgeCount = static_cast(it->m_edge.size()); for (uint32_t i = 0; i < edgeCount; ++i) { - size_t const szEdge = pIter->m_edge[i].m_str.size(); + size_t const szEdge = it->m_edge[i].m_str.size(); - size_t const count = CalcEqualLength( - pIter->m_edge[i].m_str.begin(), - pIter->m_edge[i].m_str.end(), - queryS.begin() + symbolsMatched, - queryS.end()); + size_t const count = CalcEqualLength(it->m_edge[i].m_str.begin(), it->m_edge[i].m_str.end(), + queryS.begin() + symbolsMatched, queryS.end()); if ((count > 0) && (count == szEdge || szQuery == count + symbolsMatched)) { - pIter.reset(pIter->GoToEdge(i)); + it = it->GoToEdge(i); bFullEdgeMatched = (count == szEdge); symbolsMatched += count; @@ -73,7 +69,7 @@ inline trie::DefaultIterator * MoveTrieIteratorToString(trie::DefaultIterator co if (!bMatched) return NULL; } - return pIter->Clone(); + return it->Clone(); } namespace @@ -104,10 +100,9 @@ void FullMatchInTrie(trie::DefaultIterator const & trieRoot, strings::UniChar co size_t symbolsMatched = 0; bool bFullEdgeMatched; - unique_ptr const pIter( - MoveTrieIteratorToString(trieRoot, s, symbolsMatched, bFullEdgeMatched)); + auto const it = MoveTrieIteratorToString(trieRoot, s, symbolsMatched, bFullEdgeMatched); - if (!pIter || (!s.empty() && !bFullEdgeMatched) || symbolsMatched != s.size()) + if (!it || (!s.empty() && !bFullEdgeMatched) || symbolsMatched != s.size()) return; #if defined(OMIM_OS_IPHONE) && !defined(__clang__) @@ -117,8 +112,8 @@ void FullMatchInTrie(trie::DefaultIterator const & trieRoot, strings::UniChar co #endif ASSERT_EQUAL ( symbolsMatched, s.size(), () ); - for (size_t i = 0; i < pIter->m_value.size(); ++i) - f(pIter->m_value[i]); + for (size_t i = 0; i < it->m_value.size(); ++i) + f(it->m_value[i]); } template @@ -128,38 +123,34 @@ void PrefixMatchInTrie(trie::DefaultIterator const & trieRoot, strings::UniChar if (!CheckMatchString(rootPrefix, rootPrefixSize, s)) return; - using TQueue = vector; + using TQueue = vector>; TQueue trieQueue; { size_t symbolsMatched = 0; bool bFullEdgeMatched; - trie::DefaultIterator * pRootIter = - MoveTrieIteratorToString(trieRoot, s, symbolsMatched, bFullEdgeMatched); + auto const it = MoveTrieIteratorToString(trieRoot, s, symbolsMatched, bFullEdgeMatched); UNUSED_VALUE(symbolsMatched); UNUSED_VALUE(bFullEdgeMatched); - if (!pRootIter) + if (!it) return; - trieQueue.push_back(pRootIter); + trieQueue.push_back(it); } - // 'f' can throw an exception. So be prepared to delete unprocessed elements. - MY_SCOPE_GUARD(doDelete, GetRangeDeletor(trieQueue, DeleteFunctor())); - while (!trieQueue.empty()) { // Next 2 lines don't throw any exceptions while moving // ownership from container to smart pointer. - unique_ptr const pIter(trieQueue.back()); + auto const it = trieQueue.back(); trieQueue.pop_back(); - for (size_t i = 0; i < pIter->m_value.size(); ++i) - f(pIter->m_value[i]); + for (size_t i = 0; i < it->m_value.size(); ++i) + f(it->m_value[i]); - for (size_t i = 0; i < pIter->m_edge.size(); ++i) - trieQueue.push_back(pIter->GoToEdge(i)); + for (size_t i = 0; i < it->m_edge.size(); ++i) + trieQueue.push_back(it->GoToEdge(i)); } } @@ -350,7 +341,7 @@ bool MatchCategoriesInTrie(SearchQueryParams const & params, trie::DefaultIterat ASSERT_GREATER_OR_EQUAL(edge.size(), 1, ()); if (edge[0] == search::kCategoriesLang) { - unique_ptr const catRoot(trieRoot.GoToEdge(langIx)); + auto const catRoot = trieRoot.GoToEdge(langIx); MatchTokensInTrie(params.m_tokens, TrieRootPrefix(*catRoot, edge), holder); // Last token's prefix is used as a complete token here, to @@ -380,7 +371,7 @@ void ForEachLangPrefix(SearchQueryParams const & params, trie::DefaultIterator c int8_t const lang = static_cast(edge[0]); if (edge[0] < search::kCategoriesLang && params.IsLangExist(lang)) { - unique_ptr const langRoot(trieRoot.GoToEdge(langIx)); + auto const langRoot = trieRoot.GoToEdge(langIx); TrieRootPrefix langPrefix(*langRoot, edge); toDo(langPrefix, lang); } diff --git a/search/retrieval.cpp b/search/retrieval.cpp index 8b47a665c7..44917123a6 100644 --- a/search/retrieval.cpp +++ b/search/retrieval.cpp @@ -49,8 +49,8 @@ void RetrieveAddressFeatures(MwmSet::MwmHandle const & handle, SearchQueryParams ASSERT(value, ()); serial::CodingParams codingParams(trie::GetCodingParams(value->GetHeader().GetDefCodingParams())); ModelReaderPtr searchReader = value->m_cont.GetReader(SEARCH_INDEX_FILE_TAG); - unique_ptr const trieRoot(trie::ReadTrie( - SubReaderWrapper(searchReader.GetPtr()), trie::ValueReader(codingParams))); + auto const trieRoot = trie::ReadTrie(SubReaderWrapper(searchReader.GetPtr()), + trie::ValueReader(codingParams)); MatchFeaturesInTrie(params, *trieRoot, EmptyFilter(), forward(toDo)); } diff --git a/search/search_query.cpp b/search/search_query.cpp index 0d3ab51a61..430b7de9f0 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -1565,8 +1565,8 @@ void Query::SearchLocality(MwmValue const * pMwm, Locality & res1, Region & res2 ModelReaderPtr searchReader = pMwm->m_cont.GetReader(SEARCH_INDEX_FILE_TAG); - unique_ptr const trieRoot( - trie::ReadTrie(SubReaderWrapper(searchReader.GetPtr()), trie::ValueReader(cp))); + auto const trieRoot = + trie::ReadTrie(SubReaderWrapper(searchReader.GetPtr()), trie::ValueReader(cp)); ForEachLangPrefix(params, *trieRoot, [&](TrieRootPrefix & langRoot, int8_t lang) {