1#ifndef PHYTH_VECTOR_HPP
2#define PHYTH_VECTOR_HPP
15 template<std::
size_t N,
typename T>
18 static_assert(
N != 0,
"Does not support zero dimensional space");
24 template<
typename...
Args,
26 sizeof...(Args) ==
N &&
27 std::conjunction_v<std::is_convertible<Args, T>...>,
32 constexpr T &
At(
const size_t i) {
36 constexpr const T &
At(
const size_t i)
const {
52 other, std::make_index_sequence<N>{},
53 [](
const auto &
a,
const auto &
b) {
return a +
b; });
60 other, std::make_index_sequence<N>{},
61 [](
const auto &
a,
const auto &
b) {
return a -
b; });
67 std::make_index_sequence<N>{},
68 [](
const auto &
a) {
return -
a; });
72 typename = std::enable_if_t<!std::is_same_v<std::decay_t<U>,
Vector>> >
76 scalar, std::make_index_sequence<N>{},
77 [](
const auto &
a,
const auto &
s) {
return a *
s; });
84 scalar, std::make_index_sequence<N>{},
85 [](
const auto &
a,
const auto &
s) {
return a /
s; });
90 for (std::size_t
i = 0;
i <
N; ++
i)
97 for (std::size_t
i = 0;
i <
N; ++
i)
104 for (std::size_t
i = 0;
i <
N; ++
i)
111 for (std::size_t
i = 0;
i <
N; ++
i)
117 for (std::size_t
i = 0;
i <
N; ++
i)
124 return !(*
this ==
other);
130 for (std::size_t
i = 0;
i <
N; ++
i)
141 if (
len ==
decltype(
len){0}) {
142 throw std::runtime_error(
"Normalize the zero vector");
146 len, std::make_index_sequence<N>{},
147 [](
const auto &
a,
const auto &
l) {
return a /
l; });
154 for (std::size_t
i = 0;
i <
N; ++
i)
164 template<
typename UnitT>
172 for (std::size_t
i = 0;
i <
N; ++
i) {
173 if (
i > 0)
os <<
", ";
181 template<
typename ResultScalar,
typename U, std::size_t...
I,
typename F>
183 std::index_sequence<I...>,
F f)
const {
192 template<
typename ResultScalar,
typename U, std::size_t...
I,
typename F>
194 std::index_sequence<I...>,
F f)
const {
199 constexpr auto make_as(std::index_sequence<I...>)
const {
208 template<std::
size_t N,
typename QuantityT>
212 template<
typename VecT>
215 template<std::
size_t N,
typename T>
219 template<std::
size_t N,
typename T>
223 template<std::
size_t N,
typename T>
226 template<
typename T, std::size_t
N,
typename U,
227 typename = std::enable_if_t<!is_vector_of_n_v<N, T>> >
auto sqrt(Quantity< UnitT > q)
Square root of a quantity.
constexpr auto operator*(Quantity< U1 > a, Quantity< U2 > b)
Multiply two quantities.
constexpr bool is_vector_of_n_v
constexpr auto is_vector_v
constexpr Vector & operator/=(U scalar)
constexpr Vector & operator+=(const Vector< N, U > &other)
constexpr Vector()=default
constexpr Vector & operator*=(U scalar)
constexpr auto make_as(std::index_sequence< I... >) const
constexpr auto make_binary(const Vector< N, U > &other, std::index_sequence< I... >, F f) const
constexpr T & operator[](const size_t i)
constexpr bool operator==(const Vector &other) const
auto Project(const Vector< N, U > &other) const
friend std::ostream & operator<<(std::ostream &os, const Vector &v)
constexpr auto make_scalar(U scalar, std::index_sequence< I... >, F f) const
constexpr Vector & operator-=(const Vector< N, U > &other)
constexpr auto operator+(const Vector< N, U > &other) const
constexpr const T & operator[](const size_t i) const
constexpr bool operator!=(const Vector &other) const
auto LengthSquared() const
constexpr auto operator*(U scalar) const
constexpr Vector(Args... comps)
constexpr auto Dot(const Vector< N, U > &other) const
constexpr auto make_unary(std::index_sequence< I... >, F f) const
constexpr auto operator-() const
constexpr const T & At(const size_t i) const
constexpr auto operator/(U scalar) const
constexpr auto operator-(const Vector< N, U > &other) const
constexpr T & At(const size_t i)