template <typename T>
struct Euler
{
using ValueType = T;
ValueType roll;
ValueType pitch;
ValueType yaw;
constexpr Euler() noexcept;
constexpr Euler(ValueType roll, ValueType pitch, ValueType yaw) noexcept;
Euler(const Euler&) = default;
Euler& operator=(const Euler&) = default;
constexpr Euler operator+(const Euler& rhs) const noexcept;
constexpr Euler operator-(const Euler& rhs) const noexcept;
constexpr Euler operator*(const Euler& rhs) const noexcept;
constexpr Euler operator/(const Euler& rhs) const noexcept;
constexpr Euler operator+(ValueType rhs) const noexcept;
constexpr Euler operator-(ValueType rhs) const noexcept;
constexpr Euler operator*(ValueType rhs) const noexcept;
constexpr Euler operator/(ValueType rhs) const noexcept;
Euler& operator+=(const Euler& rhs) noexcept;
Euler& operator-=(const Euler& rhs) noexcept;
Euler& operator*=(const Euler& rhs) noexcept;
Euler& operator/=(const Euler& rhs) noexcept;
Euler& operator+=(ValueType rhs) noexcept;
Euler& operator-=(ValueType rhs) noexcept;
Euler& operator*=(ValueType rhs) noexcept;
Euler& operator/=(ValueType rhs) noexcept;
constexpr bool operator==(const Euler& rhs) const noexcept;
constexpr bool operator!=(const Euler& rhs) const noexcept;
explicit constexpr operator bool() const noexcept;
constexpr bool isZero() const noexcept;
Euler normalized(ValueType min, ValueType max) const;
constexpr Euler directionRevision(EulerDirection direction) const noexcept;
Quaternion toQuaternion() const noexcept;
void clear() noexcept;
void show() const noexcept;
};
using Euler = Euler<double>;