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() = default;
71 
72  constexpr TRange(T min, T max) : min(min), max(max)
73  {
74  }
75 
76  constexpr TRange(T count) : min(0), max(count - 1)
77  {
78  }
79 
83  bool contains(T value) const
84  {
85  return (value >= min) && (value <= max);
86  }
87 
91  template <typename Q> bool contains(const TRange<Q>& value) const
92  {
93  return contains(value.min) && contains(value.max);
94  }
95 
99  T clip(T value) const
100  {
101  return (value < min) ? min : (value > max) ? max : value;
102  }
103 
107  T random() const
108  {
109  auto n = 1 + max - min;
110  if(n == 0) {
111  return 0;
112  }
113  auto value = os_random();
114  return min + value % n;
115  }
116 
117  Iterator begin() const
118  {
119  return Iterator{min};
120  }
121 
122  Iterator end() const
123  {
124  return Iterator{T(max + 1)};
125  }
126 
127  String toString() const
128  {
129  String s;
130  s += min;
131  s += ", ";
132  s += max;
133  return s;
134  }
135 
136  operator String() const
137  {
138  return toString();
139  }
140 };
141 
142 template <typename T> inline String toString(TRange<T> range)
143 {
144  return range.toString();
145 }
String toString(TRange< T > range)
Definition: Range.h:142
The String class.
Definition: WString.h:133
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:72
T clip(T value) const
Clip values to within the range.
Definition: Range.h:99
T random() const
Return a random value within the range.
Definition: Range.h:107
Iterator end() const
Definition: Range.h:122
bool contains(const TRange< Q > &value) const
Determine if range contains another range (subset)
Definition: Range.h:91
Iterator begin() const
Definition: Range.h:117
constexpr TRange(T count)
Definition: Range.h:76
bool contains(T value) const
Determine if range contains a value.
Definition: Range.h:83
constexpr TRange()=default
T min
Definition: Range.h:22
T max
Definition: Range.h:23
String toString() const
Definition: Range.h:127