Add info on if vector is packed or interleaved
This commit is contained in:
parent
42e8738edc
commit
f23f6d4583
2 changed files with 51 additions and 1 deletions
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Reference in a new issue