31#ifndef ETL_MULTI_LOOP_INCLUDED
32#define ETL_MULTI_LOOP_INCLUDED
50 :
exception(reason_, file_name_, line_number_)
63 :
etl::multi_range_exception(ETL_ERROR_TEXT(
"multi_range:circular reference", ETL_MULTI_LOOP_FILE_ID
"A"), file_name_, line_number_)
101 if (inner != ETL_NULLPTR)
103 inner->
append(inner_range);
107 inner = &inner_range;
126 if (inner != ETL_NULLPTR)
137 bool completed()
const
139 return has_completed;
151 while (p_range != ETL_NULLPTR)
154 p_range = p_range->inner;
167 for (start(); !completed();
next())
179 virtual void start() = 0;
187 : has_completed(true)
199 while (range != ETL_NULLPTR)
206 range = range->inner;
220 while (range->inner != ETL_NULLPTR)
222 range = range->inner;
236 template <
typename T>
241 typedef T value_type;
242 typedef const T& const_reference;
249 typedef T value_type;
251 virtual void operator()(value_type&
value) = 0;
259 typedef T value_type;
261 virtual void operator()(value_type&
value)
272 typedef T value_type;
275 : step_value(step_value_)
279 virtual void operator()(value_type&
value)
284 const value_type step_value;
292 typedef T value_type;
294 virtual void operator()(value_type&
value)
305 typedef T value_type;
308 : step_value(step_value_)
312 virtual void operator()(value_type&
value)
317 const value_type step_value;
325 typedef T value_type;
327 virtual bool operator()(
const value_type& current,
const value_type& last)
const = 0;
335 typedef T value_type;
337 virtual bool operator()(
const value_type& current,
const value_type& last)
const ETL_OVERRIDE
348 typedef T value_type;
350 virtual bool operator()(
const value_type& current,
const value_type& last)
const ETL_OVERRIDE
361 typedef T value_type;
363 virtual bool operator()(
const value_type& current,
const value_type& last)
const ETL_OVERRIDE
379 , p_stepper(&default_stepper)
380 , p_compare(&default_compare)
395 , p_stepper(&stepper_)
396 , p_compare(&default_compare)
411 , p_stepper(&default_stepper)
412 , p_compare(&compare_)
428 , p_stepper(&stepper_)
429 , p_compare(&compare_)
455 if (inner != ETL_NULLPTR)
461 has_completed = !(*p_compare)(current, last);
469 has_completed =
false;
471 if (inner != ETL_NULLPTR)
475 if (inner->completed())
477 has_completed = step();
482 has_completed = step();
501 (*p_stepper)(current);
503 const bool has_rolled_over = !(*p_compare)(current, last);
510 return has_rolled_over;
514 multi_range(const multi_range&) ETL_DELETE;
515 multi_range& operator =(const multi_range&) ETL_DELETE;
521 step_type* p_stepper;
522 forward_step default_stepper;
524 compare_type* p_compare;
525 not_equal_compare default_compare;
The base class for multi_range.
Definition: multi_range.h:72
virtual void next()=0
Pure virtual functions.
imulti_range()
Constructor.
Definition: multi_range.h:186
size_t number_of_iterations()
Gets the total number of iterations over all ranges, from this range inclusive.
Definition: multi_range.h:163
void set_last(imulti_range *next)
Set the inner range of the last linked range.
Definition: multi_range.h:215
void detach_all()
Unlinks this and all inner ranges.
Definition: multi_range.h:124
bool is_valid(imulti_range &inner_range)
Checks that there are no circular references.
Definition: multi_range.h:195
imulti_range & insert(imulti_range &inner_range)
Insert after this range.
Definition: multi_range.h:78
void detach()
Unlinks this range from its inner.
Definition: multi_range.h:116
size_t number_of_ranges() const
Gets the total number of ranges, from this range inclusive.
Definition: multi_range.h:145
imulti_range & append(imulti_range &inner_range)
Append to the most inner range.
Definition: multi_range.h:97
Circular reference exception.
Definition: multi_range.h:59
Exception for the multi_range.
Definition: multi_range.h:46
Definition: multi_range.h:238
const_reference end()
Definition: multi_range.h:445
void start() ETL_OVERRIDE
Initialises the ranges to the starting values.
Definition: multi_range.h:453
multi_range(value_type first_, value_type last_)
Definition: multi_range.h:374
multi_range(value_type first_, value_type last_, compare_type &compare_)
Definition: multi_range.h:405
const_reference begin()
Get a const reference to the starting value of the range.
Definition: multi_range.h:436
multi_range(value_type first_, value_type last_, step_type &stepper_, compare_type &compare_)
Definition: multi_range.h:421
const_reference value() const
Returns a const reference to the current range value.
Definition: multi_range.h:489
void next() ETL_OVERRIDE
Step to the next logical values in the ranges.
Definition: multi_range.h:467
multi_range(value_type first_, value_type last_, step_type &stepper_)
Definition: multi_range.h:389
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition: exception.h:69
Definition: exception.h:47
bitset_ext
Definition: absolute.h:38
Definition: functional.h:186
Definition: functional.h:134
Definition: multi_range.h:324
Definition: multi_range.h:271
Definition: multi_range.h:258
Definition: multi_range.h:360
Definition: multi_range.h:347
Definition: multi_range.h:334
Definition: multi_range.h:304
Definition: multi_range.h:291
Definition: multi_range.h:248
Definition: functional.h:265