qxLib
string_view_iterator.h
Go to the documentation of this file.
1 /**
2 
3  @file string_view_iterator.h
4  @author Khrapov
5  @date 24.10.2023
6  @copyright © Nick Khrapov, 2023. All right reserved.
7 
8 **/
9 #pragma once
10 
11 #include <qx/containers/flags.h>
13 #include <qx/typedefs.h>
14 
15 namespace qx
16 {
17 
18 enum class delimiter_inclusion_flags : u8
19 {
20  none = 0,
21  begin = 1 << 0,
22  end = 1 << 1
23 };
24 QX_FLAGS_ENUM_CLASS(delimiter_inclusion_flags);
25 
26 /**
27 
28  @class base_string_view_iterator
29  @brief Iterator class that allows to iterate over a string view using a delimiter character
30  @tparam char_t - char type
31  @tparam bForwardIterator - false if this is a reverse iterator
32  @author Khrapov
33  @date 24.10.2023
34 
35  @code
36  // usage 1, convenient way
37  for (auto it = qx::string_view_iterator("/a/bb/ccc/dddd/", `/`); it; ++it)
38  std::print("{}", *it);
39  @endcode
40 
41  @code
42  // usage 2, view adapter friendly way
43  auto itBegin = qx::string_view_iterator::begin("/a/bb/ccc/dddd/", `/`);
44  auto itEnd = qx::string_view_iterator::end("/a/bb/ccc/dddd/", `/`);
45  for (auto it = itBegin; it != itEnd; ++it)
46  {
47  std::print("{}", *it);
48  }
49  @endcode
50 
51 **/
52 template<class char_t, bool bForwardIterator>
54 {
55 public:
56  using value_type = basic_string_view<char_t>;
57  using size_type = size_t;
58  using iterator_category = std::bidirectional_iterator_tag;
59  using iterator_concept = std::bidirectional_iterator_tag;
60 
61 public:
62  /**
63  @brief base_string_view_iterator object constructor
64  @param svFull - string to iterate
65  @param chDelimiter - delimiter character
66  @param eDelimiterInclusionFlags - flags that determine whether to include delimiters in parts when iterating
67  **/
68  constexpr base_string_view_iterator(
69  value_type svFull,
70  char_t chDelimiter,
71  flags<delimiter_inclusion_flags> eDelimiterInclusionFlags = delimiter_inclusion_flags::none) noexcept;
72 
73  /**
74  @brief Check if this iterator is valid (i.e. it didn't reach the end of the sequence)
75  @retval - true if this iterator is valid
76  **/
77  constexpr operator bool() const noexcept;
78 
79  /**
80  @brief Return iterator to beginning
81  @param svFull - string to iterate
82  @param chDelimiter - delimiter character
83  @param eDelimiterInclusionFlags - flags that determine whether to include delimiters in parts when iterating
84  @retval - iterator to beginning
85  **/
86  constexpr static base_string_view_iterator begin(
87  value_type svFull,
88  char_t chDelimiter,
89  flags<delimiter_inclusion_flags> eDelimiterInclusionFlags = delimiter_inclusion_flags::none) noexcept;
90 
91  /**
92  @brief Return iterator to end
93  @param svFull - string to iterate
94  @param chDelimiter - delimiter character
95  @param eDelimiterInclusionFlags - flags that determine whether to include delimiters in parts when iterating
96  @retval - iterator to end
97  **/
98  constexpr static base_string_view_iterator end(
99  value_type svFull,
100  char_t chDelimiter,
101  flags<delimiter_inclusion_flags> eDelimiterInclusionFlags = delimiter_inclusion_flags::none) noexcept;
102 
103  [[nodiscard]] constexpr value_type operator*() const noexcept;
104  constexpr base_string_view_iterator& operator++() noexcept;
105  [[nodiscard]] constexpr base_string_view_iterator operator++(int) const noexcept;
106  constexpr base_string_view_iterator& operator--() noexcept;
107  [[nodiscard]] constexpr base_string_view_iterator operator--(int) const noexcept;
108  constexpr bool operator==(const base_string_view_iterator& itOther) const noexcept = default;
109  constexpr bool operator!=(const base_string_view_iterator& itOther) const noexcept = default;
110 
111 private:
112  /**
113  @brief base_string_view_iterator object constructor
114  @param svFull - string to iterate
115  @param nCurrentBegin - current part begin index
116  @param nCurrentEnd - current part end index (exclusively)
117  @param chDelimiter - delimiter character
118  @param eDelimiterInclusionFlags - flags that determine whether to include delimiters in parts when iterating
119  **/
120  constexpr base_string_view_iterator(
121  value_type svFull,
122  size_t nCurrentBegin,
123  size_t nCurrentEnd,
124  char_t chDelimiter,
125  flags<delimiter_inclusion_flags> eDelimiterInclusionFlags) noexcept;
126 
127  /**
128  @brief Go to the next part
129  @param bForwardDirection - true if this is a forward direction for the current bForwardIterator
130  **/
131  constexpr void next(bool bForwardDirection) noexcept;
132 
133 private:
134  value_type m_svFull;
135  size_t m_nCurrentBegin;
136  size_t m_nCurrentEnd;
137  char_t m_chDelimiter;
138  flags<delimiter_inclusion_flags> m_eDelimiterInclusionFlags = delimiter_inclusion_flags::none;
139 };
140 
141 template<class char_t>
143 
144 template<class char_t>
146 
147 } // namespace qx
148 
Iterator class that allows to iterate over a string view using a delimiter character.
constexpr static base_string_view_iterator end(value_type svFull, char_t chDelimiter, flags< delimiter_inclusion_flags > eDelimiterInclusionFlags=delimiter_inclusion_flags::none) noexcept
Return iterator to end.
constexpr base_string_view_iterator(value_type svFull, char_t chDelimiter, flags< delimiter_inclusion_flags > eDelimiterInclusionFlags=delimiter_inclusion_flags::none) noexcept
base_string_view_iterator object constructor
constexpr static base_string_view_iterator begin(value_type svFull, char_t chDelimiter, flags< delimiter_inclusion_flags > eDelimiterInclusionFlags=delimiter_inclusion_flags::none) noexcept
Return iterator to beginning.
#define QX_FLAGS_ENUM_CLASS(enumName)
Define to let to use this enum class in different binary operations returning qx::flags.
Definition: flags.h:22
std::uint8_t u8
0 .. 65 535
Definition: typedefs.h:19