Range.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * Range.h
8  *
9  ****/
10 
11 #pragma once
12 
13 #include <WString.h>
14 #include <esp_systemapi.h>
15 
21 template <typename T> struct TRange {
22  T min{};
23  T max{};
24 
25  class Iterator
26  {
27  public:
28  using value_type = T;
29  using difference_type = std::ptrdiff_t;
30  using pointer = T*;
31  using reference = T&;
32  using iterator_category = std::random_access_iterator_tag;
33 
34  Iterator(T value) : value(value)
35  {
36  }
37 
38  T operator*() const
39  {
40  return value;
41  }
42 
43  bool operator==(const Iterator& other) const
44  {
45  return value == other.value;
46  }
47 
48  bool operator!=(const Iterator& other) const
49  {
50  return !(*this == other);
51  }
52 
54  {
55  Iterator ret(value);
56  ++*this;
57  return ret;
58  }
59 
61  {
62  ++value;
63  return *this;
64  }
65 
66  private:
67  T value;
68  };
69 
70  constexpr TRange()
71  {
72  }
73 
74  constexpr TRange(T min, T max) : min(min), max(max)
75  {
76  }
77 
78  constexpr TRange(T count) : min(0), max(count - 1)
79  {
80  }
81 
85  bool contains(T value) const
86  {
87  return (value >= min) && (value <= max);
88  }
89 
93  template <typename Q> bool contains(const TRange<Q>& value) const
94  {
95  return contains(value.min) && contains(value.max);
96  }
97 
101  T clip(T value) const
102  {
103  return (value < min) ? min : (value > max) ? max : value;
104  }
105 
109  T random() const
110  {
111  auto n = 1 + max - min;
112  if(n == 0) {
113  return 0;
114  }
115  auto value = os_random();
116  return min + value % n;
117  }
118 
119  Iterator begin() const
120  {
121  return Iterator{min};
122  }
123 
124  Iterator end() const
125  {
126  return Iterator{T(max + 1)};
127  }
128 
129  String toString() const
130  {
131  String s;
132  s += min;
133  s += ", ";
134  s += max;
135  return s;
136  }
137 
138  operator String() const
139  {
140  return toString();
141  }
142 };
143 
144 template <typename T> inline String toString(TRange<T> range)
145 {
146  return range.toString();
147 }
String toString(TRange< T > range)
Definition: Range.h:144
The String class.
Definition: WString.h:137
Definition: Range.h:26
Iterator(T value)
Definition: Range.h:34
T value_type
Definition: Range.h:28
Iterator & operator++()
Definition: Range.h:60
std::random_access_iterator_tag iterator_category
Definition: Range.h:32
bool operator==(const Iterator &other) const
Definition: Range.h:43
Iterator operator++(int)
Definition: Range.h:53
T & reference
Definition: Range.h:31
std::ptrdiff_t difference_type
Definition: Range.h:29
T operator*() const
Definition: Range.h:38
T * pointer
Definition: Range.h:30
bool operator!=(const Iterator &other) const
Definition: Range.h:48
Manage a range of numbers between specified limits.
Definition: Range.h:21
constexpr TRange(T min, T max)
Definition: Range.h:74
T clip(T value) const
Clip values to within the range.
Definition: Range.h:101
T random() const
Return a random value within the range.
Definition: Range.h:109
Iterator end() const
Definition: Range.h:124
bool contains(const TRange< Q > &value) const
Determine if range contains another range (subset)
Definition: Range.h:93
Iterator begin() const
Definition: Range.h:119
constexpr TRange(T count)
Definition: Range.h:78
constexpr TRange()
Definition: Range.h:70
bool contains(T value) const
Determine if range contains a value.
Definition: Range.h:85
T min
Definition: Range.h:22
T max
Definition: Range.h:23
String toString() const
Definition: Range.h:129