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  T clip(T value) const
94  {
95  return (value < min) ? min : (value > max) ? max : value;
96  }
97 
101  T random() const
102  {
103  auto n = 1 + max - min;
104  if(n == 0) {
105  return 0;
106  }
107  auto value = os_random();
108  return min + value % n;
109  }
110 
111  Iterator begin() const
112  {
113  return Iterator{min};
114  }
115 
116  Iterator end() const
117  {
118  return Iterator{T(max + 1)};
119  }
120 
121  String toString() const
122  {
123  String s;
124  s += min;
125  s += ", ";
126  s += max;
127  return s;
128  }
129 
130  operator String() const
131  {
132  return toString();
133  }
134 };
135 
136 template <typename T> inline String toString(TRange<T> range)
137 {
138  return range.toString();
139 }
Iterator & operator++()
Definition: Range.h:60
bool operator==(const Iterator &other) const
Definition: Range.h:43
T * pointer
Definition: Range.h:30
Iterator(T value)
Definition: Range.h:34
Manage a range of numbers between specified limits.
Definition: Range.h:21
T max
Definition: Range.h:23
constexpr TRange()
Definition: Range.h:70
T random() const
Return a random value within the range.
Definition: Range.h:101
The String class.
Definition: WString.h:136
T min
Definition: Range.h:22
Iterator end() const
Definition: Range.h:116
std::random_access_iterator_tag iterator_category
Definition: Range.h:32
Definition: Range.h:25
std::ptrdiff_t difference_type
Definition: Range.h:29
bool contains(T value) const
Determine if range contains a value.
Definition: Range.h:85
T value_type
Definition: Range.h:28
bool operator!=(const Iterator &other) const
Definition: Range.h:48
constexpr TRange(T min, T max)
Definition: Range.h:74
String toString() const
Definition: Range.h:121
Iterator begin() const
Definition: Range.h:111
T operator*() const
Definition: Range.h:38
T & reference
Definition: Range.h:31
constexpr TRange(T count)
Definition: Range.h:78
Iterator operator++(int)
Definition: Range.h:53
T clip(T value) const
Clip values to within the range.
Definition: Range.h:93