#ifndef ZIPERZ_MATH_HPP
#define ZIPERZ_MATH_HPP
#include <algorithm>
#include <cstdint>
#include <cmath>
namespace zl
{
template <typename T, int32_t size>
class tvec
{
public:
static_assert(size >= 2 && size <= 4, "Vector class size MUST be one of these: 2, 3, 4");
constexpr tvec() { tvec(0); }
constexpr tvec(T a) { std::fill(&x, &x + size, a); }
constexpr tvec(std::initializer_list<T> list) {
if constexpr(list.size() == 1)
tvec(*list.begin())
else
for(int32_t i = 0; i < size; i++)
(&x)[i] = list.begin()[i];
}
if constexpr (size == 2)
constexpr tvec(T x, T y) : x(x), y(y) {}
if constexpr (size == 3)
constexpr tvec(T x, T y, T z) : x(x), y(y), z(z) {}
if constexpr (size == 4)
constexpr tvec(T x, T y, T z, T w) : x(x), y(y), z(z), w(w) {}
union { T x, r, s; };
union { T y, g, t; };
if constexpr (size >= 3)
union { T z, b, p; }
if constexpr (size >= 4)
union { T w, a, q; }
};
using vec2 = tvec<float, 2>;
using vec3 = tvec<float, 3>;
using vec4 = tvec<float, 4>;
}
#endif