add zero and identity ctors

This commit is contained in:
BlackMATov
2021-02-25 00:29:35 +07:00
parent 81e7a0996f
commit 9fc1e3e7ab
8 changed files with 102 additions and 10 deletions

View File

@@ -89,6 +89,7 @@ public:
vec_base();
explicit vec_base(uninit_t);
explicit vec_base(zero_init_t);
explicit vec_base(T v);
vec_base(T x, T y);
@@ -101,6 +102,7 @@ public:
vec_base();
explicit vec_base(uninit_t);
explicit vec_base(zero_init_t);
explicit vec_base(T v);
vec_base(T x, T y, T z);
@@ -117,6 +119,7 @@ public:
vec_base();
explicit vec_base(uninit_t);
explicit vec_base(zero_init_t);
explicit vec_base(T v);
vec_base(T x, T y, T z, T w);
@@ -221,6 +224,8 @@ public:
mat_base();
explicit mat_base(uninit_t);
explicit mat_base(zero_init_t);
explicit mat_base(identity_init_t);
explicit mat_base(T d);
explicit mat_base(const row_type& d);
@@ -242,6 +247,8 @@ public:
mat_base();
explicit mat_base(uninit_t);
explicit mat_base(zero_init_t);
explicit mat_base(identity_init_t);
explicit mat_base(T d);
explicit mat_base(const row_type& d);
@@ -273,6 +280,8 @@ public:
mat_base();
explicit mat_base(uninit_t);
explicit mat_base(zero_init_t);
explicit mat_base(identity_init_t);
explicit mat_base(T d);
explicit mat_base(const row_type& d);
@@ -389,6 +398,8 @@ public:
qua_base();
explicit qua_base(uninit_t);
explicit qua_base(zero_init_t);
explicit qua_base(identity_init_t);
qua_base(T vx, T vy, T vz, T s);
qua_base(const vec<T, 3>& v, T s);

View File

@@ -42,6 +42,12 @@ namespace vmath_hpp
{
struct uninit_t { explicit uninit_t() = default; };
inline constexpr uninit_t uninit{};
struct zero_init_t { explicit zero_init_t() = default; };
inline constexpr zero_init_t zero_init{};
struct identity_init_t { explicit identity_init_t() = default; };
inline constexpr identity_init_t identity_init{};
}
namespace vmath_hpp

View File

