Add info on if vector is packed or interleaved

This commit is contained in:
King_DuckZ 2016-09-19 03:18:55 +02:00
parent 42e8738edc
commit f23f6d4583
2 changed files with 51 additions and 1 deletions

View File

@ -121,6 +121,45 @@ namespace vwr {
};
};
template <std::size_t A, std::size_t... Others>
struct Sum {
enum {
value = A + Sum<Others...>::value
};
};
template <std::size_t A>
struct Sum<A> {
enum {
value = A
};
};
template <typename T, typename Seq>
struct IsInterleavedMemory;
template <typename T, std::size_t... I>
struct IsInterleavedMemory<T, bt::index_seq<I...>> {
enum {
value = Sum<(
get_offset_enum_from_index<T, I>::value == I * sizeof(typename VectorWrapperInfo<T>::scalar_type) + get_offset_enum_from_index<T, 0>::value ? 0 : 1
)...>::value
};
};
template <typename T, bool RawDataAccess=HasOffsetXEnum<VectorWrapperInfo<T>>::value>
struct WrappedTypeLayoutInfo;
template <typename T>
struct WrappedTypeLayoutInfo<T, true> {
enum {
is_interleaved_mem = (IsInterleavedMemory<T, bt::index_range<0, VectorWrapperInfo<T>::dimensions>>::value ? 1 : 0)
};
};
template <typename T>
struct WrappedTypeLayoutInfo<T, false> {
enum {
is_interleaved_mem = 2
};
};
template <typename V> struct is_vec {
enum { value = false };
};
@ -137,7 +176,8 @@ namespace vwr {
typedef typename VectorWrapperInfo<V>::scalar_type scalar_type;
enum {
dimensions = VectorWrapperInfo<V>::dimensions
dimensions = VectorWrapperInfo<V>::dimensions,
is_interleaved_mem = WrappedTypeLayoutInfo<V>::is_interleaved_mem
};
VecBase ( void ) = default;

View File

@ -4,6 +4,7 @@
#include "vectorwrapper/vectorwrapper.hpp"
#include <cstdint>
#include <cstddef>
#include <ciso646>
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<VectorWrapperInfo<float>>::value, "Should return false");