diff options
author | Yuri Gorshenin <y@maps.me> | 2016-06-08 17:36:46 +0300 |
---|---|---|
committer | Yuri Gorshenin <y@maps.me> | 2016-06-08 23:29:26 +0300 |
commit | 033e4094cb602190ab1a8854e319f8ae42e17580 (patch) | |
tree | c89d53b8c161eab6f3b6644cd02e8a8e7c1f0c57 /indexer/string_slice.hpp | |
parent | 36bcceb1d559d4e0e400c75400b0b21711c03c58 (diff) |
[indexer] StringSet.
Diffstat (limited to 'indexer/string_slice.hpp')
-rw-r--r-- | indexer/string_slice.hpp | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/indexer/string_slice.hpp b/indexer/string_slice.hpp index 510cdbe8cb..38d2a1230c 100644 --- a/indexer/string_slice.hpp +++ b/indexer/string_slice.hpp @@ -22,10 +22,7 @@ public: class NoPrefixStringSlice : public StringSliceBase { public: - NoPrefixStringSlice(vector<TString> const & strings) - : m_strings(strings) - { - } + NoPrefixStringSlice(vector<TString> const & strings) : m_strings(strings) {} virtual TString const & Get(size_t i) const override { return m_strings[i]; } virtual size_t Size() const override { return m_strings.size(); } @@ -33,4 +30,50 @@ public: private: vector<TString> const & m_strings; }; + +// Allows to iterate over space-separated strings in StringSliceBase. +class JoinIterator +{ +public: + using difference_type = ptrdiff_t; + using value_type = strings::UniChar; + using pointer = strings::UniChar *; + using reference = strings::UniChar &; + using iterator_category = std::forward_iterator_tag; + + static JoinIterator Begin(StringSliceBase const & slice); + static JoinIterator End(StringSliceBase const & slice); + + inline bool operator==(JoinIterator const & rhs) const + { + return &m_slice == &rhs.m_slice && m_string == rhs.m_string && m_offset == rhs.m_offset; + } + + inline bool operator!=(JoinIterator const & rhs) const { return !(*this == rhs); } + + inline strings::UniChar operator*() const { return GetChar(m_string, m_offset); } + + JoinIterator & operator++(); + +private: + enum class Position + { + Begin, + End + }; + + JoinIterator(StringSliceBase const & slice, Position position); + + void Normalize(); + + size_t GetSize(size_t string) const; + + inline size_t GetMaxSize() const { return m_slice.Size() == 0 ? 0 : m_slice.Size() * 2 - 1; } + + strings::UniChar GetChar(size_t string, size_t offset) const; + + StringSliceBase const & m_slice; + size_t m_string; + size_t m_offset; +}; } // namespace search |