Mathter
A configurable 3D math library for game developers.
Range.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 
4 namespace mathter {
5 
6 // Helper for writing for loops as for (auto i : Range(0,10))
7 template <class T>
8 class RangeHelper {
9 public:
10  class iterator {
11  friend class RangeHelper;
12  iterator(T value, T step) : value(value), step(step) {}
13 
14  public:
15  iterator() : value(std::numeric_limits<T>::lowest()) {}
16 
17  using value_type = T;
18  using difference_type = ptrdiff_t;
19  using reference = T&;
20  using pointer = T*;
21  using iterator_category = std::forward_iterator_tag;
22 
23  void operator++() {
24  value += step;
25  }
26  T operator*() const {
27  return value;
28  }
29  bool operator==(const iterator& rhs) const {
30  return value == rhs.value;
31  }
32  bool operator!=(const iterator& rhs) const {
33  return !(*this == rhs);
34  }
35 
36  private:
37  T value;
38  T step;
39  };
40 
41  RangeHelper(T first, T last, T step) : first(first), last(last), step(step) {}
42 
43  iterator begin() const { return iterator(first, step); }
44  iterator end() const { return iterator(last, step); }
45  iterator cbegin() const { return iterator(first, step); }
46  iterator cend() const { return iterator(last, step); }
47 
48 private:
49  T first, last, step;
50 };
51 
52 
53 template <class T>
54 RangeHelper<T> Range(T first, T last, T step) {
55  return RangeHelper<T>(first, last, step);
56 }
57 
58 template <class T>
59 RangeHelper<T> Range(T first, T last) {
60  T step = last >= first ? T(1) : T(-1);
61  return Range(first, last, step);
62 }
63 
64 template <class T>
66  T first = T(0);
67  T step = last >= first ? T(1) : T(-1);
68  return Range(first, last, step);
69 }
70 
71 } // namespace mathter
T & reference
Definition: Range.hpp:19
Definition: Range.hpp:8
bool operator==(const iterator &rhs) const
Definition: Range.hpp:29
bool operator!=(const iterator &rhs) const
Definition: Range.hpp:32
std::forward_iterator_tag iterator_category
Definition: Range.hpp:21
iterator cbegin() const
Definition: Range.hpp:45
T value_type
Definition: Range.hpp:17
ptrdiff_t difference_type
Definition: Range.hpp:18
T operator*() const
Definition: Range.hpp:26
T * pointer
Definition: Range.hpp:20
iterator()
Definition: Range.hpp:15
Definition: Approx.hpp:11
Definition: Range.hpp:10
RangeHelper(T first, T last, T step)
Definition: Range.hpp:41
void operator++()
Definition: Range.hpp:23
iterator begin() const
Definition: Range.hpp:43
iterator cend() const
Definition: Range.hpp:46
RangeHelper< T > Range(T first, T last, T step)
Definition: Range.hpp:54
iterator end() const
Definition: Range.hpp:44