#include <morph/range.h>
Header file: morph/range.h.
morph::range
is a useful little class for specifying a mathematical closed interval. It simply contains two numbers indicating the minimum and maximum of the interval.
It is used as a return object for the vec::range
and vvec::range
methods and gives semantic meaning to the two values min
and max
, which are public and accessible directly by client code (if a 2 element array were used for a range, the client coder would have to remember if element 0 was min or max).
The range object can participate in the process of determining the range of values in a data container and it can test for a value being within the interval.
morph::range
takes one template argument, specifying the type of the values.
namespace morph {
template <typename T>
struct range
{
morph::range
is constexpr
capable.
Construct
morph::range<T> r; // Default range has min == max == T{0}
morph::range<float> r(0.0f, 10.0f); // Construct with a defined range
Update the range to include a value
morph::range<int> r; // range initially 0 to 0
bool changed1 = r.update (100); // range now 0 to 100
bool changed2 = r.update (-100); // range now -100 to 100
bool changed3 = r.update (50); // range unchanged; still -100 to 100
update
returns a bool
which will be true if the range was changed and false if the range is not changed. In the example above, changed1
and changed2 will both be
true, but
changed3 will contain
false`.
Set the range manually in a single function call
morph::range<int> r; // range initially 0 to 0
r.set (-100, 100); // range now -100 to 100
Test a value to see if the range includes this value
r.includes (45); // would return bool true, following on from previous example
r.includes (-450); // would return bool false
To query the max or min of the range, just access the max
or min
members:
std::cout << "range maximum is " << r.max << " and its minimum is " << r.min << std::endl;
You can stream the range to get both at once:
std::cout << r << std::endl;
This would output [-100,100]
in our example.
There’s a helper function to get range.max - range.min
:
std::cout << "The range 'spans': " << r.span() << std::endl;
Determine a range from data. Here, we initialize a range with min taking the maximum possible value for the type and max taking the minimum possible value. This is done with a call to range::search_init
. We then run through the data container, calling update for each element. For example:
morph::vvec<double> data;
data.randomize();
range<double> r;
r.search_init();
for (auto d : data) { r.update (d); }
std::cout << "The range of values in data was: " << r << std::endl;