#pragma once #include #include #include template class Range { static_assert(std::is_arithmetic::value, "The Type should be arithmetic"); public: constexpr Range() = default; // constexpr Range(std::initializer_list list) // { // switch(list.size()) // { // case 0: // break; // case 1: // _start = *list.begin(); // _end = _start; // break; // default: // _start = *list.begin(); // _end = *(list.begin() + 1); // } // } constexpr Range(Type start, Type end) noexcept : _start(start), _end(std::max(start, end)) {} ~Range() = default; Type getStart() const noexcept { return _start; } Type getEnd() const noexcept { return _end; } std::pair getPair() const noexcept { return std::make_pair(_start, _end); } Range(const Range& range) = default; Range(Range&& range) = default; void setStart(Type start) noexcept { _start = start; if (start > _end) _end = start; } void setEnd(Type end) noexcept { _end = end; if (end < _start) _start = end; } Type clamp(Type value) const noexcept { return std::clamp(value, _start, _end); } bool containsWithEnd(Type value) const noexcept { return (value >= _start && value <= _end); } bool contains(Type value) const noexcept { return (value >= _start && value < _end); } void shrinkIfSmaller( Type start, Type end) { if (start > end) std::swap(start, end); if (start > _start) _start = start; if (end < _end) _end = end; } private: Type _start { static_cast(0.0) }; Type _end { static_cast(0.0) }; }; template bool operator==(const Range& lhs, const Range& rhs) { return (lhs.getStart() == rhs.getStart()) && (lhs.getEnd() == rhs.getEnd()); } template bool operator==(const Range& lhs, const std::pair& rhs) { return (lhs.getStart() == rhs.first) && (lhs.getEnd() == rhs.second); } template bool operator==(const std::pair& lhs, const Range& rhs) { return rhs == lhs; }