vector and matrix deduction guides

This commit is contained in:
BlackMATov
2020-12-03 06:11:31 +07:00
parent 7acd53c085
commit dc05e543a4
4 changed files with 112 additions and 0 deletions

View File

@@ -230,6 +230,44 @@ namespace vmath_hpp
return rows[index];
}
};
}
namespace vmath_hpp
{
// mat2
template < typename T >
mat(T, T, T, T) -> mat<T, 2>;
template < typename T >
mat(const vec<T, 2>&, const vec<T, 2>&) -> mat<T, 2>;
template < typename T >
mat(std::initializer_list<T>, std::initializer_list<T>) -> mat<T, 2>;
// mat3
template < typename T >
mat(T, T, T, T, T, T, T, T, T) -> mat<T, 3>;
template < typename T >
mat(const vec<T, 3>&, const vec<T, 3>&, const vec<T, 3>&) -> mat<T, 3>;
template < typename T >
mat(std::initializer_list<T>, std::initializer_list<T>, std::initializer_list<T>) -> mat<T, 3>;
// mat4
template < typename T >
mat(T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T) -> mat<T, 4>;
template < typename T >
mat(const vec<T, 4>&, const vec<T, 4>&, const vec<T, 4>&, const vec<T, 4>&) -> mat<T, 4>;
template < typename T >
mat(std::initializer_list<T>, std::initializer_list<T>, std::initializer_list<T>, std::initializer_list<T>) -> mat<T, 4>;
// swap
template < typename T, std::size_t Size >
void swap(mat<T, Size>& l, mat<T, Size>& r) noexcept(noexcept(l.swap(r))) {

View File

@@ -189,6 +189,50 @@ namespace vmath_hpp
return (*this)[index];
}
};
}
namespace vmath_hpp
{
// vec2
template < typename T >
vec(T, T) -> vec<T, 2>;
// vec3
template < typename T >
vec(T, T, T) -> vec<T, 3>;
template < typename T >
vec(const vec<T, 2>&, T) -> vec<T, 3>;
template < typename T >
vec(T, const vec<T, 2>&) -> vec<T, 3>;
// vec4
template < typename T >
vec(T, T, T, T) -> vec<T, 4>;
template < typename T >
vec(const vec<T, 2>&, T, T) -> vec<T, 4>;
template < typename T >
vec(T, const vec<T, 2>&, T) -> vec<T, 4>;
template < typename T >
vec(T, T, const vec<T, 2>&) -> vec<T, 4>;
template < typename T >
vec(const vec<T, 2>&, const vec<T, 2>&) -> vec<T, 4>;
template < typename T >
vec(const vec<T, 3>&, T) -> vec<T, 4>;
template < typename T >
vec(T, const vec<T, 3>&) -> vec<T, 4>;
// swap
template < typename T, std::size_t Size >
void swap(vec<T, Size>& l, vec<T, Size>& r) noexcept(noexcept(l.swap(r))) {

View File

@@ -24,6 +24,20 @@ TEST_CASE("vmath/mat") {
STATIC_REQUIRE(sizeof(int4x4{}) == sizeof(int) * 4 * 4);
}
SUBCASE("guides") {
STATIC_REQUIRE(mat{1,2,3,4}.size == 2);
STATIC_REQUIRE(mat{{1,2},{3,4}}.size == 2);
STATIC_REQUIRE(mat{vec{1,2},vec{3,4}}.size == 2);
STATIC_REQUIRE(mat{1,2,3,4,5,6,7,8,9}.size == 3);
STATIC_REQUIRE(mat{{1,2,3},{4,5,6},{7,8,9}}.size == 3);
STATIC_REQUIRE(mat{vec{1,2,3},vec{4,5,6},vec{7,8,9}}.size == 3);
STATIC_REQUIRE(mat{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}.size == 4);
STATIC_REQUIRE(mat{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}.size == 4);
STATIC_REQUIRE(mat{vec{1,2,3,4},vec{5,6,7,8},vec{9,10,11,12},vec{13,14,15,16}}.size == 4);
}
SUBCASE("ctors") {
{
STATIC_REQUIRE(int2x2()[0] == int2(1,0));

View File

@@ -24,6 +24,22 @@ TEST_CASE("vmath/vec") {
STATIC_REQUIRE(sizeof(int4{}) == sizeof(int) * 4);
}
SUBCASE("guides") {
STATIC_REQUIRE(vec{1,2}.size == 2);
STATIC_REQUIRE(vec{1,2,3}.size == 3);
STATIC_REQUIRE(vec{{1,2},3}.size == 3);
STATIC_REQUIRE(vec{1,{2,3}}.size == 3);
STATIC_REQUIRE(vec{1,2,3,4}.size == 4);
STATIC_REQUIRE(vec{vec{1,2},3,4}.size == 4);
STATIC_REQUIRE(vec{1,vec{2,3},4}.size == 4);
STATIC_REQUIRE(vec{1,2,vec{3,4}}.size == 4);
STATIC_REQUIRE(vec{vec{1,2},vec{3,4}}.size == 4);
STATIC_REQUIRE(vec{vec{1,2,3},4}.size == 4);
STATIC_REQUIRE(vec{1,vec{2,3,4}}.size == 4);
}
SUBCASE("ctors") {
{
STATIC_REQUIRE(int2().x == 0);