6using size_t =
decltype(
sizeof(0));
7using ptrdiff_t =
decltype(
static_cast<int*
>(
nullptr) -
static_cast<int*
>(
nullptr));
9template <
class T>
using value = T;
15template <
class ReturnType>
18 template <
class... Args>
19 constexpr ReturnType
operator()(Args& ...args)
const {
return {args[
i]...}; }
20 template <
class... Args>
21 constexpr ReturnType
operator()(
const Args& ...args)
const {
return {args[
i]...}; }
24template <
class ReturnType>
26 template <
class... Args>
27 constexpr ReturnType
operator()(Args& ...args)
const {
return {&args...}; }
28 template <
class... Args>
29 constexpr ReturnType
operator()(
const Args& ...args)
const {
return {&args...}; }
32template <
class ReturnType>
34 template <
class... Args>
35 constexpr ReturnType
operator()(Args& ...args)
const {
return {args...}; }
36 template <
class... Args>
37 constexpr ReturnType
operator()(
const Args& ...args)
const {
return {args...}; }
41 template <
class T,
class... Args>
42 constexpr T&
operator()(T& t, Args& ...args)
const {
return t; }
43 template <
class T,
class... Args>
44 constexpr const T&
operator()(
const T& t,
const Args& ...args)
const {
return t; }
47template <
class ReturnType>
49 template <
class... Args>
50 constexpr ReturnType
operator()(Args& ...args)
const {
return {++args...}; }
53template <
class ReturnType>
55 template <
class... Args>
56 constexpr ReturnType
operator()(Args& ...args)
const {
return {--args...}; }
59template <
class ReturnType>
62 template <
class... Args>
63 constexpr ReturnType
operator()(
const Args& ...args)
const {
return {(args +
i)...}; }
67 template <
class Left,
class Right>
68 constexpr Left&
operator()(Left& left,
const Right& right)
const {
return left = right; }
74 template <
template <
class>
class>
class Struct,
75 template <class> class Container,
81 template <
template <
class>
class>
class Struct,
82 template <class> class Container
86 using Base = Container<Struct<value>>;
90 template <
template <
class>
class other_Container>
100template <
template <
template <
class>
class>
class Struct>
131 template <
template <
class>
class>
class Struct,
132 template <class> class Container
136 using Base = Struct<Container>;
141 template <
template <
class>
class other_Container>
143 template <
template <
class>
class other_Container>
153template <
template <
template <
class>
class>
class Struct>
163template <
template <
template <
class>
class>
class Struct>
165 using Base = Struct<reference>;
195template <
template <
template <
class>
class>
class Struct>
197 using Base = Struct<const_reference>;
208template <
template <
template <
class>
class>
class Struct>
237template <
template <
template <
class>
class>
class Struct>
239 using Base = Struct<const_pointer>;
265#define WRAPPER_APPLY_UNARY(...)\
266 template <class Function>\
267 constexpr auto apply(Function&& f) { return f(__VA_ARGS__); }\
268 template <class Function>\
269 constexpr auto apply(Function&& f) const { return f(__VA_ARGS__); }\
271#define WRAPPER_EXPAND(m) f(m, other.m)
273#define WRAPPER_APPLY_BINARY(STRUCT_NAME, ...)\
274 template <template <class> class other_Container, class Function>\
275 constexpr STRUCT_NAME apply(STRUCT_NAME<other_Container>& other, Function&& f) { return {__VA_ARGS__}; }\
276 template <template <class> class other_Container, class Function>\
277 constexpr STRUCT_NAME apply(STRUCT_NAME<other_Container>& other, Function&& f) const { return {__VA_ARGS__}; }\
278 template <template <class> class other_Container, class Function>\
279 constexpr STRUCT_NAME apply(const STRUCT_NAME<other_Container>& other, Function&& f) { return {__VA_ARGS__}; }\
280 template <template <class> class other_Container, class Function>\
281 constexpr STRUCT_NAME apply(const STRUCT_NAME<other_Container>& other, Function&& f) const { return {__VA_ARGS__}; }\
const T & const_reference
decltype(static_cast< int * >(nullptr) - static_cast< int * >(nullptr)) ptrdiff_t
decltype(sizeof(0)) size_t
constexpr ReturnType operator()(const Args &...args) const
constexpr ReturnType operator()(Args &...args) const
constexpr ReturnType operator()(const Args &...args) const
constexpr Left & operator()(Left &left, const Right &right) const
constexpr const T & operator()(const T &t, const Args &...args) const
constexpr T & operator()(T &t, Args &...args) const
constexpr ReturnType operator()(Args &...args) const
constexpr ReturnType operator()(const Args &...args) const
constexpr ReturnType operator()(Args &...args) const
constexpr ReturnType operator()(Args &...args) const
constexpr ReturnType operator()(const Args &...args) const
constexpr ReturnType operator()(Args &...args) const
constexpr Wrapper< Struct, const_reference > operator*(ptrdiff_t) const
Container< Struct< value > > Base
static constexpr Layout layout_type
constexpr Wrapper< Struct, reference > operator[](size_t i)
constexpr Wrapper()=default
constexpr Wrapper(Wrapper< Struct, other_Container, Layout::aos > &other)
constexpr Wrapper< Struct, reference > operator*()
constexpr Wrapper< Struct, reference > operator[](size_t i)
constexpr Wrapper< Struct, reference > operator*()
static constexpr Layout layout_type
constexpr Wrapper(const Struct< other_Container > &other)
constexpr Wrapper< Struct, const_reference > operator*(ptrdiff_t) const
constexpr Wrapper(Struct< other_Container > &other)
constexpr Wrapper(Base b)
constexpr Wrapper()=default
constexpr Wrapper< Struct, const_reference > operator*() const
constexpr Wrapper & operator+=(ptrdiff_t i)
constexpr bool operator!=(const Wrapper &other) const
constexpr Wrapper< Struct, const_reference > operator[](size_t i) const
Struct< const_pointer > Base
constexpr bool operator<(const Wrapper &other) const
constexpr Wrapper & operator--()
constexpr Wrapper & operator++()
constexpr bool operator==(const Wrapper &other) const
constexpr Wrapper operator+(ptrdiff_t i) const
constexpr Wrapper operator-(ptrdiff_t i) const
constexpr Wrapper(Base b)
constexpr Wrapper()=default
constexpr Wrapper(const Struct< pointer > &other)
constexpr Wrapper & operator-=(ptrdiff_t i)
constexpr Wrapper< Struct, const_reference > operator->() const
constexpr ptrdiff_t operator-(const Wrapper &other) const
Struct< const_reference > Base
constexpr Wrapper(const Struct< value > &other)
constexpr Wrapper(Base b)
constexpr Wrapper< Struct, const_pointer > operator&() const
constexpr const_pointer< Wrapper< Struct, const_reference > > operator->() const
constexpr Wrapper()=delete
constexpr Wrapper(const Struct< reference > &other)
constexpr Wrapper< Struct, reference > operator*()
constexpr Wrapper operator+(ptrdiff_t i) const
constexpr bool operator!=(const Wrapper &other) const
constexpr Wrapper operator-(ptrdiff_t i) const
constexpr Wrapper< Struct, const_reference > operator*(ptrdiff_t) const
constexpr Wrapper & operator++()
pointer< Struct< value > > Data
pointer< Struct< value > > data
constexpr Wrapper & operator-=(ptrdiff_t i)
constexpr bool operator==(const Wrapper &other) const
static constexpr Layout layout_type
constexpr bool operator<(const Wrapper &other) const
constexpr ptrdiff_t operator-(const Wrapper &other) const
constexpr Wrapper & operator--()
constexpr Wrapper & operator+=(ptrdiff_t i)
constexpr Wrapper & operator-=(ptrdiff_t i)
constexpr Wrapper< Struct, const_reference > operator->() const
constexpr Wrapper & operator+=(ptrdiff_t i)
constexpr Wrapper & operator++()
constexpr Wrapper< Struct, reference > operator*()
constexpr Wrapper< Struct, const_reference > operator*() const
constexpr Wrapper< Struct, reference > operator[](size_t i)
constexpr Wrapper operator-(ptrdiff_t i) const
constexpr Wrapper()=default
constexpr Wrapper(Base b)
constexpr Wrapper & operator--()
constexpr Wrapper operator+(ptrdiff_t i) const
constexpr ptrdiff_t operator-(const Wrapper &other) const
constexpr bool operator<(const Wrapper &other) const
constexpr bool operator==(const Wrapper &other) const
constexpr Wrapper< Struct, reference > operator->()
constexpr bool operator!=(const Wrapper &other) const
constexpr Wrapper(Struct< value > &other)
constexpr Wrapper()=delete
constexpr Wrapper & operator=(const Wrapper< Struct, const_reference > &other)
constexpr Wrapper(const Wrapper &other)=default
constexpr Wrapper & operator=(const Wrapper &other)
constexpr Wrapper & operator=(Wrapper &&other)
constexpr pointer< Wrapper< Struct, reference > > operator->()
constexpr Wrapper(Base b)
constexpr Wrapper & operator=(const Wrapper< Struct, value > &other)
constexpr Wrapper(Wrapper &&other)=default
constexpr Wrapper< Struct, pointer > operator&()
constexpr Wrapper(const Struct< reference > &other)
constexpr Wrapper(const Struct< const_reference > &other)
constexpr Wrapper()=default
constexpr Wrapper(Base b)