13 template<
class char_t,
bool bForwardIterator>
19 , m_nCurrentBegin(bForwardIterator ? 0 : m_svFull.size())
20 , m_nCurrentEnd(m_nCurrentBegin)
21 , m_chDelimiter(chDelimiter)
22 , m_eDelimiterInclusionFlags(eDelimiterInclusionFlags)
27 template<
class char_t,
bool bForwardIterator>
30 return m_nCurrentBegin != m_nCurrentEnd;
33 template<
class char_t,
bool bForwardIterator>
40 template<
class char_t,
bool bForwardIterator>
46 size_t nEnd = bForwardIterator ? svFull.size() : 0;
50 template<
class char_t,
bool bForwardIterator>
53 bForwardIterator>::operator*()
const noexcept
55 auto itBegin = m_svFull.cbegin() + m_nCurrentBegin;
56 if (m_eDelimiterInclusionFlags.contains(delimiter_inclusion_flags::begin))
57 while (itBegin != m_svFull.cbegin() && *(itBegin - 1) == m_chDelimiter)
60 auto itEnd = m_svFull.cbegin() + m_nCurrentEnd;
61 if (m_eDelimiterInclusionFlags.contains(delimiter_inclusion_flags::end))
62 while (itEnd != m_svFull.cend() && *(itEnd) == m_chDelimiter)
65 return value_type(itBegin, itEnd);
68 template<
class char_t,
bool bForwardIterator>
69 constexpr base_string_view_iterator<char_t, bForwardIterator>& base_string_view_iterator<char_t, bForwardIterator>::
76 template<
class char_t,
bool bForwardIterator>
77 constexpr base_string_view_iterator<char_t, bForwardIterator> base_string_view_iterator<char_t, bForwardIterator>::
78 operator++(
int)
const noexcept
80 base_string_view_iterator it(*
this);
85 template<
class char_t,
bool bForwardIterator>
86 constexpr base_string_view_iterator<char_t, bForwardIterator>& base_string_view_iterator<char_t, bForwardIterator>::
93 template<
class char_t,
bool bForwardIterator>
94 constexpr base_string_view_iterator<char_t, bForwardIterator> base_string_view_iterator<char_t, bForwardIterator>::
95 operator--(
int)
const noexcept
97 base_string_view_iterator it(*
this);
102 template<
class char_t,
bool bForwardIterator>
105 size_t nCurrentBegin,
108 flags<delimiter_inclusion_flags> eDelimiterInclusionFlags) noexcept
110 , m_nCurrentBegin(nCurrentBegin)
111 , m_nCurrentEnd(nCurrentEnd)
112 , m_chDelimiter(chDelimiter)
113 , m_eDelimiterInclusionFlags(eDelimiterInclusionFlags)
117 template<
class char_t,
bool bForwardIterator>
118 constexpr
void base_string_view_iterator<char_t, bForwardIterator>::next(
bool bForwardDirection) noexcept
120 const bool bRealDirectionIsForward = bForwardIterator == bForwardDirection;
121 const size_t nForwardEnd = m_svFull.size();
122 constexpr
size_t nBackwardEnd =
static_cast<size_t>(-1);
123 const size_t nEnd = bRealDirectionIsForward ? nForwardEnd : nBackwardEnd;
125 auto move_next = [bRealDirectionIsForward](
size_t nPos) ->
size_t
127 return bRealDirectionIsForward ? nPos + 1 : nPos - 1;
130 size_t nSearchStart = bRealDirectionIsForward ? m_nCurrentEnd : m_nCurrentBegin - 1;
133 if (bRealDirectionIsForward && nSearchStart == nBackwardEnd
134 || !bRealDirectionIsForward && nSearchStart == nForwardEnd)
136 nSearchStart = move_next(nSearchStart);
140 while (nSearchStart != nEnd && m_svFull[nSearchStart] == m_chDelimiter)
142 nSearchStart = move_next(nSearchStart);
146 size_t nSearchPos = nEnd;
147 if (nSearchStart != nEnd)
149 if (
const size_t nDelimiterPos = bRealDirectionIsForward ? m_svFull.find(m_chDelimiter, nSearchStart)
150 : m_svFull.rfind(m_chDelimiter, nSearchStart);
151 nDelimiterPos != value_type::npos)
153 nSearchPos = nDelimiterPos;
157 if (bRealDirectionIsForward)
159 m_nCurrentBegin = nSearchStart;
160 m_nCurrentEnd = nSearchPos;
164 m_nCurrentBegin = nSearchPos + 1;
165 m_nCurrentEnd = nSearchStart + 1;
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.