Support 0-dimensional vectors

This commit is contained in:
Nikita Lisitsa 2021-01-15 17:58:20 +03:00
parent c525383a42
commit d891d21ec2

View file

@ -3,11 +3,33 @@
#include <cstddef>
#include <utility>
#include <type_traits>
#include <stdexcept>
#include <cmath>
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>
struct vector
{
@ -15,7 +37,7 @@ namespace psemek::geom
using scalar_type = T;
T coords[N];
detail::empty_array_helper<T, N>::type coords;
vector() = default;
vector(vector const &) = default;
@ -295,6 +317,15 @@ namespace psemek::geom
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>
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>
Stream & operator << (Stream & os, vector<T, N> const & v)
{
if constexpr (N == 0)
{
os << "()";
return os;
}
os << '(' << v[0];
for (std::size_t i = 1; i < N; ++i)
os << ", " << v[i];