31#ifndef ETL_MULTI_LOOP_INCLUDED
32#define ETL_MULTI_LOOP_INCLUDED
49 multi_range_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
50 :
exception(reason_, file_name_, line_number_)
62 multi_range_circular_reference(string_type file_name_, numeric_type 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;
274 explicit forward_step_by(
const value_type& step_value_)
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;
307 explicit reverse_step_by(
const value_type& step_value_)
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& lhs,
const value_type& rhs)
const = 0;
335 typedef T value_type;
337 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
const ETL_OVERRIDE
348 typedef T value_type;
350 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
const ETL_OVERRIDE
361 typedef T value_type;
363 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
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;
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
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:356
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:39
Definition functional.h:222
Definition functional.h:170
Definition multi_range.h:324
Definition multi_range.h:258
Definition multi_range.h:360
Definition multi_range.h:347
Definition multi_range.h:334
Definition multi_range.h:291
Definition multi_range.h:248
Definition functional.h:301