Allow casting to vectors of lower dimensions.
This commit is contained in:
parent
fe03f45f76
commit
7affd7960f
|
@ -71,22 +71,29 @@ namespace vwr {
|
||||||
enum { value = get_offset_enum_from_index<T, 0>::value };
|
enum { value = get_offset_enum_from_index<T, 0>::value };
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename U, std::size_t TS=VectorWrapperInfo<T>::dimensions, std::size_t US=VectorWrapperInfo<U>::dimensions> struct have_compat_offsets {
|
template <
|
||||||
enum { value = false };
|
typename T,
|
||||||
};
|
typename U,
|
||||||
template <typename T, typename U> struct have_compat_offsets<T, U, 1, 1> {
|
std::size_t S=(
|
||||||
|
static_cast<int>(VectorWrapperInfo<T>::dimensions) < static_cast<int>(VectorWrapperInfo<U>::dimensions) ?
|
||||||
|
static_cast<int>(VectorWrapperInfo<T>::dimensions)
|
||||||
|
:
|
||||||
|
static_cast<int>(VectorWrapperInfo<U>::dimensions)
|
||||||
|
)
|
||||||
|
> struct have_compat_offsets;
|
||||||
|
template <typename T, typename U> struct have_compat_offsets<T, U, 1> {
|
||||||
enum {
|
enum {
|
||||||
value = true
|
value = true
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
template <typename T, typename U> struct have_compat_offsets<T, U, 2, 2> {
|
template <typename T, typename U> struct have_compat_offsets<T, U, 2> {
|
||||||
enum {
|
enum {
|
||||||
value =
|
value =
|
||||||
VectorWrapperInfo<T>::offset_x - min_offset<T>::value == VectorWrapperInfo<U>::offset_x - min_offset<U>::value and
|
VectorWrapperInfo<T>::offset_x - min_offset<T>::value == VectorWrapperInfo<U>::offset_x - min_offset<U>::value and
|
||||||
VectorWrapperInfo<T>::offset_y - min_offset<T>::value == VectorWrapperInfo<U>::offset_y - min_offset<U>::value
|
VectorWrapperInfo<T>::offset_y - min_offset<T>::value == VectorWrapperInfo<U>::offset_y - min_offset<U>::value
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
template <typename T, typename U> struct have_compat_offsets<T, U, 3, 3> {
|
template <typename T, typename U> struct have_compat_offsets<T, U, 3> {
|
||||||
enum {
|
enum {
|
||||||
value =
|
value =
|
||||||
VectorWrapperInfo<T>::offset_x - min_offset<T>::value == VectorWrapperInfo<U>::offset_x - min_offset<U>::value and
|
VectorWrapperInfo<T>::offset_x - min_offset<T>::value == VectorWrapperInfo<U>::offset_x - min_offset<U>::value and
|
||||||
|
@ -94,7 +101,7 @@ namespace vwr {
|
||||||
VectorWrapperInfo<T>::offset_z - min_offset<T>::value == VectorWrapperInfo<U>::offset_z - min_offset<U>::value
|
VectorWrapperInfo<T>::offset_z - min_offset<T>::value == VectorWrapperInfo<U>::offset_z - min_offset<U>::value
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
template <typename T, typename U> struct have_compat_offsets<T, U, 4, 4> {
|
template <typename T, typename U> struct have_compat_offsets<T, U, 4> {
|
||||||
enum {
|
enum {
|
||||||
value =
|
value =
|
||||||
VectorWrapperInfo<T>::offset_x - min_offset<T>::value == VectorWrapperInfo<U>::offset_x - min_offset<U>::value and
|
VectorWrapperInfo<T>::offset_x - min_offset<T>::value == VectorWrapperInfo<U>::offset_x - min_offset<U>::value and
|
||||||
|
@ -108,9 +115,8 @@ namespace vwr {
|
||||||
struct have_compat_layout {
|
struct have_compat_layout {
|
||||||
enum {
|
enum {
|
||||||
value =
|
value =
|
||||||
HasOffsetXEnum<VectorWrapperInfo<T>>::value and HasOffsetXEnum<VectorWrapperInfo<U>>::value and
|
HasOffsetXEnum<VectorWrapperInfo<T>>::value and
|
||||||
static_cast<int>(VectorWrapperInfo<T>::dimensions) ==
|
HasOffsetXEnum<VectorWrapperInfo<U>>::value and
|
||||||
static_cast<int>(VectorWrapperInfo<U>::dimensions) and
|
|
||||||
have_compat_offsets<T, U>::value
|
have_compat_offsets<T, U>::value
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -79,7 +79,7 @@ namespace vwr {
|
||||||
|
|
||||||
//Assert that V2 won't stomp on part of V's data, unless the user
|
//Assert that V2 won't stomp on part of V's data, unless the user
|
||||||
//has explicitly said he doesn't care.
|
//has explicitly said he doesn't care.
|
||||||
static_assert((sizeof(typename VectorWrapperInfo<typename is_vec<V2>::vector_type>::scalar_type) * dimensions == sizeof(V2)) or
|
static_assert((sizeof(typename VectorWrapperInfo<typename is_vec<V2>::vector_type>::scalar_type) * VectorWrapperInfo<typename is_vec<V2>::vector_type>::dimensions == sizeof(V2)) or
|
||||||
IsCastIgnoreTrailingPropertiesSet<typename is_vec<V2>::vector_type>::value,
|
IsCastIgnoreTrailingPropertiesSet<typename is_vec<V2>::vector_type>::value,
|
||||||
"V2 must not have any properties past the last coordinate");
|
"V2 must not have any properties past the last coordinate");
|
||||||
static_assert(alignof(typename VectorWrapperInfo<V>::scalar_type) == alignof(V2), "Casting to V2 would give you a misaligned variable");
|
static_assert(alignof(typename VectorWrapperInfo<V>::scalar_type) == alignof(V2), "Casting to V2 would give you a misaligned variable");
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
namespace {
|
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) {
|
void simplevec_double (vwr::SimpleVector3& parVec, float parX, float parY, float parZ) {
|
||||||
EXPECT_EQ(parVec.x, parX);
|
EXPECT_EQ(parVec.x, parX);
|
||||||
EXPECT_EQ(parVec.y, parY);
|
EXPECT_EQ(parVec.y, parY);
|
||||||
|
@ -74,4 +79,10 @@ TEST(vwr, example) {
|
||||||
svec3 vec_b(vec);
|
svec3 vec_b(vec);
|
||||||
EXPECT_EQ(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<svec2>(), vec.x(), vec.y());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue