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 {
|
template <typename V> struct is_vec {
|
||||||
enum { value = false };
|
enum { value = false };
|
||||||
};
|
};
|
||||||
|
@ -137,7 +176,8 @@ namespace vwr {
|
||||||
typedef typename VectorWrapperInfo<V>::scalar_type scalar_type;
|
typedef typename VectorWrapperInfo<V>::scalar_type scalar_type;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
dimensions = VectorWrapperInfo<V>::dimensions
|
dimensions = VectorWrapperInfo<V>::dimensions,
|
||||||
|
is_interleaved_mem = WrappedTypeLayoutInfo<V>::is_interleaved_mem
|
||||||
};
|
};
|
||||||
|
|
||||||
VecBase ( void ) = default;
|
VecBase ( void ) = default;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "vectorwrapper/vectorwrapper.hpp"
|
#include "vectorwrapper/vectorwrapper.hpp"
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <ciso646>
|
||||||
|
|
||||||
namespace vwr {
|
namespace vwr {
|
||||||
struct SimpleVector2 {
|
struct SimpleVector2 {
|
||||||
|
@ -185,6 +186,15 @@ namespace vwr {
|
||||||
static_assert(sizeof(ivec3) == sizeof(IntVector3), "Wrong size");
|
static_assert(sizeof(ivec3) == sizeof(IntVector3), "Wrong size");
|
||||||
static_assert(sizeof(mvec3) == sizeof(MixedDataVector3), "Wrong size");
|
static_assert(sizeof(mvec3) == sizeof(MixedDataVector3), "Wrong size");
|
||||||
static_assert(sizeof(pvec3) == sizeof(PaddedVector3), "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
|
//Vector Wrapper debug assertions
|
||||||
static_assert(not implem::HasOffsetXEnum<VectorWrapperInfo<float>>::value, "Should return false");
|
static_assert(not implem::HasOffsetXEnum<VectorWrapperInfo<float>>::value, "Should return false");
|
||||||
|
|
Loading…
Add table
Reference in a new issue