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