@@ -40,6 +40,21 @@ enum class mir_slice_kind : int
4040 contiguous = 2
4141};
4242
43+ template <typename T>
44+ struct mir_rci ;
45+
46+ namespace mir {
47+ template <
48+ typename T
49+ >
50+ const T* light_const (const T* ptr) { return ptr; }
51+
52+ template <
53+ typename T
54+ >
55+ mir_rci<const T> light_const (const mir_rci<T>& s);
56+ }
57+
4358template <
4459 typename Iterator,
4560 mir_size_t N = 1 ,
@@ -172,12 +187,12 @@ struct mir_slice<Iterator, 2, mir_slice_kind::contiguous>
172187
173188 auto begin () const noexcept
174189 {
175- return _iterator;
190+ return mir::light_const ( _iterator) ;
176191 }
177192
178193 auto cbegin () const noexcept
179194 {
180- return _iterator ;
195+ return begin () ;
181196 }
182197
183198 Iterator end () noexcept
@@ -187,12 +202,12 @@ struct mir_slice<Iterator, 2, mir_slice_kind::contiguous>
187202
188203 auto end () const noexcept
189204 {
190- return _iterator + _lengths[0 ] * _lengths[1 ];
205+ return mir::light_const ( _iterator) + _lengths[0 ] * _lengths[1 ];
191206 }
192207
193208 auto cend () const noexcept
194209 {
195- return _iterator + _lengths[ 0 ] * _lengths[ 1 ] ;
210+ return end () ;
196211 }
197212};
198213
@@ -205,6 +220,11 @@ struct mir_slice<Iterator, 1, mir_slice_kind::contiguous>
205220 static const mir_ptrdiff_t _strides[0 ];
206221 Iterator _iterator = nullptr ;
207222
223+ using iterator = Iterator;
224+ using const_iterator = Iterator;
225+ using reverse_iterator = std::reverse_iterator<iterator>;
226+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
227+
208228 template <unsigned int d = 0 >
209229 size_t size () const noexcept
210230 {
@@ -247,6 +267,11 @@ struct mir_slice<Iterator, 1, mir_slice_kind::contiguous>
247267 return _iterator;
248268 }
249269
270+ auto begin () const noexcept
271+ {
272+ return mir::light_const (_iterator);
273+ }
274+
250275 auto cbegin () const noexcept
251276 {
252277 return _iterator;
@@ -257,10 +282,22 @@ struct mir_slice<Iterator, 1, mir_slice_kind::contiguous>
257282 return _iterator + _lengths[0 ];
258283 }
259284
285+ auto end () const noexcept
286+ {
287+ return mir::light_const (_iterator) + _lengths[0 ];
288+ }
289+
260290 auto cend () const noexcept
261291 {
262- return _iterator + _lengths[ 0 ] ;
292+ return end () ;
263293 }
294+
295+ reverse_iterator rbegin () noexcept { return reverse_iterator (this ->begin ()); }
296+ const_reverse_iterator rbegin () const noexcept { return const_reverse_iterator (this ->begin ()); }
297+ const_reverse_iterator crbegin () const noexcept { return const_reverse_iterator (this ->begin ()); }
298+ reverse_iterator rend () noexcept { return reverse_iterator (this ->end ()); }
299+ const_reverse_iterator rend () const noexcept { return const_reverse_iterator (this ->end ()); }
300+ const_reverse_iterator crend () const noexcept { return const_reverse_iterator (this ->end ()); }
264301};
265302
266303template <
@@ -312,11 +349,6 @@ struct mir_slice<Iterator, 1, mir_slice_kind::universal>
312349
313350namespace mir
314351{
315- template <
316- typename T
317- >
318- const T* light_const (const T* ptr) { return ptr; }
319-
320352 template <
321353 typename T,
322354 mir_size_t N,
0 commit comments