19 #ifndef LIB_CS_STRING_ITERATOR_H
20 #define LIB_CS_STRING_ITERATOR_H
33 CsCharArrow (CsChar c)
37 const CsChar *operator->()
const {
45 template <
typename E,
typename A>
46 class CsStringIterator
48 using v_iter =
typename std::vector<
typename E::storage_unit, A>::const_iterator;
51 using difference_type = std::ptrdiff_t;
52 using pointer = CsChar *;
53 using reference = CsChar;
54 using size_type = std::ptrdiff_t;
55 using value_type = CsChar;
56 using iterator_category = std::random_access_iterator_tag;
58 CsStringIterator() =
default;
60 CsChar operator*()
const;
61 CsCharArrow operator->()
const;
63 CsChar operator[](size_type n)
const;
65 std::strong_ordering operator<=>(
const CsStringIterator &other)
const {
67 if (m_iter < other.m_iter) {
68 return std::strong_ordering::less;
70 }
else if (m_iter > other.m_iter) {
71 return std::strong_ordering::greater;
74 return std::strong_ordering::equal;
79 bool operator==(
const CsStringIterator &other)
const {
80 return m_iter == other.m_iter;
84 CsStringIterator &operator+=(size_type n);
85 CsStringIterator &operator-=(size_type n);
87 CsStringIterator operator+(size_type n)
const;
88 CsStringIterator &operator++();
89 CsStringIterator operator++(
int);
91 CsStringIterator operator-(size_type n)
const;
92 size_type operator-(CsStringIterator other)
const;
93 CsStringIterator &operator--();
94 CsStringIterator operator--(
int);
96 typename std::pair<v_iter, v_iter> codePointRange()
const;
98 CsStringIterator advance_storage(size_type n)
const;
99 v_iter codePointBegin()
const;
100 v_iter codePointEnd()
const;
103 explicit CsStringIterator(v_iter data);
106 friend class CsBasicString<E, A>;
109 template <
typename E,
typename A>
110 CsChar CsStringIterator<E,A>::operator*()
const
112 return E::getCodePoint(m_iter);
115 template <
typename E,
typename A>
116 CsCharArrow CsStringIterator<E,A>::operator->()
const
118 return E::getCodePoint(m_iter);
121 template <
typename E,
typename A>
122 CsChar CsStringIterator<E,A>:: operator[](size_type n)
const
129 template <
typename E,
typename A>
130 CsStringIterator<E,A> &CsStringIterator<E,A>::operator+=(size_type n)
132 m_iter += E::walk(n, m_iter);
136 template <
typename E,
typename A>
137 CsStringIterator<E,A> &CsStringIterator<E,A>::operator-=(size_type n)
139 m_iter += E::walk(-n, m_iter);
143 template <
typename E,
typename A>
144 CsStringIterator<E,A> CsStringIterator<E,A>::operator+(size_type n)
const
146 auto iter = m_iter + E::walk(n, m_iter);
147 return CsStringIterator(iter);
150 template <
typename E,
typename A>
151 CsStringIterator<E,A> &CsStringIterator<E,A>::operator++()
153 m_iter += E::walk(1, m_iter);
157 template <
typename E,
typename A>
158 CsStringIterator<E,A> CsStringIterator<E,A>::operator++(
int)
160 CsStringIterator retval = *
this;
161 m_iter += E::walk(1, m_iter);
166 template <
typename E,
typename A>
167 CsStringIterator<E,A> CsStringIterator<E,A>::operator-(size_type n)
const
169 auto iter = m_iter + E::walk(-n, m_iter);
170 return CsStringIterator(iter);
173 template <
typename E,
typename A>
174 typename CsStringIterator<E, A>::size_type CsStringIterator <E,A>::operator-(CsStringIterator other)
const
176 CsStringIterator a = *
this;
177 CsStringIterator b = other;
180 return 0 - E::distance(a.m_iter, b.m_iter);
183 return E::distance(b.m_iter, a.m_iter);
188 template <
typename E,
typename A>
189 CsStringIterator<E,A> &CsStringIterator<E,A>::operator--()
191 m_iter+= E::walk(-1, m_iter);
195 template <
typename E,
typename A>
196 CsStringIterator<E,A> CsStringIterator<E,A>::operator--(
int)
198 CsStringIterator retval = *
this;
199 m_iter += E::walk(-1, m_iter);
205 template <
typename E,
typename A>
206 CsStringIterator<E,A>::CsStringIterator(v_iter data)
211 template <
typename E,
typename A>
212 auto CsStringIterator<E,A>::codePointRange()
const ->
typename std::pair<v_iter, v_iter>
214 return std::make_pair(m_iter, m_iter + E::walk(1, m_iter));
217 template <
typename E,
typename A>
218 CsStringIterator<E,A> CsStringIterator<E,A>::advance_storage(size_type n)
const
220 CsStringIterator retval = CsStringIterator(m_iter + n);
224 template <
typename E,
typename A>
225 auto CsStringIterator<E,A>::codePointBegin()
const -> v_iter
230 template <
typename E,
typename A>
231 auto CsStringIterator<E,A>::codePointEnd()
const -> v_iter
233 return m_iter + E::walk(1, m_iter);
237 template <
typename T>
238 class CsStringReverseIterator :
public std::reverse_iterator<T>
241 CsStringReverseIterator() =
default;
243 CsStringReverseIterator(T iter)
244 : std::reverse_iterator<T>(iter)
248 template <
typename U>
249 CsStringReverseIterator(CsStringReverseIterator<U> iter)
250 : std::reverse_iterator<T>(iter.base())
254 decltype(std::declval<T>().operator*()) operator*()
const;
255 decltype(std::declval<T>().operator->()) operator->()
const;
258 template <
typename T>
259 decltype(std::declval<T>().operator*()) CsStringReverseIterator<T>::operator*()
const
261 auto tmp =
this->base();
262 return (--tmp).operator*();
265 template <
typename T>
266 decltype(std::declval<T>().operator->()) CsStringReverseIterator<T>::operator->()
const
268 auto tmp =
this->base();
269 return (--tmp).operator->();
#define LIB_CS_STRING_EXPORT
Definition: cs_char.h:35