Vanetza
 
Loading...
Searching...
No Matches
unit_interval.cpp
1#include <vanetza/common/unit_interval.hpp>
2#include <algorithm>
3#include <cmath>
4#include <limits>
5
6namespace vanetza
7{
8
9UnitInterval& UnitInterval::operator+=(const UnitInterval& other)
10{
11 m_value += other.m_value;
12 return clamp();
13}
14
15UnitInterval& UnitInterval::operator-=(const UnitInterval& other)
16{
17 m_value -= other.m_value;
18 return clamp();
19}
20
21UnitInterval& UnitInterval::operator*=(const UnitInterval& other)
22{
23 m_value *= other.m_value;
24 // all unit interval multiplications remain within range
25 return *this;
26}
27
28UnitInterval& UnitInterval::operator/=(const UnitInterval& other)
29{
30 m_value /= other.m_value;
31 // only upper limit has to be enforced
32 m_value = std::min(m_value, 1.0);
33 return *this;
34}
35
36UnitInterval& UnitInterval::operator+=(double value)
37{
38 m_value += value;
39 return clamp();
40}
41
42UnitInterval& UnitInterval::operator-=(double value)
43{
44 m_value -= value;
45 return clamp();
46}
47
48UnitInterval& UnitInterval::operator*=(double value)
49{
50 m_value *= value;
51 return clamp();
52}
53
54UnitInterval& UnitInterval::operator/=(double value)
55{
56 m_value /= value;
57 return clamp();
58}
59
60bool UnitInterval::operator<(const UnitInterval& other) const
61{
62 return m_value < other.m_value;
63}
64
65bool UnitInterval::operator==(const UnitInterval& other) const
66{
67 // epsilon should be fine for values in [0.0, 1.0]
68 return std::abs(m_value - other.m_value) < std::numeric_limits<double>::epsilon();
69}
70
71UnitInterval& UnitInterval::clamp()
72{
73 m_value = clamp(m_value);
74 return *this;
75}
76
77UnitInterval UnitInterval::complement() const
78{
79 UnitInterval complement;
80 complement.m_value = 1.0 - m_value;
81 return complement;
82}
83
84UnitInterval mean(UnitInterval lhs, UnitInterval rhs)
85{
86 return UnitInterval { 0.5 * (lhs.value() + rhs.value()) };
87}
88
89} // namespace vanetza