31#ifndef ETL_CIRCULAR_ITERATOR_INCLUDED
32#define ETL_CIRCULAR_ITERATOR_INCLUDED
36#include "static_assert.h"
42 namespace private_circular_iterator
47 template <
typename TIterator>
49 :
public etl::iterator< typename etl::iterator_traits<TIterator>::iterator_category, typename etl::iterator_traits<TIterator>::value_type>
53 typedef typename etl::iterator_traits<TIterator>::value_type value_type;
54 typedef typename etl::iterator_traits<TIterator>::difference_type difference_type;
55 typedef typename etl::iterator_traits<TIterator>::pointer pointer;
56 typedef typename etl::iterator_traits<TIterator>::reference reference;
57 typedef typename etl::iterator_traits<TIterator>::iterator_category iterator_category;
104 ETL_CONSTEXPR14 TIterator
begin()
const
112 ETL_CONSTEXPR14 TIterator
end()
const
120 ETL_CONSTEXPR14
size_t size()
const
168 ETL_CONSTEXPR14
operator TIterator()
const
194 template <typename TIterator, typename TTag = typename etl::iterator_traits<TIterator>::iterator_category>
197 ETL_STATIC_ASSERT((etl::is_same<TTag, ETL_OR_STD::input_iterator_tag>::value_type),
198 "input_iterator_catagory is not supported by circular_iterator");
199 ETL_STATIC_ASSERT((etl::is_same<TTag, ETL_OR_STD::output_iterator_tag>::value_type),
200 "output_iterator_catagory is not supported by circular_iterator");
208 template <
typename TIterator>
217 using common_t::operator=;
219 typedef typename common_t::value_type value_type;
220 typedef typename common_t::difference_type difference_type;
221 typedef typename common_t::pointer pointer;
222 typedef typename common_t::reference reference;
223 typedef typename common_t::iterator_category iterator_category;
237 : common_t(itr_begin_, itr_end_, itr_begin_)
245 : common_t(itr_begin_, itr_end_, start_)
298 template <
typename TIterator>
307 using common_t::operator=;
309 typedef typename common_t::value_type value_type;
310 typedef typename common_t::difference_type difference_type;
311 typedef typename common_t::pointer pointer;
312 typedef typename common_t::reference reference;
313 typedef typename common_t::iterator_category iterator_category;
327 : common_t(itr_begin_, itr_end_, itr_begin_)
335 : common_t(itr_begin_, itr_end_, start_)
391 this->
itr = ritr.base();
419 template <
typename TIterator>
429 using common_t::operator=;
431 typedef typename common_t::value_type value_type;
432 typedef typename common_t::difference_type difference_type;
433 typedef typename common_t::pointer pointer;
434 typedef typename common_t::reference reference;
435 typedef typename common_t::iterator_category iterator_category;
449 : common_t(itr_begin_, itr_end_, itr_begin_)
457 : common_t(itr_begin_, itr_end_, start_)
513 this->
itr = ritr.base();
540 const difference_type length = difference_type(this->
size());
545 const difference_type distance_from_begin = etl::distance(this->
itr_begin, this->
itr);
546 const difference_type distance_to_end = etl::distance(this->
itr, this->
itr_end);
550 if (distance_to_end > offset)
552 offset = distance_from_begin + offset;
556 offset = offset - distance_to_end;
563 if (distance_from_begin >= offset)
565 offset = distance_from_begin - offset;
569 offset = offset - distance_from_begin;
570 offset = length - offset;
596 template <
typename TIterator>
607 using impl_t::operator=;
609 typedef typename impl_t::value_type value_type;
610 typedef typename impl_t::difference_type difference_type;
611 typedef typename impl_t::pointer pointer;
612 typedef typename impl_t::reference reference;
613 typedef typename impl_t::iterator_category iterator_category;
627 : impl_t(itr_begin_, itr_end_, itr_begin_)
635 : impl_t(itr_begin_, itr_end_, start_)
652 impl_t::operator=(other);
661 template <
typename TIterator>
662 ETL_CONSTEXPR14 etl::circular_iterator<TIterator>
operator+(etl::circular_iterator<TIterator>& lhs,
663 typename etl::iterator_traits<TIterator>::difference_type offset)
665 etl::circular_iterator<TIterator> result(lhs);
674 template <
typename TIterator>
675 ETL_CONSTEXPR14 etl::circular_iterator<TIterator>
operator-(etl::circular_iterator<TIterator>& lhs,
676 typename etl::iterator_traits<TIterator>::difference_type offset)
678 etl::circular_iterator<TIterator> result(lhs);
687 template <
typename TIterator>
688 ETL_CONSTEXPR14
typename etl::iterator_traits<TIterator>::difference_type
operator-(etl::circular_iterator<TIterator>& lhs,
689 etl::circular_iterator<TIterator>& rhs)
691 return TIterator(lhs) - TIterator(rhs);
697 template <
typename TIterator>
698 ETL_CONSTEXPR14
bool operator==(
const etl::circular_iterator<TIterator>& lhs,
const etl::circular_iterator<TIterator>& rhs)
700 return TIterator(lhs) == TIterator(rhs);
706 template <
typename TIterator>
707 ETL_CONSTEXPR14
bool operator==(
const etl::circular_iterator<TIterator>& lhs, TIterator rhs)
709 return TIterator(lhs) == rhs;
715 template <
typename TIterator>
716 ETL_CONSTEXPR14
bool operator==(TIterator lhs,
const etl::circular_iterator<TIterator>& rhs)
718 return lhs == TIterator(rhs);
724 template <
typename TIterator>
725 ETL_CONSTEXPR14
bool operator!=(
const etl::circular_iterator<TIterator>& lhs,
const etl::circular_iterator<TIterator>& rhs)
727 return !(lhs == rhs);
733 template <
typename TIterator>
734 ETL_CONSTEXPR14
bool operator!=(
const etl::circular_iterator<TIterator>& lhs, TIterator rhs)
736 return !(lhs == rhs);
742 template <
typename TIterator>
743 ETL_CONSTEXPR14
bool operator!=(TIterator& lhs,
const etl::circular_iterator<TIterator>& rhs)
745 return !(lhs == rhs);
Common circular iterator implementation.
Definition circular_iterator.h:50
ETL_CONSTEXPR14 TIterator current() const
Conversion to base iterator type.
Definition circular_iterator.h:176
ETL_CONSTEXPR14 value_type operator*()
Dereference operator.
Definition circular_iterator.h:136
TIterator itr_end
The underlying end iterator.
Definition circular_iterator.h:184
ETL_CONSTEXPR14 bool empty() const
Is there nothing to iterate over?
Definition circular_iterator.h:128
ETL_CONSTEXPR14 TIterator operator->()
-> operator.
Definition circular_iterator.h:152
ETL_CONSTEXPR14 const value_type operator*() const
Dereference operator.
Definition circular_iterator.h:144
ETL_CONSTEXPR14 const TIterator operator->() const
-> operator.
Definition circular_iterator.h:160
ETL_CONSTEXPR14 circular_iterator_common(const circular_iterator_common &other)
Copy constructor.
Definition circular_iterator.h:82
ETL_CONSTEXPR14 circular_iterator_common()
Default constructor.
Definition circular_iterator.h:62
ETL_CONSTEXPR14 TIterator begin() const
Beginning of the range.
Definition circular_iterator.h:104
ETL_CONSTEXPR14 circular_iterator_common(TIterator itr_begin_, TIterator itr_end_, TIterator start_)
Construct from iterators.
Definition circular_iterator.h:72
TIterator itr_begin
The underlying begin iterator.
Definition circular_iterator.h:183
ETL_CONSTEXPR14 TIterator end() const
End of the range.
Definition circular_iterator.h:112
ETL_CONSTEXPR14 size_t size() const
How long is the range?
Definition circular_iterator.h:120
TIterator itr
The underlying iterator.
Definition circular_iterator.h:185
ETL_CONSTEXPR14 circular_iterator_common & operator=(const circular_iterator_common &other)
Assignment.
Definition circular_iterator.h:92
Definition iterator.h:252
ETL_CONSTEXPR14 circular_iterator_impl & operator--()
Decrement.
Definition circular_iterator.h:507
ETL_CONSTEXPR14 circular_iterator_impl(const circular_iterator_impl &other)
Copy constructor.
Definition circular_iterator.h:464
ETL_CONSTEXPR14 circular_iterator_impl & operator+=(difference_type offset)
+= operator.
Definition circular_iterator.h:538
ETL_CONSTEXPR14 circular_iterator_impl operator++(int)
Increment.
Definition circular_iterator.h:495
ETL_CONSTEXPR14 circular_iterator_impl & operator++()
Increment.
Definition circular_iterator.h:270
ETL_CONSTEXPR14 circular_iterator()
Default constructor.
Definition circular_iterator.h:618
ETL_CONSTEXPR14 circular_iterator & operator=(const circular_iterator &other)
Assignment.
Definition circular_iterator.h:650
ETL_CONSTEXPR14 circular_iterator_impl & operator=(const circular_iterator_impl &other)
Assignment.
Definition circular_iterator.h:472
ETL_CONSTEXPR14 circular_iterator_impl(TIterator itr_begin_, TIterator itr_end_, TIterator start_)
Construct from start + iterators.
Definition circular_iterator.h:334
ETL_CONSTEXPR14 circular_iterator_impl(const circular_iterator_impl &other)
Copy constructor.
Definition circular_iterator.h:342
ETL_CONSTEXPR14 circular_iterator_impl(TIterator itr_begin_, TIterator itr_end_, TIterator start_)
Construct from start + iterators.
Definition circular_iterator.h:244
ETL_CONSTEXPR14 circular_iterator(const circular_iterator &other)
Copy constructor.
Definition circular_iterator.h:642
ETL_CONSTEXPR14 circular_iterator_impl operator++(int)
Increment.
Definition circular_iterator.h:373
ETL_CONSTEXPR14 circular_iterator_impl operator--(int)
Decrement.
Definition circular_iterator.h:404
ETL_CONSTEXPR14 circular_iterator_impl & operator=(const circular_iterator_impl &other)
Assignment.
Definition circular_iterator.h:350
ETL_CONSTEXPR14 circular_iterator_impl & operator++()
Increment.
Definition circular_iterator.h:360
ETL_CONSTEXPR14 circular_iterator_impl(TIterator itr_begin_, TIterator itr_end_, TIterator start_)
Construct from start + iterators.
Definition circular_iterator.h:456
ETL_CONSTEXPR14 circular_iterator(TIterator itr_begin_, TIterator itr_end_)
Construct from iterators.
Definition circular_iterator.h:626
ETL_CONSTEXPR14 circular_iterator_impl(const circular_iterator_impl &other)
Copy constructor.
Definition circular_iterator.h:252
ETL_CONSTEXPR14 circular_iterator_impl()
Default constructor.
Definition circular_iterator.h:318
ETL_CONSTEXPR14 circular_iterator_impl operator++(int)
Increment.
Definition circular_iterator.h:283
ETL_CONSTEXPR14 circular_iterator_impl()
Default constructor.
Definition circular_iterator.h:228
ETL_CONSTEXPR14 circular_iterator_impl & operator=(const circular_iterator_impl &other)
Assignment.
Definition circular_iterator.h:260
ETL_CONSTEXPR14 circular_iterator_impl operator--(int)
Decrement.
Definition circular_iterator.h:526
ETL_CONSTEXPR14 circular_iterator_impl(TIterator itr_begin_, TIterator itr_end_)
Construct from iterators.
Definition circular_iterator.h:236
ETL_CONSTEXPR14 circular_iterator_impl(TIterator itr_begin_, TIterator itr_end_)
Construct from iterators.
Definition circular_iterator.h:326
ETL_CONSTEXPR14 circular_iterator_impl(TIterator itr_begin_, TIterator itr_end_)
Construct from iterators.
Definition circular_iterator.h:448
ETL_CONSTEXPR14 circular_iterator(TIterator itr_begin_, TIterator itr_end_, TIterator start_)
Construct from start + iterators.
Definition circular_iterator.h:634
ETL_CONSTEXPR14 circular_iterator_impl & operator-=(typename etl::iterator_traits< TIterator >::difference_type offset)
-= operator.
Definition circular_iterator.h:583
ETL_CONSTEXPR14 circular_iterator_impl & operator++()
Increment.
Definition circular_iterator.h:482
ETL_CONSTEXPR14 circular_iterator_impl & operator--()
Decrement.
Definition circular_iterator.h:385
ETL_CONSTEXPR14 circular_iterator_impl()
Default constructor.
Definition circular_iterator.h:440
Definition circular_iterator.h:599
Definition circular_iterator.h:196
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator-(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition circular_iterator.h:675
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
ETL_CONSTEXPR14 etl::circular_iterator< TIterator > operator+(etl::circular_iterator< TIterator > &lhs, typename etl::iterator_traits< TIterator >::difference_type offset)
Definition circular_iterator.h:662
iterator
Definition iterator.h:424