Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuri Gorshenin <y@maps.me>2016-06-08 17:36:46 +0300
committerYuri Gorshenin <y@maps.me>2016-06-08 23:29:26 +0300
commit033e4094cb602190ab1a8854e319f8ae42e17580 (patch)
treec89d53b8c161eab6f3b6644cd02e8a8e7c1f0c57 /indexer/string_slice.hpp
parent36bcceb1d559d4e0e400c75400b0b21711c03c58 (diff)
[indexer] StringSet.
Diffstat (limited to 'indexer/string_slice.hpp')
-rw-r--r--indexer/string_slice.hpp51
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