The iterators we are about to create will be built upon two utility functions: one for calculating the step size, and one for retrieving the value of a specific step index using the start value and the step index. For simplicity, we prevented a range from having fewer than two values.
To calculate the step size, we will need the start, stop value, and the number of values parameters:
template <typename T>auto get_step_size(T start, T stop, size_t n) { assert(n >= 2); return (stop-start) / (n-1);}
To calculate a linear value at a specific index, we will need the start, step size, and value index parameters:
template <typename T>auto get_linear_value(T start, T step_size, size_t idx) { return start + step_size * idx;}
Using ...