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.