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 template<scalar Other>
51 constexpr basic_vector2(Other x, Other y) noexcept;
52
53 template<scalar Other>
54 constexpr basic_vector2(Other value) noexcept;
55
56 [[nodiscard]] static constexpr auto dot(const basic_vector2& lhs, const basic_vector2& rhs) noexcept -> length_type;
57
58 [[nodiscard]] static constexpr auto normalized(const basic_vector2& vector) noexcept -> basic_vector2;
59
60 [[nodiscard]] static constexpr auto orthogonal(const basic_vector2& vector) noexcept -> basic_vector2;
61
62 [[nodiscard]] static constexpr auto determinant(const basic_vector2& lhs, const basic_vector2& rhs) noexcept -> value_type;
63
64 [[nodiscard]] static constexpr auto distance(const basic_vector2& lhs, const basic_vector2& rhs) noexcept -> value_type;
65
66 [[nodiscard]] constexpr auto x() noexcept -> reference;
67
68 [[nodiscard]] constexpr auto x() const noexcept -> const_reference;
69
70 [[nodiscard]] constexpr auto y() noexcept -> reference;
71
72 [[nodiscard]] constexpr auto y() const noexcept -> const_reference;
73
74}; // class basic_vector2
75
76template<scalar Lhs, scalar Rhs>
77[[nodiscard]] constexpr auto operator+(basic_vector2<Lhs> lhs, const basic_vector2<Rhs>& rhs) noexcept -> basic_vector2<Lhs>;
78
79template<scalar Lhs, scalar Rhs>
80[[nodiscard]] constexpr auto operator-(basic_vector2<Lhs> lhs, const basic_vector2<Rhs>& rhs) noexcept -> basic_vector2<Lhs>;
81
82template<scalar Type>
83[[nodiscard]] constexpr auto operator-(basic_vector2<Type> vector) noexcept -> basic_vector2<Type>;
84
85template<scalar Lhs, scalar Rhs>
86[[nodiscard]] constexpr auto operator*(basic_vector2<Lhs> lhs, Rhs scalar) noexcept -> basic_vector2<Lhs>;
87
88template<scalar Lhs, scalar Rhs>
89[[nodiscard]] constexpr auto operator*(Lhs scalar, basic_vector2<Rhs> rhs) noexcept -> basic_vector2<Rhs>;
90
91template<scalar Lhs, scalar Rhs>
92[[nodiscard]] constexpr auto operator*(basic_vector2<Lhs> lhs, const basic_vector2<Rhs>& rhs) noexcept -> basic_vector2<Lhs>;
93
94template<scalar Lhs, scalar Rhs>
95[[nodiscard]] constexpr auto operator/(basic_vector2<Lhs> lhs, Rhs scalar) noexcept -> basic_vector2<Lhs>;
96
98
100
102
103using vector2 = vector2f;
104
105} // namespace ::math
106
107template<sbx::math::scalar Type>
108struct std::hash<sbx::math::basic_vector2<Type>> {
109
110 auto operator()(const sbx::math::basic_vector2<Type>& vector) const noexcept -> std::size_t;
111
112}; // struct std::hash
113
114template<sbx::math::scalar Type>
115struct YAML::convert<sbx::math::basic_vector2<Type>> {
116
117 static auto encode(const sbx::math::basic_vector2<Type>& vector) -> Node;
118
119 static auto decode(const Node& node, sbx::math::basic_vector2<Type>& vector) -> bool;
120
121}; // struct YAML::convert
122
123template<sbx::math::scalar Type>
124struct fmt::formatter<sbx::math::basic_vector2<Type>> {
125
126 template<typename ParseContext>
127 constexpr auto parse(ParseContext& context) -> decltype(context.begin());
128
129 template<typename FormatContext>
130 auto format(const sbx::math::basic_vector2<Type>& vector, FormatContext& context) const noexcept -> decltype(context.out());
131
132}; // struct fmt::formatter
133
134#include <libsbx/math/vector2.ipp>
135
136#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.