19 #ifndef LIB_CS_STRING_ITERATOR_H
20 #define LIB_CS_STRING_ITERATOR_H
32 CsCharArrow (CsChar c)
36 const CsChar *operator->()
const {
44 template <
typename E,
typename A>
45 class CsStringIterator
47 using v_iter =
typename std::vector<
typename E::storage_unit, A>::const_iterator;
50 using difference_type = std::ptrdiff_t;
51 using pointer = CsChar *;
52 using reference = CsChar;
53 using size_type = std::ptrdiff_t;
54 using value_type = CsChar;
55 using iterator_category = std::random_access_iterator_tag;
57 CsStringIterator() =
default;
59 CsChar operator*()
const;
60 CsCharArrow operator->()
const;
62 CsChar operator[](size_type n)
const;
65 bool operator!=(
const CsStringIterator &other)
const;
66 bool operator==(
const CsStringIterator &other)
const;
67 bool operator<(
const CsStringIterator &other)
const;
68 bool operator<=(
const CsStringIterator &other)
const;
69 bool operator>(
const CsStringIterator &other)
const;
70 bool operator>=(
const CsStringIterator &other)
const;
73 CsStringIterator &operator+=(size_type n);
74 CsStringIterator &operator-=(size_type n);
76 CsStringIterator operator+(size_type n)
const;
77 CsStringIterator &operator++();
78 CsStringIterator operator++(
int);
80 CsStringIterator operator-(size_type n)
const;
81 size_type operator-(CsStringIterator other)
const;
82 CsStringIterator &operator--();
83 CsStringIterator operator--(
int);
85 typename std::pair<v_iter, v_iter> codePointRange()
const;
86 v_iter codePointBegin()
const;
87 v_iter codePointEnd()
const;
90 explicit CsStringIterator(v_iter data);
93 friend class CsBasicString<E, A>;
96 template <
typename E,
typename A>
97 CsChar CsStringIterator<E,A>::operator*()
const
99 return E::getCodePoint(m_iter);
102 template <
typename E,
typename A>
103 CsCharArrow CsStringIterator<E,A>::operator->()
const
105 return E::getCodePoint(m_iter);
108 template <
typename E,
typename A>
109 CsChar CsStringIterator<E,A>:: operator[](size_type n)
const
116 template <
typename E,
typename A>
117 bool CsStringIterator <E,A>::operator!=(
const CsStringIterator &other)
const
119 return m_iter != other.m_iter;
122 template <
typename E,
typename A>
123 bool CsStringIterator <E,A>::operator==(
const CsStringIterator &other)
const
125 return m_iter == other.m_iter;
128 template <
typename E,
typename A>
129 bool CsStringIterator <E,A>::operator<(
const CsStringIterator &other)
const
131 return m_iter < other.m_iter;
134 template <
typename E,
typename A>
135 bool CsStringIterator <E,A>::operator<=(
const CsStringIterator &other)
const
137 return m_iter <= other.m_iter;
140 template <
typename E,
typename A>
141 bool CsStringIterator <E,A>::operator>(
const CsStringIterator &other)
const
143 return m_iter > other.m_iter;
146 template <
typename E,
typename A>
147 bool CsStringIterator <E,A>::operator>=(
const CsStringIterator &other)
const
149 return m_iter >= other.m_iter;
153 template <
typename E,
typename A>
154 CsStringIterator<E,A> &CsStringIterator<E,A>::operator+=(size_type n)
156 m_iter += E::walk(n, m_iter);
160 template <
typename E,
typename A>
161 CsStringIterator<E,A> &CsStringIterator<E,A>::operator-=(size_type n)
163 m_iter += E::walk(-n, m_iter);
167 template <
typename E,
typename A>
168 CsStringIterator<E,A> CsStringIterator<E,A>::operator+(size_type n)
const
170 auto iter = m_iter + E::walk(n, m_iter);
171 return CsStringIterator(iter);
174 template <
typename E,
typename A>
175 CsStringIterator<E,A> &CsStringIterator<E,A>::operator++()
177 m_iter += E::walk(1, m_iter);
181 template <
typename E,
typename A>
182 CsStringIterator<E,A> CsStringIterator<E,A>::operator++(
int)
184 CsStringIterator retval = *
this;
185 m_iter += E::walk(1, m_iter);
190 template <
typename E,
typename A>
191 CsStringIterator<E,A> CsStringIterator<E,A>::operator-(size_type n)
const
193 auto iter = m_iter + E::walk(-n, m_iter);
194 return CsStringIterator(iter);
197 template <
typename E,
typename A>
198 typename CsStringIterator<E, A>::size_type CsStringIterator <E,A>::operator-(CsStringIterator other)
const
200 CsStringIterator a = *
this;
201 CsStringIterator b = other;
204 return 0 - E::distance(a.m_iter, b.m_iter);
207 return E::distance(b.m_iter, a.m_iter);
212 template <
typename E,
typename A>
213 CsStringIterator<E,A> &CsStringIterator<E,A>::operator--()
215 m_iter+= E::walk(-1, m_iter);
219 template <
typename E,
typename A>
220 CsStringIterator<E,A> CsStringIterator<E,A>::operator--(
int)
222 CsStringIterator retval = *
this;
223 m_iter += E::walk(-1, m_iter);
229 template <
typename E,
typename A>
230 CsStringIterator<E,A>::CsStringIterator(v_iter data)
235 template <
typename E,
typename A>
236 auto CsStringIterator<E,A>::codePointRange()
const ->
typename std::pair<v_iter, v_iter>
238 return std::make_pair(m_iter, m_iter + E::walk(1, m_iter));
241 template <
typename E,
typename A>
242 auto CsStringIterator<E,A>::codePointBegin()
const -> v_iter
247 template <
typename E,
typename A>
248 auto CsStringIterator<E,A>::codePointEnd()
const -> v_iter
250 return m_iter + E::walk(1, m_iter);
254 template <
typename T>
255 class CsStringReverseIterator :
public std::reverse_iterator<T>
258 CsStringReverseIterator() =
default;
260 CsStringReverseIterator(T iter)
261 : std::reverse_iterator<T>(iter)
265 template <
typename U>
266 CsStringReverseIterator(CsStringReverseIterator<U> iter)
267 : std::reverse_iterator<T>(iter.base())
271 decltype(std::declval<T>().operator*()) operator*()
const;
272 decltype(std::declval<T>().operator->()) operator->()
const;
275 template <
typename T>
276 decltype(std::declval<T>().operator*()) CsStringReverseIterator<T>::operator*()
const
278 auto tmp =
this->base();
279 return (--tmp).operator*();
282 template <
typename T>
283 decltype(std::declval<T>().operator->()) CsStringReverseIterator<T>::operator->()
const
285 auto tmp =
this->base();
286 return (--tmp).operator->();
#define LIB_CS_STRING_EXPORT
Definition: cs_char.h:34