| |
| |
| |
|
|
| #pragma once |
|
|
| #include <cstdlib> |
| #include <type_traits> |
|
|
| namespace Common { |
|
|
| constexpr float PI = 3.14159265f; |
|
|
| template <class T> |
| struct Rectangle { |
| T left{}; |
| T top{}; |
| T right{}; |
| T bottom{}; |
|
|
| constexpr Rectangle() = default; |
|
|
| constexpr Rectangle(T left, T top, T right, T bottom) |
| : left(left), top(top), right(right), bottom(bottom) {} |
|
|
| [[nodiscard]] constexpr bool operator==(const Rectangle<T>& rhs) const { |
| return (left == rhs.left) && (top == rhs.top) && (right == rhs.right) && |
| (bottom == rhs.bottom); |
| } |
|
|
| [[nodiscard]] constexpr bool operator!=(const Rectangle<T>& rhs) const { |
| return !operator==(rhs); |
| } |
|
|
| [[nodiscard]] constexpr Rectangle<T> operator*(const T value) const { |
| return Rectangle{left * value, top * value, right * value, bottom * value}; |
| } |
| [[nodiscard]] constexpr Rectangle<T> operator/(const T value) const { |
| return Rectangle{left / value, top / value, right / value, bottom / value}; |
| } |
|
|
| [[nodiscard]] T GetWidth() const { |
| return std::abs(static_cast<std::make_signed_t<T>>(right - left)); |
| } |
| [[nodiscard]] T GetHeight() const { |
| return std::abs(static_cast<std::make_signed_t<T>>(bottom - top)); |
| } |
| [[nodiscard]] Rectangle<T> TranslateX(const T x) const { |
| return Rectangle{left + x, top, right + x, bottom}; |
| } |
| [[nodiscard]] Rectangle<T> TranslateY(const T y) const { |
| return Rectangle{left, top + y, right, bottom + y}; |
| } |
| [[nodiscard]] Rectangle<T> Scale(const float s) const { |
| return Rectangle{left, top, static_cast<T>(left + GetWidth() * s), |
| static_cast<T>(top + GetHeight() * s)}; |
| } |
| }; |
|
|
| template <typename T> |
| Rectangle(T, T, T, T) -> Rectangle<T>; |
|
|
| } |
|
|