sandbox
Loading...
Searching...
No Matches
vector2.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MATH_VECTOR2_HPP_
3#define LIBSBX_MATH_VECTOR2_HPP_
4
5#include <cstddef>
6#include <cinttypes>
7#include <cmath>
8#include <concepts>
9#include <fstream>
10#include <ostream>
11#include <type_traits>
12
13#include <yaml-cpp/yaml.h>
14
15#include <fmt/format.h>
16
19
20namespace sbx::math {
21
27template<scalar Type>
28class basic_vector2 : public basic_vector<2u, Type> {
29
31
32 inline static constexpr auto x_axis = std::size_t{0u};
33 inline static constexpr auto y_axis = std::size_t{1u};
34
35public:
36
37 using value_type = base_type::value_type;
38 using reference = base_type::reference;
39 using const_reference = base_type::const_reference;
40 using size_type = base_type::size_type;
41 using length_type = base_type::length_type;
42
43 inline static constexpr basic_vector2 zero{base_type::fill(value_type{0})};
44 inline static constexpr basic_vector2 one{base_type::fill(value_type{1})};
45
46 using base_type::base_type;
47
48 constexpr basic_vector2(const base_type& base) noexcept;
49
50 constexpr basic_vector2() noexcept;
51
52 template<scalar Other>
53 constexpr basic_vector2(Other x, Other y) noexcept;
54
55 template<scalar Other>
56 constexpr basic_vector2(Other value) noexcept;
57
58 [[nodiscard]] static constexpr auto dot(const basic_vector2& lhs, const basic_vector2& rhs) noexcept -> length_type;
59
60 [[nodiscard]] static constexpr auto normalized(const basic_vector2& vector) noexcept -> basic_vector2;
61
62 [[nodiscard]] static constexpr auto orthogonal(const basic_vector2& vector) noexcept -> basic_vector2;
63
64 [[nodiscard]] static constexpr auto determinant(const basic_vector2& lhs, const basic_vector2& rhs) noexcept -> value_type;
65
66 [[nodiscard]] static constexpr auto distance(const basic_vector2& lhs, const basic_vector2& rhs) noexcept -> value_type;
67
68 [[nodiscard]] constexpr auto x() noexcept -> reference;
69
70 [[nodiscard]] constexpr auto x() const noexcept -> const_reference;
71
72 [[nodiscard]] constexpr auto y() noexcept -> reference;
73
74 [[nodiscard]] constexpr auto y() const noexcept -> const_reference;
75
76}; // class basic_vector2
77
78template<scalar Lhs, scalar Rhs>
79[[nodiscard]] constexpr auto operator+(basic_vector2<Lhs> lhs, const basic_vector2<Rhs>& rhs) noexcept -> basic_vector2<Lhs>;
80
81template<scalar Lhs, scalar Rhs>
82[[nodiscard]] constexpr auto operator-(basic_vector2<Lhs> lhs, const basic_vector2<Rhs>& rhs) noexcept -> basic_vector2<Lhs>;
83
84template<scalar Type>
85[[nodiscard]] constexpr auto operator-(basic_vector2<Type> vector) noexcept -> basic_vector2<Type>;
86
87template<scalar Lhs, scalar Rhs>
88[[nodiscard]] constexpr auto operator*(basic_vector2<Lhs> lhs, Rhs scalar) noexcept -> basic_vector2<Lhs>;
89
90template<scalar Lhs, scalar Rhs>
91[[nodiscard]] constexpr auto operator*(Lhs scalar, basic_vector2<Rhs> rhs) noexcept -> basic_vector2<Rhs>;
92
93template<scalar Lhs, scalar Rhs>
94[[nodiscard]] constexpr auto operator*(basic_vector2<Lhs> lhs, const basic_vector2<Rhs>& rhs) noexcept -> basic_vector2<Lhs>;
95
96template<scalar Lhs, scalar Rhs>
97[[nodiscard]] constexpr auto operator/(basic_vector2<Lhs> lhs, Rhs scalar) noexcept -> basic_vector2<Lhs>;
98
100
102
104
105using vector2 = vector2f;
106
107} // namespace ::math
108
109template<sbx::math::scalar Type>
110struct std::hash<sbx::math::basic_vector2<Type>> {
111
112 auto operator()(const sbx::math::basic_vector2<Type>& vector) const noexcept -> std::size_t;
113
114}; // struct std::hash
115
116template<sbx::math::scalar Type>
117struct YAML::convert<sbx::math::basic_vector2<Type>> {
118
119 static auto encode(const sbx::math::basic_vector2<Type>& vector) -> Node;
120
121 static auto decode(const Node& node, sbx::math::basic_vector2<Type>& vector) -> bool;
122
123}; // struct YAML::convert
124
125template<sbx::math::scalar Type>
126struct fmt::formatter<sbx::math::basic_vector2<Type>> {
127
128 template<typename ParseContext>
129 constexpr auto parse(ParseContext& context) -> decltype(context.begin());
130
131 template<typename FormatContext>
132 auto format(const sbx::math::basic_vector2<Type>& vector, FormatContext& context) const noexcept -> decltype(context.out());
133
134}; // struct fmt::formatter
135
136template<sbx::math::scalar Type>
137auto operator<<(YAML::Emitter& out, const sbx::math::basic_vector2<Type>& vector) -> YAML::Emitter& {
138 return out << YAML::convert<sbx::math::basic_vector2<Type>>::encode(vector);
139}
140
141#include <libsbx/math/vector2.ipp>
142
143#endif // LIBSBX_MATH_VECTOR2_HPP_
constexpr auto operator/(basic_degree< Type > lhs, const Other rhs) noexcept -> basic_degree< Type >
Divides a degree value by a scalar factor.
Definition: angle.ipp:112
constexpr auto operator+(basic_degree< Type > lhs, const basic_degree< Other > &rhs) noexcept -> basic_degree< Type >
Adds two degree values.
Definition: angle.ipp:90
constexpr auto operator*(basic_degree< Type > lhs, const Other rhs) noexcept -> basic_degree< Type >
Multiplies a degree value by a scalar factor.
Definition: angle.ipp:105
Definition: tests.cpp:6
A vector in two-dimensional space.
Definition: vector2.hpp:28
Fixed-size vector type.
Definition: vector.hpp:55
Concept for scalar numeric types.
Definition: concepts.hpp:150
Core numeric concepts and type traits.
Generic fixed-size vector type.