Skip to content

Commit 4f96a84

Browse files
Added const iterators to span (#986)
1 parent cf73d9a commit 4f96a84

File tree

3 files changed

+80
-4
lines changed

3 files changed

+80
-4
lines changed

include/etl/span.h

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ namespace etl
7171
typedef T* pointer;
7272
typedef const T* const_pointer;
7373

74-
typedef T* iterator;
75-
typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
74+
typedef T* iterator;
75+
typedef const T* const_iterator;
76+
typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
77+
typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
7678

7779
typedef etl::circular_iterator<pointer> circular_iterator;
7880
typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
@@ -185,6 +187,14 @@ namespace etl
185187
return pbegin;
186188
}
187189

190+
//*************************************************************************
191+
/// Returns a const iterator to the beginning of the span.
192+
//*************************************************************************
193+
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
194+
{
195+
return pbegin;
196+
}
197+
188198
//*************************************************************************
189199
/// Returns an iterator to the beginning of the span.
190200
//*************************************************************************
@@ -201,6 +211,14 @@ namespace etl
201211
return circular_iterator(begin(), end());
202212
}
203213

214+
//*************************************************************************
215+
/// Returns a const iterator to the end of the span.
216+
//*************************************************************************
217+
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
218+
{
219+
return (pbegin + Extent);
220+
}
221+
204222
//*************************************************************************
205223
/// Returns an iterator to the end of the span.
206224
//*************************************************************************
@@ -209,6 +227,14 @@ namespace etl
209227
return (pbegin + Extent);
210228
}
211229

230+
//*************************************************************************
231+
// Returns a const reverse iterator to the reverse beginning of the span.
232+
//*************************************************************************
233+
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
234+
{
235+
return const_reverse_iterator((pbegin + Extent));
236+
}
237+
212238
//*************************************************************************
213239
// Returns an reverse iterator to the reverse beginning of the span.
214240
//*************************************************************************
@@ -225,6 +251,14 @@ namespace etl
225251
return reverse_circular_iterator(rbegin(), rend());
226252
}
227253

254+
//*************************************************************************
255+
/// Returns a const reverse iterator to the end of the span.
256+
//*************************************************************************
257+
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
258+
{
259+
return const_reverse_iterator(pbegin);
260+
}
261+
228262
//*************************************************************************
229263
/// Returns a reverse iterator to the end of the span.
230264
//*************************************************************************
@@ -413,8 +447,10 @@ namespace etl
413447
typedef T* pointer;
414448
typedef const T* const_pointer;
415449

416-
typedef T* iterator;
417-
typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
450+
typedef T* iterator;
451+
typedef const T* const_iterator;
452+
typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
453+
typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
418454

419455
typedef etl::circular_iterator<pointer> circular_iterator;
420456
typedef etl::circular_iterator<ETL_OR_STD::reverse_iterator<pointer> > reverse_circular_iterator;
@@ -544,6 +580,14 @@ namespace etl
544580
return pbegin;
545581
}
546582

583+
//*************************************************************************
584+
/// Returns a const iterator to the beginning of the span.
585+
//*************************************************************************
586+
ETL_NODISCARD ETL_CONSTEXPR const_iterator cbegin() const ETL_NOEXCEPT
587+
{
588+
return pbegin;
589+
}
590+
547591
//*************************************************************************
548592
/// Returns an iterator to the beginning of the span.
549593
//*************************************************************************
@@ -560,6 +604,14 @@ namespace etl
560604
return circular_iterator(begin(), end());
561605
}
562606

607+
//*************************************************************************
608+
/// Returns a const iterator to the end of the span.
609+
//*************************************************************************
610+
ETL_NODISCARD ETL_CONSTEXPR const_iterator cend() const ETL_NOEXCEPT
611+
{
612+
return pend;
613+
}
614+
563615
//*************************************************************************
564616
/// Returns an iterator to the end of the span.
565617
//*************************************************************************
@@ -576,6 +628,14 @@ namespace etl
576628
return reverse_iterator(pend);
577629
}
578630

631+
//*************************************************************************
632+
// Returns a const reverse iterator to the reverse beginning of the span.
633+
//*************************************************************************
634+
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crbegin() const ETL_NOEXCEPT
635+
{
636+
return const_reverse_iterator(pend);
637+
}
638+
579639
//*************************************************************************
580640
/// Returns a reverse circular iterator to the end of the span.
581641
//*************************************************************************
@@ -584,6 +644,14 @@ namespace etl
584644
return reverse_circular_iterator(rbegin(), rend());
585645
}
586646

647+
//*************************************************************************
648+
/// Returns a const reverse iterator to the end of the span.
649+
//*************************************************************************
650+
ETL_NODISCARD ETL_CONSTEXPR const_reverse_iterator crend() const ETL_NOEXCEPT
651+
{
652+
return const_reverse_iterator(pbegin);
653+
}
654+
587655
//*************************************************************************
588656
/// Returns a reverse iterator to the end of the span.
589657
//*************************************************************************

test/test_span_dynamic_extent.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,19 @@ namespace
409409
View view(etldata.begin(), etldata.end());
410410
CView cview(etldata.begin(), etldata.end());
411411

412+
CHECK_EQUAL(etldata.cbegin(), view.cbegin());
412413
CHECK_EQUAL(etldata.begin(), view.begin());
413414
CHECK_EQUAL(etldata.begin(), cview.begin());
414415

416+
CHECK_EQUAL(etldata.cend(), view.crbegin().base());
415417
CHECK_EQUAL(etldata.end(), view.rbegin().base());
416418
CHECK_EQUAL(etldata.end(), cview.rbegin().base());
417419

420+
CHECK_EQUAL(etldata.cend(), view.cend());
418421
CHECK_EQUAL(etldata.end(), view.end());
419422
CHECK_EQUAL(etldata.end(), cview.end());
420423

424+
CHECK_EQUAL(etldata.cbegin(), view.crend().base());
421425
CHECK_EQUAL(etldata.begin(), view.rend().base());
422426
CHECK_EQUAL(etldata.begin(), cview.rend().base());
423427
}

test/test_span_fixed_extent.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,15 +397,19 @@ namespace
397397
View view(etldata.begin(), etldata.end());
398398
CView cview(etldata.begin(), etldata.end());
399399

400+
CHECK_EQUAL(etldata.cbegin(), view.cbegin());
400401
CHECK_EQUAL(etldata.begin(), view.begin());
401402
CHECK_EQUAL(etldata.begin(), cview.begin());
402403

404+
CHECK_EQUAL(etldata.cend(), view.crbegin().base());
403405
CHECK_EQUAL(etldata.end(), view.rbegin().base());
404406
CHECK_EQUAL(etldata.end(), cview.rbegin().base());
405407

408+
CHECK_EQUAL(etldata.cend(), view.cend());
406409
CHECK_EQUAL(etldata.end(), view.end());
407410
CHECK_EQUAL(etldata.end(), cview.end());
408411

412+
CHECK_EQUAL(etldata.cbegin(), view.crend().base());
409413
CHECK_EQUAL(etldata.begin(), view.rend().base());
410414
CHECK_EQUAL(etldata.begin(), cview.rend().base());
411415
}

0 commit comments

Comments
 (0)