@@ -23,53 +23,15 @@ template <class T> using const_pointer_restrict = const T* GPUrestrict();
2323
2424enum Flag { soa, aos };
2525
26+ // The types S<value>, S<reference>, and S<const_reference> need to be aggregate constructible
2627template <template <template <class > class > class S , template <class > class F , Flag L>
2728struct wrapper ;
2829
2930template <template <template <class > class > class S , template <class > class F >
30- struct wrapper <S, F, Flag::aos> : public F<S<value>> {
31- using Base = F<S<value>>;
32-
33- template <template <class > class F_out >
34- constexpr operator wrapper<S, F_out, Flag::aos>() { return {*static_cast <Base*>(this )}; };
35-
36- template <template <class > class F_out >
37- constexpr operator wrapper<S, F_out, Flag::aos>() const { return {*static_cast <const Base*>(this )}; };
31+ struct wrapper <S, F, Flag::aos> { using type = F<S<value>>; };
3832
39- constexpr S<reference> operator [](size_t i) {
40- return static_cast <Base*>(this )->operator [](i);
41- }
42-
43- constexpr S<const_reference> operator [](size_t i) const {
44- return static_cast <const Base*>(this )->operator [](i);
45- }
46- };
47-
48- template <template <template <class > class > class S , template <class > class F >
49- using AoS = wrapper<S, F, Flag::aos>;
50-
51- // The types S<value>, S<reference>, and S<const_reference> need to be aggregate constructible
5233template <template <template <class > class > class S , template <class > class F >
53- struct wrapper <S, F, Flag::soa> : public S<F> {
54- using Base = S<F>;
55-
56- template <template <class > class F_out >
57- constexpr operator wrapper<S, F_out, Flag::soa>() { return {*this }; };
58-
59- template <template <class > class F_out >
60- constexpr operator wrapper<S, F_out, Flag::soa>() const { return {*this }; };
61-
62- constexpr S<reference> operator [](size_t i) {
63- return static_cast <Base*>(this )->operator [](i);
64- }
65-
66- constexpr S<const_reference> operator [](size_t i) const {
67- return static_cast <const Base*>(this )->operator [](i);
68- }
69- };
70-
71- template <template <template <class > class > class S , template <class > class F >
72- using SoA = wrapper<S, F, Flag::soa>;
34+ struct wrapper <S, F, Flag::soa> { using type = S<F>; };
7335
7436namespace type_traits {
7537
@@ -92,6 +54,9 @@ struct true_type {
9254 constexpr operator bool () const noexcept { return value; }
9355};
9456
57+ template <class T >
58+ struct always_false : false_type {};
59+
9560template <class T , class U >
9661struct is_same : false_type {};
9762
@@ -143,11 +108,11 @@ constexpr S<F_out> eval_at(size_t i, const Args& ...args) { return {(args[i])...
143108
144109#define MEMLAYOUT_MEMBERFUNCTIONS (STRUCT , CONTAINER , ...) \
145110 template <template <class > class F_out > \
146- constexpr operator STRUCT <F_out>() { return { __VA_ARGS__ }; } \
111+ constexpr operator STRUCT <F_out>() { return { __VA_ARGS__ }; } \
147112 template <template <class > class F_out > \
148- constexpr operator STRUCT <F_out>() const { return { __VA_ARGS__ }; } \
113+ constexpr operator STRUCT <F_out>() const { return { __VA_ARGS__ }; } \
149114 template <class T = int , class R = MemLayout::disable_if_scalar<CONTAINER <T>>> \
150- constexpr STRUCT <MemLayout::reference> operator [] (MemLayout::size_t i) { \
115+ constexpr STRUCT <MemLayout::reference> operator [] (MemLayout::size_t i) { \
151116 return MemLayout::eval_at<STRUCT , MemLayout::reference>(i, __VA_ARGS__); \
152117 } \
153118 template <class T = int , class R = MemLayout::disable_if_scalar<CONTAINER <T>>> \
0 commit comments