17requires std::floating_point<T>
class interval {
32 [[nodiscard]]
constexpr interval(value_type _minimum, value_type _maximum) noexcept : v()
36 tt_axiom(minimum() <= maximum());
39 [[nodiscard]]
constexpr interval(value_type rhs) noexcept :
interval(rhs, rhs) {}
41 [[nodiscard]]
constexpr value_type minimum()
const noexcept
46 [[nodiscard]]
constexpr value_type maximum()
const noexcept
53 for (
int i = 0; i != 2; ++i) {
61 for (
int i = 0; i != 2; ++i) {
70 for (
int i = 0; i != 2; ++i) {
71 r.v[i] = lhs.v[i] + rhs.v[i];
73 tt_axiom(r.minimum() <= r.maximum());
80 for (
int i = 0; i != 2; ++i) {
81 r.v[i] = lhs.v[i] - rhs.v[1 - i];
83 tt_axiom(r.minimum() <= r.maximum());
89 [[nodiscard]]
friend constexpr bool operator<(value_type
const &lhs,
interval const &rhs)
noexcept
91 return lhs < rhs.maximum();
96 [[nodiscard]]
friend constexpr bool operator<=(value_type
const &lhs,
interval const &rhs)
noexcept
98 return lhs <= rhs.maximum();
105 return lhs < rhs.minimum();
110 [[nodiscard]]
friend constexpr bool operator>(value_type
const &lhs,
interval const &rhs)
noexcept
112 return lhs > rhs.minimum();
119 return lhs >= rhs.minimum();
126 return lhs > rhs.maximum();
132 r.v[0] = lhs.v[0] < rhs.v[0] ? lhs.v[0] : rhs.v[0];
133 r.v[1] = lhs.v[1] > rhs.v[1] ? lhs.v[1] : rhs.v[1];
134 tt_axiom(r.minimum() <= r.maximum());
138 [[nodiscard]]
friend constexpr interval min(interval
const &lhs, interval
const &rhs)
noexcept
141 r.v[0] = lhs.v[0] > rhs.v[0] ? lhs.v[0] : rhs.v[0];
142 r.v[1] = lhs.v[1] < rhs.v[1] ? lhs.v[1] : rhs.v[1];
143 tt_axiom(r.minimum() <= r.maximum());
147 [[nodiscard]]
friend constexpr interval intersect(interval
const &lhs, interval
const &rhs)
noexcept
150 for (
int i = 0; i != 2; ++i) {
151 r.v[i] = lhs.v[i] < rhs.v[i] ? lhs.v[i] : rhs.v[i];
153 tt_axiom(r.minimum() <= r.maximum());
157 [[nodiscard]]
friend constexpr interval merge(interval
const &lhs, interval
const &rhs)
noexcept
160 for (
int i = 0; i != 2; ++i) {
161 r.v[i] = lhs.v[i] > rhs.v[i] ? lhs.v[i] : rhs.v[i];
163 tt_axiom(r.minimum() <= r.maximum());
167 [[nodiscard]]
friend constexpr value_type clamp(value_type
const &lhs, interval
const &rhs)
noexcept
169 tt_axiom(rhs.minimum() <= rhs.maximum());
170 return std::clamp(lhs, rhs.minimum(), rhs.maximum());
174 alignas(
sizeof(value_type) * 2) value_type v[2];
177using finterval = interval<float>;
178using dinterval = interval<double>;
Definition interval.hpp:17
friend constexpr bool operator<<(value_type const &lhs, interval const &rhs) noexcept
lhs is less than and outside of the interval
Definition interval.hpp:103
friend constexpr bool operator>(value_type const &lhs, interval const &rhs) noexcept
lhs is greater than the lower edge of the interval.
Definition interval.hpp:110
friend constexpr bool operator>>(value_type const &lhs, interval const &rhs) noexcept
lhs is greater than and outside of the interval
Definition interval.hpp:124
friend constexpr bool operator>=(value_type const &lhs, interval const &rhs) noexcept
lhs is greater than or equal to the lower edge of the interval.
Definition interval.hpp:117
friend constexpr bool operator<=(value_type const &lhs, interval const &rhs) noexcept
lhs is less than or equal the upper edge of the interval.
Definition interval.hpp:96
friend constexpr bool operator<(value_type const &lhs, interval const &rhs) noexcept
lhs is less than the upper edge of the interval.
Definition interval.hpp:89