File indexing completed on 2025-12-16 09:56:14
0001 #ifndef BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED
0002 #define BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <boost/mp11/detail/config.hpp>
0012 #include <boost/mp11/detail/mp_defer.hpp>
0013 #include <boost/mp11/detail/mp_rename.hpp>
0014 #include <boost/mp11/detail/mp_list.hpp>
0015
0016 namespace boost
0017 {
0018 namespace mp11
0019 {
0020
0021
0022 namespace detail
0023 {
0024
0025 template<class L, class V, template<class...> class F> struct mp_fold_impl
0026 {
0027
0028 };
0029
0030 #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 )
0031
0032 template<template<class...> class L, class... T, class V, template<class...> class F> struct mp_fold_impl<L<T...>, V, F>
0033 {
0034 static_assert( sizeof...(T) == 0, "T... must be empty" );
0035 using type = V;
0036 };
0037
0038 #else
0039
0040 template<template<class...> class L, class V, template<class...> class F> struct mp_fold_impl<L<>, V, F>
0041 {
0042 using type = V;
0043 };
0044
0045 #endif
0046
0047
0048
0049 template<class V, template<class...> class F> struct mp_fold_Q1
0050 {
0051 template<class T1>
0052 using fn = F<V, T1>;
0053 };
0054
0055 template<class V, template<class...> class F> struct mp_fold_Q2
0056 {
0057 template<class T1, class T2>
0058 using fn = F<F<V, T1>, T2>;
0059 };
0060
0061 template<class V, template<class...> class F> struct mp_fold_Q3
0062 {
0063 template<class T1, class T2, class T3>
0064 using fn = F<F<F<V, T1>, T2>, T3>;
0065 };
0066
0067 template<class V, template<class...> class F> struct mp_fold_Q4
0068 {
0069 template<class T1, class T2, class T3, class T4>
0070 using fn = F<F<F<F<V, T1>, T2>, T3>, T4>;
0071 };
0072
0073 template<class V, template<class...> class F> struct mp_fold_Q5
0074 {
0075 template<class T1, class T2, class T3, class T4, class T5>
0076 using fn = F<F<F<F<F<V, T1>, T2>, T3>, T4>, T5>;
0077 };
0078
0079 template<class V, template<class...> class F> struct mp_fold_Q6
0080 {
0081 template<class T1, class T2, class T3, class T4, class T5, class T6>
0082 using fn = F<F<F<F<F<F<V, T1>, T2>, T3>, T4>, T5>, T6>;
0083 };
0084
0085 template<class V, template<class...> class F> struct mp_fold_Q7
0086 {
0087 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
0088 using fn = F<F<F<F<F<F<F<V, T1>, T2>, T3>, T4>, T5>, T6>, T7>;
0089 };
0090
0091 template<class V, template<class...> class F> struct mp_fold_Q8
0092 {
0093 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
0094 using fn = F<F<F<F<F<F<F<F<V, T1>, T2>, T3>, T4>, T5>, T6>, T7>, T8>;
0095 };
0096
0097 template<class V, template<class...> class F> struct mp_fold_Q9
0098 {
0099 template<class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
0100 using fn = F<F<F<F<F<F<F<F<F<V, T1>, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>;
0101 };
0102
0103
0104
0105 template<template<class...> class L, class T1, class V, template<class...> class F>
0106 struct mp_fold_impl<L<T1>, V, F>: mp_defer<mp_fold_Q1<V, F>::template fn, T1>
0107 {
0108 };
0109
0110 template<template<class...> class L, class T1, class T2, class V, template<class...> class F>
0111 struct mp_fold_impl<L<T1, T2>, V, F>: mp_defer<mp_fold_Q2<V, F>::template fn, T1, T2>
0112 {
0113 };
0114
0115 template<template<class...> class L, class T1, class T2, class T3, class V, template<class...> class F>
0116 struct mp_fold_impl<L<T1, T2, T3>, V, F>: mp_defer<mp_fold_Q3<V, F>::template fn, T1, T2, T3>
0117 {
0118 };
0119
0120 template<template<class...> class L, class T1, class T2, class T3, class T4, class V, template<class...> class F>
0121 struct mp_fold_impl<L<T1, T2, T3, T4>, V, F>: mp_defer<mp_fold_Q4<V, F>::template fn, T1, T2, T3, T4>
0122 {
0123 };
0124
0125 template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class V, template<class...> class F>
0126 struct mp_fold_impl<L<T1, T2, T3, T4, T5>, V, F>: mp_defer<mp_fold_Q5<V, F>::template fn, T1, T2, T3, T4, T5>
0127 {
0128 };
0129
0130 template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class V, template<class...> class F>
0131 struct mp_fold_impl<L<T1, T2, T3, T4, T5, T6>, V, F>: mp_defer<mp_fold_Q6<V, F>::template fn, T1, T2, T3, T4, T5, T6>
0132 {
0133 };
0134
0135 template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class V, template<class...> class F>
0136 struct mp_fold_impl<L<T1, T2, T3, T4, T5, T6, T7>, V, F>: mp_defer<mp_fold_Q7<V, F>::template fn, T1, T2, T3, T4, T5, T6, T7>
0137 {
0138 };
0139
0140 template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class V, template<class...> class F>
0141 struct mp_fold_impl<L<T1, T2, T3, T4, T5, T6, T7, T8>, V, F>: mp_defer<mp_fold_Q8<V, F>::template fn, T1, T2, T3, T4, T5, T6, T7, T8>
0142 {
0143 };
0144
0145 template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class V, template<class...> class F>
0146 struct mp_fold_impl<L<T1, T2, T3, T4, T5, T6, T7, T8, T9>, V, F>: mp_defer<mp_fold_Q9<V, F>::template fn, T1, T2, T3, T4, T5, T6, T7, T8, T9>
0147 {
0148 };
0149
0150
0151
0152 template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template<class...> class F>
0153 struct mp_fold_impl<L<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T...>, V, F>
0154 {
0155 using type = typename mp_fold_impl<L<T...>, F<F<F<F<F<F<F<F<F<F<V, T1>, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>, T10>, F>::type;
0156 };
0157
0158 }
0159
0160 template<class L, class V, template<class...> class F> using mp_fold = typename detail::mp_fold_impl<mp_rename<L, mp_list>, V, F>::type;
0161 template<class L, class V, class Q> using mp_fold_q = mp_fold<L, V, Q::template fn>;
0162
0163 }
0164 }
0165
0166 #endif