13#pragma warning(disable : 4201)
21 template <Primitive T>
24 static_assert(!std::is_const_v<T>);
28 static constexpr size_t size = 4;
30 constexpr vec() =
default;
37 template <Primitive U>
38 constexpr vec(U value);
51 template <Primitive A, Primitive B, Primitive C, Primitive D>
52 constexpr vec(A a, B b, C c, D d);
59 template <
typename... U>
62 constexpr vec(std::array<T, size>
const &arr) :
data{ arr } {}
64 constexpr vec(std::array<T, size> &&arr) :
data{
std::move(arr) } {}
68 constexpr void reset() noexcept;
72 constexpr
vec<
size, T> &operator=(_detail::rvec<
size, U> const &b)
74 for (
size_t i = 0; i <
size; i++)
72 constexpr
vec<
size, T> &operator=(_detail::rvec<
size, U> const &b) {
…}
85 for (
size_t i = 0; i <
size; i++)
95 [[nodiscard]] constexpr
vec<4, T> operator-() const noexcept;
98 constexpr
vec<4, T> &operator+=(U const value) noexcept;
100 constexpr
vec<4, T> &operator-=(U const value) noexcept;
102 constexpr
vec<4, T> &operator*=(U const value) noexcept;
104 constexpr
vec<4, T> &operator/=(U const value) noexcept;
106 constexpr
vec<4, T> &operator%=(U const value) noexcept;
108 constexpr
vec<4, T> &operator+=(U const &other) noexcept requires(
size == U::
size);
110 constexpr
vec<4, T> &operator-=(U const &other) noexcept requires(
size == U::
size);
112 constexpr
vec<4, T> &operator*=(U const &other) noexcept requires(
size == U::
size);
114 constexpr
vec<4, T> &operator/=(U const &other) noexcept requires(
size == U::
size);
116 constexpr
vec<4, T> &operator%=(U const &other) noexcept requires(
size == U::
size);
119 [[nodiscard]] constexpr T &operator[](
size_t i);
121 [[nodiscard]] constexpr T const &operator[](
size_t i) const;
163 static_assert(
sizeof(
data) ==
size *
sizeof(T));
171 template <Primitive _>
185 template <
typename A,
typename B,
typename... C>
195 template <Primitive U>
213 template <
typename A,
typename B,
typename... C>
214 constexpr void unpack_data(
size_t offset, A a, B b, C... c);
Concept to determine if a type is any kind of vector.
Concept that ensures a type is either floating point or integral.
Contains mathematical utility functions and classes.
constexpr mat< T::size.x, T::size.y, std::remove_const_t< typename T::type > > operator+(U const left, T const &right)
Adds a matrix to a primitive.
constexpr vec(std::array< T, size > &&arr)
Move constructor from std::array.
std::array< T, size > data
constexpr vec(std::array< T, size > const &arr)
Constructor from std::array.
constexpr void unpack_data(size_t offset, V vec)
Unpacks a vector into the matrix data.
static constexpr size_t get_parameter_pack_size()
Determines the size of a parameter pack for vector types.
static constexpr vec< 4, T > zero() noexcept
Returns a zero vector.
T type
Type of the vector elements.
constexpr vec< size, T > & operator=(vec< size, U > const &b)
Overloaded assignment operator for another vec object.
constexpr vec()=default
Default constructor.
Definition of the mathematical vector with fixed size L and type T
std::array< T, size > data
The underlying data of the vector.
static constexpr size_t get_parameter_pack_size()
Determines the size of a parameter pack for primitive types.
constexpr void unpack_data(size_t offset, U u)
Unpacks a single primitive value into the vector data.
static constexpr size_t size
Number of elements in the vector.
constexpr vec()=default
Default constructor.
constexpr void reset() noexcept
Resets the vector to the zero vector.