Back to home page

EIC code displayed by LXR

 
 

    


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 //  Copyright 2015-2017 Peter Dimov.
0005 //
0006 //  Distributed under the Boost Software License, Version 1.0.
0007 //
0008 //  See accompanying file LICENSE_1_0.txt or copy at
0009 //  http://www.boost.org/LICENSE_1_0.txt
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 // mp_fold<L, V, F>
0022 namespace detail
0023 {
0024 
0025 template<class L, class V, template<class...> class F> struct mp_fold_impl
0026 {
0027 // An error "no type named 'type'" here means that the first argument to mp_fold is not a list
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 } // namespace detail
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 } // namespace mp11
0164 } // namespace boost
0165 
0166 #endif // #ifndef BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED