Support 0-dimensional vectors
This commit is contained in:
parent
c525383a42
commit
d891d21ec2
1 changed files with 38 additions and 1 deletions
|
|
@ -3,11 +3,33 @@
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <stdexcept>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
namespace psemek::geom
|
namespace psemek::geom
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
struct empty_array_helper
|
||||||
|
{
|
||||||
|
using type = T[N];
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct empty_array_helper<T, 0>
|
||||||
|
{
|
||||||
|
struct type
|
||||||
|
{
|
||||||
|
T const & operator[](std::size_t) const { throw std::runtime_error("Attempt to index a zero vector"); }
|
||||||
|
T & operator[](std::size_t) { throw std::runtime_error("Attempt to index a zero vector"); }
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
struct vector
|
struct vector
|
||||||
{
|
{
|
||||||
|
|
@ -15,7 +37,7 @@ namespace psemek::geom
|
||||||
|
|
||||||
using scalar_type = T;
|
using scalar_type = T;
|
||||||
|
|
||||||
T coords[N];
|
detail::empty_array_helper<T, N>::type coords;
|
||||||
|
|
||||||
vector() = default;
|
vector() = default;
|
||||||
vector(vector const &) = default;
|
vector(vector const &) = default;
|
||||||
|
|
@ -295,6 +317,15 @@ namespace psemek::geom
|
||||||
return ort(v0, v1);
|
return ort(v0, v1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
vector<T, N> pointwise_mult(vector<T, N> const & v0, vector<T, N> const & v1)
|
||||||
|
{
|
||||||
|
vector<T, N> result;
|
||||||
|
for (std::size_t i = 0; i < N; ++i)
|
||||||
|
result[i] = v0[i] * v1[i];
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
vector<T, N> lerp(vector<T, N> const & v0, vector<T, N> const & v1, T const & t)
|
vector<T, N> lerp(vector<T, N> const & v0, vector<T, N> const & v1, T const & t)
|
||||||
{
|
{
|
||||||
|
|
@ -327,6 +358,12 @@ namespace psemek::geom
|
||||||
template <typename Stream, typename T, std::size_t N>
|
template <typename Stream, typename T, std::size_t N>
|
||||||
Stream & operator << (Stream & os, vector<T, N> const & v)
|
Stream & operator << (Stream & os, vector<T, N> const & v)
|
||||||
{
|
{
|
||||||
|
if constexpr (N == 0)
|
||||||
|
{
|
||||||
|
os << "()";
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
os << '(' << v[0];
|
os << '(' << v[0];
|
||||||
for (std::size_t i = 1; i < N; ++i)
|
for (std::size_t i = 1; i < N; ++i)
|
||||||
os << ", " << v[i];
|
os << ", " << v[i];
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue