From 2557b0af0f1128b6d2d102fe6009d57fe48584a5 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 25 Feb 2021 23:50:34 +0700 Subject: [PATCH] vector ctor conversions --- README.md | 11 +++-- headers/vmath.hpp/vmath_vec.hpp | 80 +++++++++++++-------------------- untests/vmath_vec_fun_tests.cpp | 32 +++++++++++++ 3 files changed, 71 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index fb84a16..ee561db 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,10 @@ public: explicit vec_base(T v); vec_base(T x, T y); + + template < typename A > vec_base(const vec_base& xy); + template < typename A > explicit vec_base(const vec_base& xy); + template < typename A > explicit vec_base(const vec_base& xy); }; template < typename T > @@ -114,7 +118,8 @@ public: vec_base(const vec_base& xy, T z); vec_base(T x, const vec_base& yz); - explicit operator vec() const; + template < typename A > vec_base(const vec_base& xyz); + template < typename A > explicit vec_base(const vec_base& xyz); }; template < typename T > @@ -133,15 +138,13 @@ public: vec_base(const vec_base& xy, T z, T w); vec_base(T x, const vec_base& yz, T w); - vec_base(T x, T y, const vec_base& zw); vec_base(const vec_base& xy, const vec_base& zw); vec_base(const vec_base& xyz, T w); vec_base(T x, const vec_base& yzw); - explicit operator vec() const; - explicit operator vec() const; + template < typename A > vec_base(const vec_base& xyzw); }; template < typename T, size_t Size > diff --git a/headers/vmath.hpp/vmath_vec.hpp b/headers/vmath.hpp/vmath_vec.hpp index 1829c66..fd37d60 100644 --- a/headers/vmath.hpp/vmath_vec.hpp +++ b/headers/vmath.hpp/vmath_vec.hpp @@ -22,14 +22,20 @@ namespace vmath_hpp::detail : vec_base{zero_init} {} constexpr vec_base(uninit_t) {} - constexpr vec_base(zero_init_t) : vec_base{T{0}} {} - constexpr vec_base(unit_init_t) : vec_base{T{1}} {} + constexpr vec_base(zero_init_t): vec_base{T{0}} {} + constexpr vec_base(unit_init_t): vec_base{T{1}} {} - constexpr explicit vec_base(T v) - : x{v}, y{v} {} + constexpr explicit vec_base(T v): x{v}, y{v} {} + constexpr vec_base(T x, T y): x{x}, y{y} {} - constexpr vec_base(T x, T y) - : x{x}, y{y} {} + template < typename A, std::enable_if_t, int> = 0 > + constexpr vec_base(const vec_base& xy): vec_base(xy[0], xy[1]) {} + + template < typename A, std::enable_if_t, int> = 0 > + constexpr explicit vec_base(const vec_base& xy): vec_base(xy[0], xy[1]) {} + + template < typename A, std::enable_if_t, int> = 0 > + constexpr explicit vec_base(const vec_base& xy): vec_base(xy[0], xy[1]) {} [[nodiscard]] constexpr T& operator[](std::size_t index) noexcept { switch ( index ) { @@ -57,24 +63,20 @@ namespace vmath_hpp::detail : vec_base{zero_init} {} constexpr vec_base(uninit_t) {} - constexpr vec_base(zero_init_t) : vec_base{T{0}} {} - constexpr vec_base(unit_init_t) : vec_base{T{1}} {} + constexpr vec_base(zero_init_t): vec_base{T{0}} {} + constexpr vec_base(unit_init_t): vec_base{T{1}} {} - constexpr explicit vec_base(T v) - : x{v}, y{v}, z{v} {} + constexpr explicit vec_base(T v): x{v}, y{v}, z{v} {} + constexpr vec_base(T x, T y, T z): x{x}, y{y}, z{z} {} - constexpr vec_base(T x, T y, T z) - : x{x}, y{y}, z{z} {} + constexpr vec_base(const vec_base& xy, T z): vec_base(xy[0], xy[1], z) {} + constexpr vec_base(T x, const vec_base& yz): vec_base(x, yz[0], yz[1]) {} - constexpr vec_base(const vec_base& xy, T z) - : x{xy[0]}, y{xy[1]}, z{z} {} + template < typename A, std::enable_if_t, int> = 0 > + constexpr vec_base(const vec_base& xyz): vec_base(xyz[0], xyz[1], xyz[2]) {} - constexpr vec_base(T x, const vec_base& yz) - : x{x}, y{yz[0]}, z{yz[1]} {} - - constexpr explicit operator vec() const { - return {x, y}; - } + template < typename A, std::enable_if_t, int> = 0 > + constexpr explicit vec_base(const vec_base& xyz): vec_base(xyz[0], xyz[1], xyz[2]) {} [[nodiscard]] constexpr T& operator[](std::size_t index) noexcept { switch ( index ) { @@ -107,37 +109,19 @@ namespace vmath_hpp::detail constexpr vec_base(zero_init_t) : vec_base{T{0}} {} constexpr vec_base(unit_init_t) : vec_base{T{1}} {} - constexpr explicit vec_base(T v) - : x{v}, y{v}, z{v}, w{v} {} + constexpr explicit vec_base(T v): x{v}, y{v}, z{v}, w{v} {} + constexpr vec_base(T x, T y, T z, T w): x{x}, y{y}, z{z}, w{w} {} - constexpr vec_base(T x, T y, T z, T w) - : x{x}, y{y}, z{z}, w{w} {} + constexpr vec_base(const vec_base& xy, T z, T w): vec_base(xy[0], xy[1], z, w) {} + constexpr vec_base(T x, const vec_base& yz, T w): vec_base(x, yz[0], yz[1], w) {} + constexpr vec_base(T x, T y, const vec_base& zw): vec_base(x, y, zw[0], zw[1]) {} + constexpr vec_base(const vec_base& xy, const vec_base& zw): vec_base(xy[0], xy[1], zw[0], zw[1]) {} - constexpr vec_base(const vec_base& xy, T z, T w) - : x{xy[0]}, y{xy[1]}, z{z}, w{w} {} + constexpr vec_base(const vec_base& xyz, T w): vec_base(xyz[0], xyz[1], xyz[2], w) {} + constexpr vec_base(T x, const vec_base& yzw): vec_base(x, yzw[0], yzw[1], yzw[2]) {} - constexpr vec_base(T x, const vec_base& yz, T w) - : x{x}, y{yz[0]}, z{yz[1]}, w{w} {} - - constexpr vec_base(T x, T y, const vec_base& zw) - : x{x}, y{y}, z{zw[0]}, w{zw[1]} {} - - constexpr vec_base(const vec_base& xy, const vec_base& zw) - : x{xy[0]}, y{xy[1]}, z{zw[0]}, w{zw[1]} {} - - constexpr vec_base(const vec_base& xyz, T w) - : x{xyz[0]}, y{xyz[1]}, z{xyz[2]}, w{w} {} - - constexpr vec_base(T x, const vec_base& yzw) - : x{x}, y{yzw[0]}, z{yzw[1]}, w{yzw[2]} {} - - constexpr explicit operator vec() const { - return {x, y}; - } - - constexpr explicit operator vec() const { - return {x, y, z}; - } + template < typename A, std::enable_if_t, int> = 0 > + constexpr vec_base(const vec_base& xyzw): vec_base(xyzw[0], xyzw[1], xyzw[2], xyzw[3]) {} [[nodiscard]] constexpr T& operator[](std::size_t index) noexcept { switch ( index ) { diff --git a/untests/vmath_vec_fun_tests.cpp b/untests/vmath_vec_fun_tests.cpp index b9eb76e..4752559 100644 --- a/untests/vmath_vec_fun_tests.cpp +++ b/untests/vmath_vec_fun_tests.cpp @@ -125,6 +125,38 @@ TEST_CASE("vmath/vec_fun") { STATIC_CHECK(float2{} / int2{1} == float2{}); } + SUBCASE("Conversions2") { + { + STATIC_CHECK(float2(1) == float2(1,1)); + STATIC_CHECK(float2(1,2.0) == float2(1,2)); + STATIC_CHECK(float2(int2(1,2)) == float2(1,2)); + STATIC_CHECK(float2(int3(1,2,3)) == float2(1,2)); + STATIC_CHECK(float2(int4(1,2,3,4)) == float2(1,2)); + } + { + STATIC_CHECK(float3(1) == float3(1,1,1)); + STATIC_CHECK(float3(1,2.0,3u) == float3(1,2,3)); + STATIC_CHECK(float3(int3(1,2,3)) == float3(1,2,3)); + STATIC_CHECK(float3(int4(1,2,3,4)) == float3(1,2,3)); + + STATIC_CHECK(float3(int2(1,2),3.0) == float3(1,2,3)); + STATIC_CHECK(float3(1.0,int2(2,3)) == float3(1,2,3)); + } + { + STATIC_CHECK(float4(1) == float4(1,1,1,1)); + STATIC_CHECK(float4(1,2.0,3u,4) == float4(1,2,3,4)); + STATIC_CHECK(float4(int4(1,2,3,4)) == float4(1,2,3,4)); + + STATIC_CHECK(float4(int2{1,2},3u,4.0) == float4(1,2,3,4)); + STATIC_CHECK(float4(1,int2{2,3},4.0) == float4(1,2,3,4)); + STATIC_CHECK(float4(1,2.f,int2{3,4}) == float4(1,2,3,4)); + STATIC_CHECK(float4(int2{1,2},float2{3,4}) == float4(1,2,3,4)); + + STATIC_CHECK(float4(int3{1,2,3},4.0) == float4(1,2,3,4)); + STATIC_CHECK(float4(1.0,int3{2,3,4}) == float4(1,2,3,4)); + } + } + SUBCASE("Angle and Trigonometric Functions") { STATIC_CHECK(radians(degrees(float2(12.13f))) == uapprox2(12.13f)); STATIC_CHECK(degrees(radians(float2(12.13f))) == uapprox2(12.13f));