From f23f6d4583fbcdd8e8ff094c199f3dc0b739bfd0 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Mon, 19 Sep 2016 03:18:55 +0200 Subject: [PATCH] Add info on if vector is packed or interleaved --- include/vectorwrapper/vectorwrapper.hpp | 42 ++++++++++++++++++++++++- test/unit/sample_vectors.hpp | 10 ++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/vectorwrapper/vectorwrapper.hpp b/include/vectorwrapper/vectorwrapper.hpp index 6293990..0fb0a6f 100644 --- a/include/vectorwrapper/vectorwrapper.hpp +++ b/include/vectorwrapper/vectorwrapper.hpp @@ -121,6 +121,45 @@ namespace vwr { }; }; + template + struct Sum { + enum { + value = A + Sum::value + }; + }; + template + struct Sum { + enum { + value = A + }; + }; + + template + struct IsInterleavedMemory; + template + struct IsInterleavedMemory> { + enum { + value = Sum<( + get_offset_enum_from_index::value == I * sizeof(typename VectorWrapperInfo::scalar_type) + get_offset_enum_from_index::value ? 0 : 1 + )...>::value + }; + }; + + template >::value> + struct WrappedTypeLayoutInfo; + template + struct WrappedTypeLayoutInfo { + enum { + is_interleaved_mem = (IsInterleavedMemory::dimensions>>::value ? 1 : 0) + }; + }; + template + struct WrappedTypeLayoutInfo { + enum { + is_interleaved_mem = 2 + }; + }; + template struct is_vec { enum { value = false }; }; @@ -137,7 +176,8 @@ namespace vwr { typedef typename VectorWrapperInfo::scalar_type scalar_type; enum { - dimensions = VectorWrapperInfo::dimensions + dimensions = VectorWrapperInfo::dimensions, + is_interleaved_mem = WrappedTypeLayoutInfo::is_interleaved_mem }; VecBase ( void ) = default; diff --git a/test/unit/sample_vectors.hpp b/test/unit/sample_vectors.hpp index defc683..a5f9d85 100644 --- a/test/unit/sample_vectors.hpp +++ b/test/unit/sample_vectors.hpp @@ -4,6 +4,7 @@ #include "vectorwrapper/vectorwrapper.hpp" #include #include +#include namespace vwr { struct SimpleVector2 { @@ -185,6 +186,15 @@ namespace vwr { static_assert(sizeof(ivec3) == sizeof(IntVector3), "Wrong size"); static_assert(sizeof(mvec3) == sizeof(MixedDataVector3), "Wrong size"); static_assert(sizeof(pvec3) == sizeof(PaddedVector3), "Wrong size"); + static_assert(svec1::is_interleaved_mem == 2, "Maybe interleaved data was expected"); + static_assert(svec2::is_interleaved_mem == 0, "Non-interleaved data was expected"); + static_assert(svec3::is_interleaved_mem == 0, "Non-interleaved data was expected"); + static_assert(ivec1::is_interleaved_mem == 0, "Non-interleaved data was expected"); + static_assert(ivec2::is_interleaved_mem == 0, "Non-interleaved data was expected"); + static_assert(ivec3::is_interleaved_mem == 0, "Non-interleaved data was expected"); + static_assert(mvec3::is_interleaved_mem == 1, "Interleaved data was expected"); + static_assert(pvec3::is_interleaved_mem == 0, "Interleaved data was expected"); + static_assert(tvec3::is_interleaved_mem == 0, "Non-interleaved data was expected"); //Vector Wrapper debug assertions static_assert(not implem::HasOffsetXEnum>::value, "Should return false");