@@ -23,12 +23,20 @@ namespace vmath_hpp::detail
row_type rows[2];
public:
constexpr mat_base()
: mat_base(identity_init) {}
constexpr explicit mat_base(uninit_t) {}
constexpr explicit mat_base(zero_init_t)
: rows{
{T{0}, T{0}},
{T{0}, T{0}}} {}
constexpr explicit mat_base(identity_init_t)
: rows{
{T{1}, T{0}},
{T{0}, T{1}}} {}
constexpr explicit mat_base(uninit_t) {}
constexpr explicit mat_base(T d)
: rows{
{d, T{0}},
@@ -59,13 +67,22 @@ namespace vmath_hpp::detail
row_type rows[3];
public:
constexpr mat_base()
: mat_base(identity_init) {}
constexpr explicit mat_base(uninit_t) {}
constexpr explicit mat_base(zero_init_t)
: rows{
{T{0}, T{0}, T{0}},
{T{0}, T{0}, T{0}},
{T{0}, T{0}, T{0}}} {}
constexpr explicit mat_base(identity_init_t)
: rows{
{T{1}, T{0}, T{0}},
{T{0}, T{1}, T{0}},
{T{0}, T{0}, T{1}}} {}
constexpr explicit mat_base(uninit_t) {}
constexpr explicit mat_base(T d)
: rows{
{d, T{0}, T{0}},
@@ -122,14 +139,24 @@ namespace vmath_hpp::detail
row_type rows[4];
public:
constexpr mat_base()
: mat_base(identity_init) {}
constexpr explicit mat_base(uninit_t) {}
constexpr explicit mat_base(zero_init_t)
: rows{
{T{0}, T{0}, T{0}, T{0}},
{T{0}, T{0}, T{0}, T{0}},
{T{0}, T{0}, T{0}, T{0}},
{T{0}, T{0}, T{0}, T{0}}} {}
constexpr explicit mat_base(identity_init_t)
: rows{
{T{1}, T{0}, T{0}, T{0}},
{T{0}, T{1}, T{0}, T{0}},
{T{0}, T{0}, T{1}, T{0}},
{T{0}, T{0}, T{0}, T{1}}} {}
constexpr explicit mat_base(uninit_t) {}
constexpr explicit mat_base(T d)
: rows{
{d, T{0}, T{0}, T{0}},

View File

@@ -20,10 +20,16 @@ namespace vmath_hpp::detail
T s;
public:
constexpr qua_base()
: v{T{0}}, s{1} {}
: qua_base(identity_init) {}
constexpr explicit qua_base(uninit_t) {}
constexpr explicit qua_base(zero_init_t)
: v{T{0}}, s{0} {}
constexpr explicit qua_base(identity_init_t)
: v{T{0}}, s{1} {}
constexpr qua_base(T vx, T vy, T vz, T s)
: v{vx, vy, vz}, s{s} {}

View File

@@ -19,10 +19,13 @@ namespace vmath_hpp::detail
T x, y;
public:
constexpr vec_base()
: x{0}, y{0} {}
: vec_base(zero_init) {}
constexpr explicit vec_base(uninit_t) {}
constexpr explicit vec_base(zero_init_t)
: x{0}, y{0} {}
constexpr explicit vec_base(T v)
: x{v}, y{v} {}
@@ -52,10 +55,13 @@ namespace vmath_hpp::detail
T x, y, z;
public:
constexpr vec_base()
: x{0}, y{0}, z{0} {}
: vec_base(zero_init) {}
constexpr explicit vec_base(uninit_t) {}
constexpr explicit vec_base(zero_init_t)
: x{0}, y{0}, z{0} {}
constexpr explicit vec_base(T v)
: x{v}, y{v}, z{v} {}
@@ -97,10 +103,13 @@ namespace vmath_hpp::detail
T x, y, z, w;
public:
constexpr vec_base()
: x{0}, y{0}, z{0}, w{0} {}
: vec_base(zero_init) {}
constexpr explicit vec_base(uninit_t) {}
constexpr explicit vec_base(zero_init_t)
: x{0}, y{0}, z{0}, w{0} {}
constexpr explicit vec_base(T v)
: x{v}, y{v}, z{v}, w{v} {}

View File

@@ -55,6 +55,22 @@ TEST_CASE("vmath/mat") {
CHECK(m4.rows[1] == int4(0,1,0,0));
CHECK(m4.rows[2] == int4(0,0,1,0));
CHECK(m4.rows[3] == int4(0,0,0,1));
STATIC_CHECK(int2x2() == int2x2({1,0},{0,1}));
STATIC_CHECK(int3x3() == int3x3({1,0,0},{0,1,0},{0,0,1}));
STATIC_CHECK(int4x4() == int4x4({1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}));
(void)int2x2(uninit);
(void)int3x3(uninit);
(void)int4x4(uninit);
STATIC_CHECK(int2x2(zero_init) == int2x2({0,0},{0,0}));
STATIC_CHECK(int3x3(zero_init) == int3x3({0,0,0},{0,0,0},{0,0,0}));
STATIC_CHECK(int4x4(zero_init) == int4x4({0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}));
STATIC_CHECK(int2x2(identity_init) == int2x2({1,0},{0,1}));
STATIC_CHECK(int3x3(identity_init) == int3x3({1,0,0},{0,1,0},{0,0,1}));
STATIC_CHECK(int4x4(identity_init) == int4x4({1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}));
}
{
STATIC_CHECK(int2x2()[0] == int2(1,0));

View File

@@ -34,6 +34,11 @@ TEST_CASE("vmath/qua") {
qua<int> q;
CHECK(q.v == int3(0,0,0));
CHECK(q.s == 1);
STATIC_CHECK(qua<int>() == qua<int>({0,0,0},1));
(void)qua<int>(uninit);
STATIC_CHECK(qua<int>(zero_init) == qua<int>({0,0,0},0));
STATIC_CHECK(qua<int>(identity_init) == qua<int>({0,0,0},1));
}
{
STATIC_CHECK(qfloat{}.v == uapprox3(0.f));

View File

@@ -55,6 +55,18 @@ TEST_CASE("vmath/vec") {
CHECK(i4.y == 0);
CHECK(i4.z == 0);
CHECK(i4.w == 0);
STATIC_CHECK(int2() == int2(0,0));
STATIC_CHECK(int3() == int3(0,0,0));
STATIC_CHECK(int4() == int4(0,0,0,0));
(void)int2(uninit);
(void)int3(uninit);
(void)int4(uninit);
STATIC_CHECK(int2(zero_init) == int2(0,0));
STATIC_CHECK(int3(zero_init) == int3(0,0,0));
STATIC_CHECK(int4(zero_init) == int4(0,0,0,0));
}
{
STATIC_CHECK(int2().x == 0);