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 <limits>
15 #include <esp_systemapi.h>
16 
22 template <typename T> struct TRange {
23  T min{};
24  T max{};
25 
26  class Iterator
27  {
28  public:
29  using value_type = T;
30  using difference_type = std::ptrdiff_t;
31  using pointer = T*;
32  using reference = T&;
33  using iterator_category = std::random_access_iterator_tag;
34 
35  Iterator(T value) : value(value)
36  {
37  }
38 
39  T operator*() const
40  {
41  return value;
42  }
43 
44  bool operator==(const Iterator& other) const
45  {
46  return value == other.value;
47  }
48 
49  bool operator!=(const Iterator& other) const
50  {
51  return !(*this == other);
52  }
53 
55  {
56  Iterator ret(value);
57  ++*this;
58  return ret;
59  }
60 
62  {
63  ++value;
64  return *this;
65  }
66 
67  private:
68  T value;
69  };
70 
71  constexpr TRange() = default;
72 
73  constexpr TRange(T min, T max) : min(min), max(max)
74  {
75  }
76 
77  constexpr TRange(T count) : min(0), max(count - 1)
78  {
79  }
80 
84  template <typename V> constexpr bool contains(V value) const
85  {
86  return (value >= min) && (value <= max);
87  }
88 
92  template <typename Q> bool contains(const TRange<Q>& value) const
93  {
94  return contains(value.min) && contains(value.max);
95  }
96 
100  template <typename V> constexpr T clip(V value) const
101  {
102  return (value < min) ? min : (value > max) ? max : T(value);
103  }
104 
108  T random() const
109  {
110  uint64_t n = 1 + max - min;
111  if(n == 0) {
112  return 0;
113  }
114  T value = os_random();
115  if(n > std::numeric_limits<uint32_t>::max()) {
116  value |= uint64_t(os_random()) << 32;
117  }
118  return min + value % n;
119  }
120 
121  Iterator begin() const
122  {
123  return Iterator{min};
124  }
125 
126  Iterator end() const
127  {
128  return Iterator{T(max + 1)};
129  }
130 
131  String toString() const
132  {
133  String s;
134  s += min;
135  s += ", ";
136  s += max;
137  return s;
138  }
139 
140  operator String() const
141  {
142  return toString();
143  }
144 };
145 
146 template <typename T> inline String toString(TRange<T> range)
147 {
148  return range.toString();
149 }
String toString(TRange< T > range)
Definition: Range.h:146
The String class.
Definition: WString.h:133
Definition: Range.h:27
Iterator(T value)
Definition: Range.h:35
T value_type
Definition: Range.h:29
Iterator & operator++()
Definition: Range.h:61
std::random_access_iterator_tag iterator_category
Definition: Range.h:33
bool operator==(const Iterator &other) const
Definition: Range.h:44
Iterator operator++(int)
Definition: Range.h:54
T & reference
Definition: Range.h:32
std::ptrdiff_t difference_type
Definition: Range.h:30
T operator*() const
Definition: Range.h:39
T * pointer
Definition: Range.h:31
bool operator!=(const Iterator &other) const
Definition: Range.h:49
Manage a range of numbers between specified limits.
Definition: Range.h:22
constexpr TRange(T min, T max)
Definition: Range.h:73
T random() const
Return a random value within the range.
Definition: Range.h:108
Iterator end() const
Definition: Range.h:126
constexpr T clip(V value) const
Clip values to within the range.
Definition: Range.h:100
bool contains(const TRange< Q > &value) const
Determine if range contains another range (subset)
Definition: Range.h:92
Iterator begin() const
Definition: Range.h:121
constexpr bool contains(V value) const
Determine if range contains a value.
Definition: Range.h:84
constexpr TRange(T count)
Definition: Range.h:77
constexpr TRange()=default
T min
Definition: Range.h:23
T max
Definition: Range.h:24
String toString() const
Definition: Range.h:131