From 0a46504d50fc2e99ea0a1d0ce6038804631e124c Mon Sep 17 00:00:00 2001 From: Yury Melnichek Date: Tue, 16 Aug 2011 11:23:15 +0200 Subject: [PATCH] [search] Add Clone() to the trie's iterator. --- coding/trie.hpp | 1 + coding/trie_reader.hpp | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/coding/trie.hpp b/coding/trie.hpp index ee1940a659..032d54972d 100644 --- a/coding/trie.hpp +++ b/coding/trie.hpp @@ -28,6 +28,7 @@ public: virtual ~Iterator() {} + virtual Iterator * Clone() const = 0; virtual Iterator * GoToEdge(uint32_t i) const = 0; }; diff --git a/coding/trie_reader.hpp b/coding/trie_reader.hpp index e34cf18e97..7a9aeed942 100644 --- a/coding/trie_reader.hpp +++ b/coding/trie_reader.hpp @@ -11,13 +11,14 @@ namespace trie namespace reader { -template +template class LeafIterator0 : public Iterator { public: typedef typename ValueReaderT::ValueType ValueType; typedef EdgeValueT EdgeValueType; + template LeafIterator0(ReaderT const & reader, ValueReaderT const & valueReader) { uint32_t const size = static_cast(reader.Size()); @@ -34,6 +35,11 @@ public: ASSERT_EQUAL(size, src.Pos(), ()); } + Iterator * Clone() const + { + return new LeafIterator0(*this); + } + Iterator * GoToEdge(uint32_t i) const { ASSERT(false, (i)); @@ -75,6 +81,11 @@ public: ParseNode(baseChar); } + Iterator * Clone() const + { + return new Iterator0(*this); + } + Iterator * GoToEdge(uint32_t i) const { ASSERT_LESS(i, this->m_edge.size(), ()); @@ -100,7 +111,7 @@ public: */ { if (m_edgeInfo[i].m_isLeaf) - return new LeafIterator0( + return new LeafIterator0( m_reader.SubReader(offset, size), m_valueReader); else return new Iterator0(