diff --git a/README.md b/README.md index 3619723..98311ec 100644 --- a/README.md +++ b/README.md @@ -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& v, T s); diff --git a/headers/vmath.hpp/vmath_fwd.hpp b/headers/vmath.hpp/vmath_fwd.hpp index e0ff237..6e80b56 100644 --- a/headers/vmath.hpp/vmath_fwd.hpp +++ b/headers/vmath.hpp/vmath_fwd.hpp @@ -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 diff --git a/headers/vmath.hpp/vmath_mat.hpp b/headers/vmath.hpp/vmath_mat.hpp index 4993d24..0d8a0b4 100644 --- a/headers/vmath.hpp/vmath_mat.hpp +++ b/headers/vmath.hpp/vmath_mat.hpp @@ -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}}, diff --git a/headers/vmath.hpp/vmath_qua.hpp b/headers/vmath.hpp/vmath_qua.hpp index 531ff09..e74a493 100644 --- a/headers/vmath.hpp/vmath_qua.hpp +++ b/headers/vmath.hpp/vmath_qua.hpp @@ -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} {} diff --git a/headers/vmath.hpp/vmath_vec.hpp b/headers/vmath.hpp/vmath_vec.hpp index b2f3042..f353a40 100644 --- a/headers/vmath.hpp/vmath_vec.hpp +++ b/headers/vmath.hpp/vmath_vec.hpp @@ -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} {} diff --git a/untests/vmath_mat_tests.cpp b/untests/vmath_mat_tests.cpp index 99b15c3..a40fd59 100644 --- a/untests/vmath_mat_tests.cpp +++ b/untests/vmath_mat_tests.cpp @@ -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)); diff --git a/untests/vmath_qua_tests.cpp b/untests/vmath_qua_tests.cpp index 99b20af..f6103ac 100644 --- a/untests/vmath_qua_tests.cpp +++ b/untests/vmath_qua_tests.cpp @@ -34,6 +34,11 @@ TEST_CASE("vmath/qua") { qua q; CHECK(q.v == int3(0,0,0)); CHECK(q.s == 1); + + STATIC_CHECK(qua() == qua({0,0,0},1)); + (void)qua(uninit); + STATIC_CHECK(qua(zero_init) == qua({0,0,0},0)); + STATIC_CHECK(qua(identity_init) == qua({0,0,0},1)); } { STATIC_CHECK(qfloat{}.v == uapprox3(0.f)); diff --git a/untests/vmath_vec_tests.cpp b/untests/vmath_vec_tests.cpp index 59785d8..4f41421 100644 --- a/untests/vmath_vec_tests.cpp +++ b/untests/vmath_vec_tests.cpp @@ -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);