From 7affd7960fa3e5af3c25e0e9ccfdda1f67e3a83d Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Sat, 25 Jul 2015 21:18:45 +0200 Subject: [PATCH] Allow casting to vectors of lower dimensions. --- include/vectorwrapper/vectorwrapper.hpp | 26 +++++++++++++++---------- include/vectorwrapper/vectorwrapper.inl | 2 +- test/unit/example.cpp | 11 +++++++++++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/include/vectorwrapper/vectorwrapper.hpp b/include/vectorwrapper/vectorwrapper.hpp index 437f917..5ecd234 100644 --- a/include/vectorwrapper/vectorwrapper.hpp +++ b/include/vectorwrapper/vectorwrapper.hpp @@ -71,22 +71,29 @@ namespace vwr { enum { value = get_offset_enum_from_index::value }; }; - template ::dimensions, std::size_t US=VectorWrapperInfo::dimensions> struct have_compat_offsets { - enum { value = false }; - }; - template struct have_compat_offsets { + template < + typename T, + typename U, + std::size_t S=( + static_cast(VectorWrapperInfo::dimensions) < static_cast(VectorWrapperInfo::dimensions) ? + static_cast(VectorWrapperInfo::dimensions) + : + static_cast(VectorWrapperInfo::dimensions) + ) + > struct have_compat_offsets; + template struct have_compat_offsets { enum { value = true }; }; - template struct have_compat_offsets { + template struct have_compat_offsets { enum { value = VectorWrapperInfo::offset_x - min_offset::value == VectorWrapperInfo::offset_x - min_offset::value and VectorWrapperInfo::offset_y - min_offset::value == VectorWrapperInfo::offset_y - min_offset::value }; }; - template struct have_compat_offsets { + template struct have_compat_offsets { enum { value = VectorWrapperInfo::offset_x - min_offset::value == VectorWrapperInfo::offset_x - min_offset::value and @@ -94,7 +101,7 @@ namespace vwr { VectorWrapperInfo::offset_z - min_offset::value == VectorWrapperInfo::offset_z - min_offset::value }; }; - template struct have_compat_offsets { + template struct have_compat_offsets { enum { value = VectorWrapperInfo::offset_x - min_offset::value == VectorWrapperInfo::offset_x - min_offset::value and @@ -108,9 +115,8 @@ namespace vwr { struct have_compat_layout { enum { value = - HasOffsetXEnum>::value and HasOffsetXEnum>::value and - static_cast(VectorWrapperInfo::dimensions) == - static_cast(VectorWrapperInfo::dimensions) and + HasOffsetXEnum>::value and + HasOffsetXEnum>::value and have_compat_offsets::value }; }; diff --git a/include/vectorwrapper/vectorwrapper.inl b/include/vectorwrapper/vectorwrapper.inl index 81b6363..a10ff5c 100644 --- a/include/vectorwrapper/vectorwrapper.inl +++ b/include/vectorwrapper/vectorwrapper.inl @@ -79,7 +79,7 @@ namespace vwr { //Assert that V2 won't stomp on part of V's data, unless the user //has explicitly said he doesn't care. - static_assert((sizeof(typename VectorWrapperInfo::vector_type>::scalar_type) * dimensions == sizeof(V2)) or + static_assert((sizeof(typename VectorWrapperInfo::vector_type>::scalar_type) * VectorWrapperInfo::vector_type>::dimensions == sizeof(V2)) or IsCastIgnoreTrailingPropertiesSet::vector_type>::value, "V2 must not have any properties past the last coordinate"); static_assert(alignof(typename VectorWrapperInfo::scalar_type) == alignof(V2), "Casting to V2 would give you a misaligned variable"); diff --git a/test/unit/example.cpp b/test/unit/example.cpp index faa7d13..0046d21 100644 --- a/test/unit/example.cpp +++ b/test/unit/example.cpp @@ -2,6 +2,11 @@ #include namespace { + void test_svec2 (const vwr::svec2& parVec, float parX, float parY) { + EXPECT_EQ(parVec.x(), parX); + EXPECT_EQ(parVec.y(), parY); + } + void simplevec_double (vwr::SimpleVector3& parVec, float parX, float parY, float parZ) { EXPECT_EQ(parVec.x, parX); EXPECT_EQ(parVec.y, parY); @@ -74,4 +79,10 @@ TEST(vwr, example) { svec3 vec_b(vec); EXPECT_EQ(vec_b, vec); } + + { + //You can also cast a svec3 to svec2, if you need to. + const svec3 vec(9.5f, 1.2f, 0.9f); + test_svec2(vec.cast(), vec.x(), vec.y()); + } }