Empirical
Range.h
Go to the documentation of this file.
1 
11 #ifndef EMP_RANGE_H
12 #define EMP_RANGE_H
13 
14 #include <limits>
15 
16 #include "../base/assert.h"
17 #include "../base/vector.h"
18 
19 namespace emp {
20 
22  template <typename T>
23  class Range {
24  private:
25  T lower;
26  T upper;
27 
28  public:
29  Range() : lower(std::numeric_limits<T>::min()), upper(std::numeric_limits<T>::max()) { ; }
30  Range(T _l, T _u) : lower(_l), upper(_u) { emp_assert(_l < _u); }
31 
32  T GetLower() const { return lower; }
33  T GetUpper() const { return upper; }
34 
35  size_t CalcBin(T value, size_t num_bins) const {
36  return (size_t) (((double) (value - lower)) / ((double) (upper - lower)) * (double) num_bins);
37  }
38 
39  Range & operator=(const Range&) = default;
40  bool operator==(const Range& _in) const { return lower==_in.lower && upper==_in.upper; }
41  bool operator!=(const Range& _in) const { return lower!=_in.lower || upper!=_in.upper; }
42 
43  void SetLower(T l) { lower = l; }
44  void SetUpper(T u) { upper = u; }
45  void Set(T _l, T _u) { emp_assert(_l < _u); lower = _l; upper = _u; }
46 
47  void SetMaxLower() { lower = std::numeric_limits<T>::min(); }
48  void SetMaxUpper() { upper = std::numeric_limits<T>::max(); }
49 
51  bool Valid(T value) const { return value >= lower && value <= upper; }
52 
54  T Limit(T _in) const { return (_in < lower) ? lower : ((_in > upper) ? upper : _in); }
55 
57  emp::vector<T> Spread(size_t s) const {
58  emp_assert(s >= 1);
59  emp::vector<T> out(s);
60  out[0] = lower;
61  if (s > 1) {
62  T range = upper - lower;
63  for (size_t i = 1; i < s; i++) {
64  out[i] = lower + (T) ((((double) i) / (double)(s-1)) * range);
65  }
66  }
67  return out;
68  }
69  };
70 
72  template <typename T> Range<T> MakeRange(T _l, T _u) { return Range<T>(_l,_u); }
73 
75  inline Range<int> IntRange(int _l, int _u) { return Range<int>(_l,_u); }
76 
78  inline Range<double> DRange(double _l, double _u) { return Range<double>(_l,_u); }
79 }
80 
81 #endif
Range< double > DRange(double _l, double _u)
Build a new range of type double.
Definition: Range.h:78
bool operator!=(const Range &_in) const
Definition: Range.h:41
void SetUpper(T u)
Definition: Range.h:44
Range & operator=(const Range &)=default
void SetMaxUpper()
Definition: Range.h:48
Definition: BitVector.h:785
size_t CalcBin(T value, size_t num_bins) const
Definition: Range.h:35
T Limit(T _in) const
Force a value into range.
Definition: Range.h:54
A range of values from a lower limit to and upper limit, of any provided type.
Definition: Range.h:23
Range(T _l, T _u)
Definition: Range.h:30
bool operator==(const Range &_in) const
Definition: Range.h:40
T GetLower() const
Definition: Range.h:32
Range< int > IntRange(int _l, int _u)
Build a new range of type int.
Definition: Range.h:75
void SetMaxLower()
Definition: Range.h:47
If we are in emscripten, make sure to include the header.
Definition: array.h:37
#define emp_assert(...)
Definition: assert.h:199
void SetLower(T l)
Definition: Range.h:43
Range< T > MakeRange(T _l, T _u)
Build a new range with auto-detected type.
Definition: Range.h:72
emp::vector< T > Spread(size_t s) const
Produce a vector that spreads values evenly across the range.
Definition: Range.h:57
T GetUpper() const
Definition: Range.h:33
void Set(T _l, T _u)
Definition: Range.h:45
Range()
Definition: Range.h:29
bool Valid(T value) const
Determine if a provided value is in the range.
Definition: Range.h:51