From 9f0abf24fc5c1999636a2c6bc02dcab79a9fb7a6 Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Fri, 25 Sep 2015 18:28:28 +0300 Subject: [PATCH] [omim] Removed EdgeBuilder. --- coding/coding_tests/succinct_trie_test.cpp | 41 +++++------ coding/coding_tests/trie_test.cpp | 44 +++-------- coding/succinct_trie_builder.hpp | 15 +--- coding/succinct_trie_reader.hpp | 27 +++---- coding/trie.hpp | 13 ++-- coding/trie_builder.hpp | 86 +++------------------- coding/trie_reader.hpp | 77 +++++++------------ generator/dumper.cpp | 3 +- indexer/search_index_builder.cpp | 10 +-- indexer/search_trie.hpp | 4 +- search/retrieval.cpp | 5 +- search/search_query.cpp | 3 +- 12 files changed, 96 insertions(+), 232 deletions(-) diff --git a/coding/coding_tests/succinct_trie_test.cpp b/coding/coding_tests/succinct_trie_test.cpp index ed8ae3cf27..7326a69040 100644 --- a/coding/coding_tests/succinct_trie_test.cpp +++ b/coding/coding_tests/succinct_trie_test.cpp @@ -100,17 +100,17 @@ struct SimpleValueList vector m_valueList; }; -void ReadAllValues(unique_ptr> const & root, - vector & values) +void ReadAllValues( + unique_ptr> const & root, + vector & values) { for (size_t i = 0; i < root->NumValues(); ++i) values.push_back(root->GetValue(i)); } -void CollectInSubtree(unique_ptr> const & root, - vector & collectedValues) +void CollectInSubtree( + unique_ptr> const & root, + vector & collectedValues) { ReadAllValues(root, collectedValues); @@ -138,16 +138,14 @@ UNIT_TEST(SuccinctTrie_Serialization_Smoke1) vector data = {StringsFileEntryMock("abacaba", 1)}; - trie::BuildSuccinctTrie::iterator, trie::EmptyEdgeBuilder, - EmptyValueList>(memWriter, data.begin(), data.end(), - trie::EmptyEdgeBuilder()); + trie::BuildSuccinctTrie::iterator, EmptyValueList>( + memWriter, data.begin(), data.end()); MemReader memReader(buf.data(), buf.size()); using TEmptyValue = trie::EmptyValueReader::ValueType; - auto trieRoot = - trie::ReadSuccinctTrie(memReader, trie::EmptyValueReader(), trie::EmptyValueReader()); + auto trieRoot = trie::ReadSuccinctTrie(memReader, trie::EmptyValueReader()); TEST(trieRoot, ()); } @@ -160,15 +158,14 @@ UNIT_TEST(SuccinctTrie_Serialization_Smoke2) vector data = {StringsFileEntryMock("abacaba", 1)}; - trie::BuildSuccinctTrie::iterator, trie::EmptyEdgeBuilder, - SimpleValueList>(memWriter, data.begin(), data.end(), - trie::EmptyEdgeBuilder()); + trie::BuildSuccinctTrie::iterator, + SimpleValueList>(memWriter, data.begin(), data.end()); MemReader memReader(buf.data(), buf.size()); using TEmptyValue = trie::EmptyValueReader::ValueType; - auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader(), trie::EmptyValueReader()); + auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader()); TEST(trieRoot, ()); } @@ -184,15 +181,14 @@ UNIT_TEST(SuccinctTrie_Iterator) StringsFileEntryMock("abc", 5)}; sort(data.begin(), data.end()); - trie::BuildSuccinctTrie::iterator, trie::EmptyEdgeBuilder, - SimpleValueList>(memWriter, data.begin(), data.end(), - trie::EmptyEdgeBuilder()); + trie::BuildSuccinctTrie::iterator, + SimpleValueList>(memWriter, data.begin(), data.end()); MemReader memReader(buf.data(), buf.size()); using TEmptyValue = trie::EmptyValueReader::ValueType; - auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader(), trie::EmptyValueReader()); + auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader()); vector collectedValues; CollectInSubtree(trieRoot, collectedValues); @@ -214,14 +210,13 @@ UNIT_TEST(SuccinctTrie_MoveToString) StringsFileEntryMock("aaa", 3), StringsFileEntryMock("aaa", 4)}; sort(data.begin(), data.end()); - trie::BuildSuccinctTrie::iterator, trie::EmptyEdgeBuilder, - SimpleValueList>(memWriter, data.begin(), data.end(), - trie::EmptyEdgeBuilder()); + trie::BuildSuccinctTrie::iterator, + SimpleValueList>(memWriter, data.begin(), data.end()); MemReader memReader(buf.data(), buf.size()); using TEmptyValue = trie::EmptyValueReader::ValueType; - auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader(), trie::EmptyValueReader()); + auto trieRoot = trie::ReadSuccinctTrie(memReader, SimpleValueReader()); { auto it = trieRoot->GoToString(strings::MakeUniString("a")); diff --git a/coding/coding_tests/trie_test.cpp b/coding/coding_tests/trie_test.cpp index cc936e0114..be14a55d92 100644 --- a/coding/coding_tests/trie_test.cpp +++ b/coding/coding_tests/trie_test.cpp @@ -23,9 +23,8 @@ struct ChildNodeInfo bool m_isLeaf; uint32_t m_size; vector m_edge; - string m_edgeValue; - ChildNodeInfo(bool isLeaf, uint32_t size, char const * edge, char const * edgeValue) - : m_isLeaf(isLeaf), m_size(size), m_edgeValue(edgeValue) + + ChildNodeInfo(bool isLeaf, uint32_t size, char const * edge) : m_isLeaf(isLeaf), m_size(size) { while (*edge) m_edge.push_back(*edge++); @@ -35,8 +34,6 @@ struct ChildNodeInfo bool IsLeaf() const { return m_isLeaf; } uint32_t const * GetEdge() const { return &m_edge[0]; } uint32_t GetEdgeSize() const { return m_edge.size(); } - void const * GetEdgeValue() const { return m_edgeValue.data(); } - uint32_t GetEdgeValueSize() const { return m_edgeValue.size(); } }; struct KeyValuePair @@ -163,15 +160,11 @@ UNIT_TEST(TrieBuilder_WriteNode_Smoke) { vector serial; PushBackByteSink > sink(serial); - ChildNodeInfo children[] = - { - ChildNodeInfo(true, 1, "1A", "i1"), - ChildNodeInfo(false, 2, "B", "ii2"), - ChildNodeInfo(false, 3, "zz", ""), - ChildNodeInfo(true, 4, - "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij", "i4"), - ChildNodeInfo(true, 5, "a", "5z") - }; + ChildNodeInfo children[] = { + ChildNodeInfo(true, 1, "1A"), ChildNodeInfo(false, 2, "B"), ChildNodeInfo(false, 3, "zz"), + ChildNodeInfo(true, 4, + "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"), + ChildNodeInfo(true, 5, "a")}; CharValueList valueList("123"); trie::WriteNode(sink, 0, valueList, &children[0], &children[0] + ARRAY_SIZE(children)); @@ -182,10 +175,8 @@ UNIT_TEST(TrieBuilder_WriteNode_Smoke) '1', '2', '3', // Values BOOST_BINARY(10000001), // Child 1: header: [+leaf] [-supershort] [2 symbols] MKUC(ZENC(MKSC('1'))), MKUC(ZENC(MKSC('A') - MKSC('1'))), // Child 1: edge - 'i', '1', // Child 1: intermediate data 1, // Child 1: size MKUC(64 | ZENC(MKSC('B') - MKSC('1'))), // Child 2: header: [-leaf] [+supershort] - 'i', 'i', '2', // Child 2: intermediate data 2, // Child 2: size BOOST_BINARY(00000001), // Child 3: header: [-leaf] [-supershort] [2 symbols] MKUC(ZENC(MKSC('z') - MKSC('B'))), 0, // Child 3: edge @@ -199,10 +190,8 @@ UNIT_TEST(TrieBuilder_WriteNode_Smoke) MKUC(ZENC(MKSC('a') - MKSC('j'))), 2,2,2,2,2,2,2,2,2, // Child 4: edge MKUC(ZENC(MKSC('a') - MKSC('j'))), 2,2,2,2,2,2,2,2,2, // Child 4: edge MKUC(ZENC(MKSC('a') - MKSC('j'))), 2,2,2,2,2,2,2,2,2, // Child 4: edge - 'i', '4', // Child 4: intermediate data 4, // Child 4: size MKUC(BOOST_BINARY(11000000) | ZENC(0)), // Child 5: header: [+leaf] [+supershort] - '5', 'z' // Child 5: intermediate data }; TEST_EQUAL(serial, vector(&expected[0], &expected[0] + ARRAY_SIZE(expected)), ()); @@ -244,29 +233,16 @@ UNIT_TEST(TrieBuilder_Build) vector serial; PushBackByteSink > sink(serial); trie::Build>, typename vector::iterator, - trie::MaxValueEdgeBuilder, Uint32ValueList>( - sink, v.begin(), v.end(), trie::MaxValueEdgeBuilder()); + Uint32ValueList>(sink, v.begin(), v.end()); reverse(serial.begin(), serial.end()); - // LOG(LINFO, (serial.size(), vs)); MemReader memReader = MemReader(&serial[0], serial.size()); - using IteratorType = trie::Iterator::ValueType, - trie::FixedSizeValueReader<1>::ValueType>; - unique_ptr const root(trie::ReadTrie(memReader, trie::FixedSizeValueReader<4>(), - trie::FixedSizeValueReader<1>())); + using IteratorType = trie::Iterator::ValueType>; + unique_ptr const root(trie::ReadTrie(memReader, trie::FixedSizeValueReader<4>())); vector res; KeyValuePairBackInserter f; trie::ForEachRef(*root, f, vector()); sort(f.m_v.begin(), f.m_v.end()); TEST_EQUAL(v, f.m_v, ()); - - uint32_t expectedMaxEdgeValue = 0; - for (size_t i = 0; i < v.size(); ++i) - if (!v[i].m_key.empty()) - expectedMaxEdgeValue = max(expectedMaxEdgeValue, v[i].m_value); - uint32_t maxEdgeValue = 0; - for (uint32_t i = 0; i < root->m_edge.size(); ++i) - maxEdgeValue = max(maxEdgeValue, static_cast(root->m_edge[i].m_value.m_data[0])); - TEST_EQUAL(maxEdgeValue, expectedMaxEdgeValue, (v, f.m_v)); } } diff --git a/coding/succinct_trie_builder.hpp b/coding/succinct_trie_builder.hpp index 8ef97956e4..5ba0f56cf0 100644 --- a/coding/succinct_trie_builder.hpp +++ b/coding/succinct_trie_builder.hpp @@ -27,7 +27,7 @@ namespace trie // Node is a temporary struct that is used to store the trie in memory // before it is converted to a succinct representation and put to disk. // It is rather verbose but hopefully is small enough to fit in memory. -template +template struct Node { // The left child is reached by 0, the right by 1. @@ -42,11 +42,6 @@ struct Node // to the key string which leads to this node. TValueList m_valueList; - // m_edgeBuilder is obsolete and is here only for backward-compatibility - // with an older implementation of the trie. - // todo(@pimenov): Remove it. - TEdgeBuilder m_edgeBuilder; - Node() : l(nullptr), r(nullptr), m_isFinal(false) {} }; @@ -95,13 +90,12 @@ void WriteInLevelOrder(TNode * root, vector & levelOrder) } } -template -void BuildSuccinctTrie(TWriter & writer, TIter const beg, TIter const end, - TEdgeBuilder const & edgeBuilder) +template +void BuildSuccinctTrie(TWriter & writer, TIter const beg, TIter const end) { using TrieChar = uint32_t; using TTrieString = buffer_vector; - using TNode = Node; + using TNode = Node; using TEntry = typename TIter::value_type; TNode * root = new TNode(); @@ -144,7 +138,6 @@ void BuildSuccinctTrie(TWriter & writer, TIter const beg, TIter const end, TNode * cur = AddToTrie(root, bitEncoding, numBits); cur->m_isFinal = true; cur->m_valueList.Append(entry.GetValue()); - cur->m_edgeBuilder.AddValue(entry.value_data(), entry.value_size()); } vector levelOrder; diff --git a/coding/succinct_trie_reader.hpp b/coding/succinct_trie_reader.hpp index 8fbf649bc2..fa049ebf73 100644 --- a/coding/succinct_trie_reader.hpp +++ b/coding/succinct_trie_reader.hpp @@ -21,16 +21,14 @@ namespace trie // of the trie: the trie topology and the offsets into the data buffer. // The topology can then be used to navigate the trie and the offsets // can be used to extract the values associated with the key strings. -template +template class TopologyAndOffsets { public: using TValue = typename TValueReader::ValueType; - using TEdgeValue = typename TEdgeValueReader::ValueType; - TopologyAndOffsets(TReader const & reader, TValueReader const & valueReader, - TEdgeValueReader const & edgeValueReader) - : m_reader(reader), m_valueReader(valueReader), m_edgeValueReader(edgeValueReader) + TopologyAndOffsets(TReader const & reader, TValueReader const & valueReader) + : m_reader(reader), m_valueReader(valueReader) { Parse(); } @@ -114,7 +112,6 @@ private: // todo(@pimenov) Why do we even need an instance? Type name is enough. TValueReader const & m_valueReader; - TEdgeValueReader const & m_edgeValueReader; uint32_t m_numNodes; coding::HuffmanCoder m_huffman; @@ -127,13 +124,12 @@ private: vector m_offsetTable; }; -template +template class SuccinctTrieIterator { public: using TValue = typename TValueReader::ValueType; - using TEdgeValue = typename TEdgeValueReader::ValueType; - using TCommonData = TopologyAndOffsets; + using TCommonData = TopologyAndOffsets; SuccinctTrieIterator(TReader const & reader, shared_ptr common, uint32_t nodeBitPosition) @@ -246,15 +242,14 @@ private: bool m_valuesRead; }; -template -unique_ptr> ReadSuccinctTrie( - TReader const & reader, TValueReader valueReader = TValueReader(), - TEdgeValueReader edgeValueReader = TEdgeValueReader()) +template +unique_ptr> ReadSuccinctTrie( + TReader const & reader, TValueReader valueReader = TValueReader()) { - using TCommonData = TopologyAndOffsets; - using TIter = SuccinctTrieIterator; + using TCommonData = TopologyAndOffsets; + using TIter = SuccinctTrieIterator; - shared_ptr common(new TCommonData(reader, valueReader, edgeValueReader)); + shared_ptr common(new TCommonData(reader, valueReader)); return make_unique(common->GetReader(), common, 1 /* bitPosition */); } diff --git a/coding/trie.hpp b/coding/trie.hpp index 6d80c8205c..f2c189316d 100644 --- a/coding/trie.hpp +++ b/coding/trie.hpp @@ -17,7 +17,7 @@ typedef uint32_t TrieChar; // However 0 is used because the first byte is actually language id. static uint32_t const DEFAULT_CHAR = 0; -template +template class Iterator { //dbg::ObjectTracker m_tracker; @@ -27,7 +27,6 @@ public: { typedef buffer_vector EdgeStrT; EdgeStrT m_str; - EdgeValueT m_value; }; buffer_vector m_edge; @@ -35,8 +34,8 @@ public: virtual ~Iterator() {} - virtual Iterator * Clone() const = 0; - virtual Iterator * GoToEdge(size_t i) const = 0; + virtual Iterator * Clone() const = 0; + virtual Iterator * GoToEdge(size_t i) const = 0; }; struct EmptyValueReader @@ -67,8 +66,8 @@ struct FixedSizeValueReader } }; -template -void ForEachRef(Iterator const & iter, F & f, StringT const & s) +template +void ForEachRef(Iterator const & iter, F & f, StringT const & s) { for (size_t i = 0; i < iter.m_value.size(); ++i) f(s, iter.m_value[i]); @@ -76,7 +75,7 @@ void ForEachRef(Iterator const & iter, F & f, StringT const { StringT 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)); + unique_ptr> const pIter1(iter.GoToEdge(i)); ForEachRef(*pIter1, f, s1); } } diff --git a/coding/trie_builder.hpp b/coding/trie_builder.hpp index d47738c06c..03ab9f3614 100644 --- a/coding/trie_builder.hpp +++ b/coding/trie_builder.hpp @@ -35,7 +35,6 @@ // [vi edgeChar1 - edgeChar0] // ... // [vi edgeCharN - edgeCharN-1] -// [edge value] // [child size]: if the child is not the last one when reading namespace trie @@ -93,7 +92,6 @@ void WriteNode(TSink & sink, TrieChar baseChar, TValueList const & valueList, } } baseChar = edge[0]; - sink.Write(it->GetEdgeValue(), it->GetEdgeValueSize()); uint32_t const childSize = it->Size(); if (++it != endChild) @@ -106,8 +104,6 @@ struct ChildInfo bool m_isLeaf; uint32_t m_size; buffer_vector m_edge; - using TEdgeValueStorage = buffer_vector; - TEdgeValueStorage m_edgeValue; ChildInfo(bool isLeaf, uint32_t size, TrieChar c) : m_isLeaf(isLeaf), m_size(size), m_edge(1, c) { @@ -117,29 +113,23 @@ struct ChildInfo bool IsLeaf() const { return m_isLeaf; } TrieChar const * GetEdge() const { return m_edge.data(); } uint32_t GetEdgeSize() const { return m_edge.size(); } - void const * GetEdgeValue() const { return m_edgeValue.data(); } - uint32_t GetEdgeValueSize() const { return m_edgeValue.size(); } }; -template +template struct NodeInfo { uint64_t m_begPos; TrieChar m_char; vector m_children; TValueList m_valueList; - TEdgeBuilder m_edgeBuilder; NodeInfo() : m_begPos(0), m_char(0) {} - NodeInfo(uint64_t pos, TrieChar trieChar, TEdgeBuilder const & edgeBuilder) - : m_begPos(pos), m_char(trieChar), m_edgeBuilder(edgeBuilder) - { - } + NodeInfo(uint64_t pos, TrieChar trieChar) : m_begPos(pos), m_char(trieChar) {} }; -template -void WriteNodeReverse(TSink & sink, TrieChar baseChar, - NodeInfo const & node, bool isRoot = false) +template +void WriteNodeReverse(TSink & sink, TrieChar baseChar, NodeInfo const & node, + bool isRoot = false) { using TOutStorage = buffer_vector; TOutStorage out; @@ -175,72 +165,18 @@ void PopNodes(TSink & sink, TNodes & nodes, int nodesToPop) node.m_char)); } - prevNode.m_edgeBuilder.AddEdge(node.m_edgeBuilder); - PushBackByteSink sink(prevNode.m_children.back().m_edgeValue); - node.m_edgeBuilder.StoreValue(sink); - nodes.pop_back(); } } -struct EmptyEdgeBuilder -{ - using ValueType = unsigned char; - - void AddValue(void const *, uint32_t) {} - void AddEdge(EmptyEdgeBuilder &) {} - template - void StoreValue(TSink &) const - { - } -}; - -template -struct MaxValueEdgeBuilder -{ - using ValueType = typename TMaxValueCalc::ValueType; - - TMaxValueCalc m_maxCalc; - ValueType m_value; - - explicit MaxValueEdgeBuilder(TMaxValueCalc const & maxCalc = TMaxValueCalc()) - : m_maxCalc(maxCalc), m_value() - { - } - - MaxValueEdgeBuilder(MaxValueEdgeBuilder const & edgeBuilder) - : m_maxCalc(edgeBuilder.m_maxCalc), m_value(edgeBuilder.m_value) - { - } - - void AddValue(void const * p, uint32_t size) - { - ValueType value = m_maxCalc(p, size); - if (m_value < value) - m_value = value; - } - - void AddEdge(MaxValueEdgeBuilder & edgeBuilder) - { - if (m_value < edgeBuilder.m_value) - m_value = edgeBuilder.m_value; - } - - template - void StoreValue(TSink & sink) const - { - sink.Write(&m_value, sizeof(m_value)); - } -}; - -template -void Build(TSink & sink, TIter const beg, TIter const end, TEdgeBuilder const & edgeBuilder) +template +void Build(TSink & sink, TIter const beg, TIter const end) { using TTrieString = buffer_vector; - using TNodeInfo = NodeInfo; + using TNodeInfo = NodeInfo; buffer_vector nodes; - nodes.push_back(TNodeInfo(sink.Pos(), DEFAULT_CHAR, edgeBuilder)); + nodes.push_back(TNodeInfo(sink.Pos(), DEFAULT_CHAR)); TTrieString prevKey; @@ -264,11 +200,9 @@ void Build(TSink & sink, TIter const beg, TIter const end, TEdgeBuilder const & uint64_t const pos = sink.Pos(); for (size_t i = nCommon; i < key.size(); ++i) - nodes.push_back(TNodeInfo(pos, key[i], edgeBuilder)); + nodes.push_back(TNodeInfo(pos, key[i])); nodes.back().m_valueList.Append(e.GetValue()); - nodes.back().m_edgeBuilder.AddValue(e.value_data(), e.value_size()); - prevKey.swap(key); prevE.Swap(e); } diff --git a/coding/trie_reader.hpp b/coding/trie_reader.hpp index ac45e001b2..204daa0a1f 100644 --- a/coding/trie_reader.hpp +++ b/coding/trie_reader.hpp @@ -2,18 +2,18 @@ #include "coding/trie.hpp" #include "coding/reader.hpp" #include "coding/varint.hpp" + #include "base/assert.hpp" #include "base/bits.hpp" #include "base/macros.hpp" namespace trie { -template -class LeafIterator0 : public Iterator +template +class LeafIterator0 : public Iterator { public: typedef typename ValueReaderT::ValueType ValueType; - typedef EdgeValueT EdgeValueType; template LeafIterator0(ReaderT const & reader, ValueReaderT const & valueReader) @@ -32,12 +32,9 @@ public: ASSERT_EQUAL(size, src.Pos(), ()); } - Iterator * Clone() const - { - return new LeafIterator0(*this); - } + Iterator * Clone() const { return new LeafIterator0(*this); } - Iterator * GoToEdge(size_t i) const + Iterator * GoToEdge(size_t i) const { ASSERT(false, (i)); UNUSED_VALUE(i); @@ -45,45 +42,36 @@ public: } }; -template -class IteratorImplBase : - public Iterator +template +class IteratorImplBase : public Iterator { protected: enum { IS_READER_IN_MEMORY = 0 }; }; -template -class IteratorImplBase : - public Iterator +template +class IteratorImplBase + : public Iterator { protected: enum { IS_READER_IN_MEMORY = 1 }; }; - -template -class Iterator0 : public IteratorImplBase +template +class Iterator0 : public IteratorImplBase { public: typedef typename ValueReaderT::ValueType ValueType; - typedef typename EdgeValueReaderT::ValueType EdgeValueType; - Iterator0(ReaderT const & reader, - ValueReaderT const & valueReader, - EdgeValueReaderT const & edgeValueReader, - TrieChar baseChar) - : m_reader(reader), m_valueReader(valueReader), m_edgeValueReader(edgeValueReader) + Iterator0(ReaderT const & reader, ValueReaderT const & valueReader, TrieChar baseChar) + : m_reader(reader), m_valueReader(valueReader) { ParseNode(baseChar); } - Iterator * Clone() const - { - return new Iterator0(*this); - } + Iterator * Clone() const { return new Iterator0(*this); } - Iterator * GoToEdge(size_t i) const + Iterator * GoToEdge(size_t i) const { ASSERT_LESS(i, this->m_edge.size(), ()); uint32_t const offset = m_edgeInfo[i].m_offset; @@ -91,29 +79,27 @@ public: // TODO: Profile to check that MemReader optimization helps? /* - if (!IteratorImplBase::IS_READER_IN_MEMORY && + if (!IteratorImplBase::IS_READER_IN_MEMORY && size < 1024) { SharedMemReader memReader(size); m_reader.Read(offset, memReader.Data(), size); if (m_edgeInfo[i].m_isLeaf) - return new LeafIterator0( + return new LeafIterator0( memReader, m_valueReader); else - return new Iterator0( - memReader, m_valueReader, m_edgeValueReader, + return new Iterator0( + memReader, m_valueReader, this->m_edge[i].m_str.back()); } else */ { if (m_edgeInfo[i].m_isLeaf) - return new LeafIterator0( - m_reader.SubReader(offset, size), m_valueReader); + return new LeafIterator0(m_reader.SubReader(offset, size), m_valueReader); else - return new Iterator0( - m_reader.SubReader(offset, size), m_valueReader, m_edgeValueReader, - this->m_edge[i].m_str.back()); + return new Iterator0(m_reader.SubReader(offset, size), m_valueReader, + this->m_edge[i].m_str.back()); } } @@ -146,7 +132,7 @@ private: m_edgeInfo[0].m_offset = 0; for (uint32_t i = 0; i < childCount; ++i) { - typename Iterator::Edge & e = this->m_edge[i]; + typename Iterator::Edge & e = this->m_edge[i]; // [1: header]: [1: isLeaf] [1: isShortEdge] [6: (edgeChar0 - baseChar) or min(edgeLen-1, 63)] uint8_t const header = ReadPrimitiveFromSource(src); @@ -167,9 +153,6 @@ private: e.m_str.push_back(baseChar += ReadVarInt(src)); } - // [edge value] - m_edgeValueReader(src, e.m_value); - // [child size]: if the child is not the last one m_edgeInfo[i + 1].m_offset = m_edgeInfo[i].m_offset; if (i != childCount - 1) @@ -194,18 +177,14 @@ private: ReaderT m_reader; ValueReaderT m_valueReader; - EdgeValueReaderT m_edgeValueReader; }; // Returns iterator to the root of the trie. -template -Iterator * -ReadTrie(ReaderT const & reader, - ValueReaderT valueReader = ValueReaderT(), - EdgeValueReaderT edgeValueReader = EdgeValueReaderT()) +template +Iterator * ReadTrie(ReaderT const & reader, + ValueReaderT valueReader = ValueReaderT()) { - return new Iterator0( - reader, valueReader, edgeValueReader, DEFAULT_CHAR); + return new Iterator0(reader, valueReader, DEFAULT_CHAR); } } // namespace trie diff --git a/generator/dumper.cpp b/generator/dumper.cpp index fcb5c87b6e..0c39673fb4 100644 --- a/generator/dumper.cpp +++ b/generator/dumper.cpp @@ -201,8 +201,7 @@ namespace feature serial::CodingParams cp(trie::GetCodingParams(header.GetDefCodingParams())); unique_ptr const pTrieRoot( - trie::ReadTrie(container.GetReader(SEARCH_INDEX_FILE_TAG), trie::ValueReader(cp), - trie::TEdgeValueReader())); + trie::ReadTrie(container.GetReader(SEARCH_INDEX_FILE_TAG), trie::ValueReader(cp))); SearchTokensCollector f; trie::ForEachRef(*pTrieRoot, f, strings::UniString()); diff --git a/indexer/search_index_builder.cpp b/indexer/search_index_builder.cpp index d88336ee4a..0176fdac25 100644 --- a/indexer/search_index_builder.cpp +++ b/indexer/search_index_builder.cpp @@ -301,10 +301,9 @@ void BuildSearchIndex(FilesContainerR const & cont, CategoriesHolder const & cat names.EndAdding(); names.OpenForRead(); - + trie::Build::IteratorT, - trie::EmptyEdgeBuilder, ValueList>( - writer, names.Begin(), names.End(), trie::EmptyEdgeBuilder()); + ValueList>(writer, names.Begin(), names.End()); // at this point all readers of StringsFile should be dead } @@ -420,9 +419,8 @@ void BuildCompressedSearchIndex(FilesContainerR & container, Writer & indexWrite LOG(LINFO, ("End sorting strings:", timer.ElapsedSeconds())); stringsFile.OpenForRead(); - trie::Build::IteratorT, trie::EmptyEdgeBuilder, - ValueList>(indexWriter, stringsFile.Begin(), stringsFile.End(), - trie::EmptyEdgeBuilder()); + trie::Build::IteratorT, + ValueList>(indexWriter, stringsFile.Begin(), stringsFile.End()); LOG(LINFO, ("End building compressed search index, elapsed seconds:", timer.ElapsedSeconds())); } diff --git a/indexer/search_trie.hpp b/indexer/search_trie.hpp index 259b62e172..8a13fa73e1 100644 --- a/indexer/search_trie.hpp +++ b/indexer/search_trie.hpp @@ -48,9 +48,7 @@ public: } }; -using TEdgeValueReader = EmptyValueReader; -using DefaultIterator = - trie::Iterator; +using DefaultIterator = trie::Iterator; inline serial::CodingParams GetCodingParams(serial::CodingParams const & orig) { diff --git a/search/retrieval.cpp b/search/retrieval.cpp index 84bd5290d8..8b47a665c7 100644 --- a/search/retrieval.cpp +++ b/search/retrieval.cpp @@ -49,9 +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), trie::TEdgeValueReader())); + unique_ptr 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 462a7b05d7..0d3ab51a61 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -1566,8 +1566,7 @@ 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), - trie::TEdgeValueReader())); + trie::ReadTrie(SubReaderWrapper(searchReader.GetPtr()), trie::ValueReader(cp))); ForEachLangPrefix(params, *trieRoot, [&](TrieRootPrefix & langRoot, int8_t lang) {