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;
168 for (start(); !completed();
next())
180 virtual void start() = 0;
188 : has_completed(true)
200 while (range != ETL_NULLPTR)
207 range = range->inner;
221 while (range->inner != ETL_NULLPTR)
223 range = range->inner;
237 template <
typename T>
242 typedef T value_type;
243 typedef const T& const_reference;
250 typedef T value_type;
252 virtual void operator()(value_type&
value) = 0;
260 typedef T value_type;
262 virtual void operator()(value_type&
value)
273 typedef T value_type;
275 explicit forward_step_by(
const value_type& step_value_)
276 : step_value(step_value_)
280 virtual void operator()(value_type&
value)
285 const value_type step_value;
293 typedef T value_type;
295 virtual void operator()(value_type&
value)
306 typedef T value_type;
308 explicit reverse_step_by(
const value_type& step_value_)
309 : step_value(step_value_)
313 virtual void operator()(value_type&
value)
318 const value_type step_value;
326 typedef T value_type;
328 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
const = 0;
336 typedef T value_type;
338 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
const ETL_OVERRIDE
349 typedef T value_type;
351 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
const ETL_OVERRIDE
362 typedef T value_type;
364 virtual bool operator()(
const value_type& lhs,
const value_type& rhs)
const ETL_OVERRIDE
380 , p_stepper(&default_stepper)
381 , p_compare(&default_compare)
395 , p_stepper(&stepper_)
396 , p_compare(&default_compare)
409 , p_stepper(&default_stepper)
410 , p_compare(&compare_)
424 , p_stepper(&stepper_)
425 , p_compare(&compare_)
451 if (inner != ETL_NULLPTR)
457 has_completed = !(*p_compare)(current, last);
465 has_completed =
false;
467 if (inner != ETL_NULLPTR)
471 if (inner->completed())
473 has_completed = step();
478 has_completed = step();
497 (*p_stepper)(current);
499 const bool has_rolled_over = !(*p_compare)(current, last);
506 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:187
size_t number_of_iterations()
Definition multi_range.h:164
void set_last(imulti_range *next)
Set the inner range of the last linked range.
Definition multi_range.h:216
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:196
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:441
void start() ETL_OVERRIDE
Initialises the ranges to the starting values.
Definition multi_range.h:449
multi_range(value_type first_, value_type last_)
Definition multi_range.h:376
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:432
multi_range(value_type first_, value_type last_, step_type &stepper_, compare_type &compare_)
Definition multi_range.h:420
const_reference value() const
Returns a const reference to the current range value.
Definition multi_range.h:485
void next() ETL_OVERRIDE
Step to the next logical values in the ranges.
Definition multi_range.h:463
multi_range(value_type first_, value_type last_, step_type &stepper_)
Definition multi_range.h:391
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
bitset_ext
Definition absolute.h:40
Definition functional.h:253
Definition functional.h:201
Definition multi_range.h:325
Definition multi_range.h:259
Definition multi_range.h:361
Definition multi_range.h:348
Definition multi_range.h:335
Definition multi_range.h:292
Definition multi_range.h:249
Definition functional.h:332