File indexing completed on 2025-01-18 09:37:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef BOOST_HANA_DETAIL_VARIADIC_FOLDL1_HPP
0011 #define BOOST_HANA_DETAIL_VARIADIC_FOLDL1_HPP
0012
0013 #include <boost/hana/config.hpp>
0014 #include <boost/hana/core/when.hpp>
0015
0016
0017 namespace boost { namespace hana { namespace detail { namespace variadic {
0018
0019 template <unsigned int n, typename = when<true>>
0020 struct foldl1_impl;
0021
0022 template <>
0023 struct foldl1_impl<1> {
0024 template <typename F, typename X1>
0025 static constexpr X1 apply(F&&, X1&& x1)
0026 { return static_cast<X1&&>(x1); }
0027 };
0028
0029 template <>
0030 struct foldl1_impl<2> {
0031 template <typename F, typename X1, typename X2>
0032 static constexpr decltype(auto) apply(F&& f, X1&& x1, X2&& x2) {
0033 return static_cast<F&&>(f)(static_cast<X1&&>(x1),
0034 static_cast<X2&&>(x2));
0035 }
0036 };
0037
0038 template <>
0039 struct foldl1_impl<3> {
0040 template <typename F, typename X1, typename X2, typename X3>
0041 static constexpr decltype(auto) apply(F&& f, X1&& x1, X2&& x2, X3&& x3) {
0042 return f(f(static_cast<X1&&>(x1),
0043 static_cast<X2&&>(x2)),
0044 static_cast<X3&&>(x3));
0045 }
0046 };
0047
0048 template <>
0049 struct foldl1_impl<4> {
0050 template <typename F, typename X1, typename X2, typename X3, typename X4>
0051 static constexpr decltype(auto) apply(F&& f, X1&& x1, X2&& x2, X3&& x3, X4&& x4) {
0052 return f(f(f(static_cast<X1&&>(x1),
0053 static_cast<X2&&>(x2)),
0054 static_cast<X3&&>(x3)),
0055 static_cast<X4&&>(x4));
0056 }
0057 };
0058
0059 template <>
0060 struct foldl1_impl<5> {
0061 template <typename F, typename X1, typename X2, typename X3, typename X4, typename X5>
0062 static constexpr decltype(auto) apply(F&& f, X1&& x1, X2&& x2, X3&& x3, X4&& x4, X5&& x5) {
0063 return f(f(f(f(static_cast<X1&&>(x1),
0064 static_cast<X2&&>(x2)),
0065 static_cast<X3&&>(x3)),
0066 static_cast<X4&&>(x4)),
0067 static_cast<X5&&>(x5));
0068 }
0069 };
0070
0071 template <>
0072 struct foldl1_impl<6> {
0073 template <typename F, typename X1, typename X2, typename X3, typename X4, typename X5, typename X6>
0074 static constexpr decltype(auto) apply(F&& f, X1&& x1, X2&& x2, X3&& x3, X4&& x4, X5&& x5, X6&& x6) {
0075 return f(f(f(f(f(static_cast<X1&&>(x1),
0076 static_cast<X2&&>(x2)),
0077 static_cast<X3&&>(x3)),
0078 static_cast<X4&&>(x4)),
0079 static_cast<X5&&>(x5)),
0080 static_cast<X6&&>(x6));
0081 }
0082 };
0083
0084 template <unsigned int n>
0085 struct foldl1_impl<n, when<(n >= 7) && (n < 14)>> {
0086 template <typename F, typename X1, typename X2, typename X3, typename X4, typename X5, typename X6, typename X7, typename ...Xn>
0087 static constexpr decltype(auto)
0088 apply(F&& f
0089 , X1&& x1, X2&& x2, X3&& x3, X4&& x4, X5&& x5, X6&& x6, X7&& x7
0090 , Xn&& ...xn)
0091 {
0092 return foldl1_impl<sizeof...(xn) + 1>::apply(
0093 f,
0094 f(f(f(f(f(f(static_cast<X1&&>(x1),
0095 static_cast<X2&&>(x2)),
0096 static_cast<X3&&>(x3)),
0097 static_cast<X4&&>(x4)),
0098 static_cast<X5&&>(x5)),
0099 static_cast<X6&&>(x6)),
0100 static_cast<X7&&>(x7)),
0101 static_cast<Xn&&>(xn)...
0102 );
0103 }
0104 };
0105
0106 template <unsigned int n>
0107 struct foldl1_impl<n, when<(n >= 14) && (n < 28)>> {
0108 template <
0109 typename F
0110 , typename X1, typename X2, typename X3, typename X4, typename X5, typename X6, typename X7
0111 , typename X8, typename X9, typename X10, typename X11, typename X12, typename X13, typename X14
0112 , typename ...Xn
0113 >
0114 static constexpr decltype(auto)
0115 apply(F&& f
0116 , X1&& x1, X2&& x2, X3&& x3, X4&& x4, X5&& x5, X6&& x6, X7&& x7
0117 , X8&& x8, X9&& x9, X10&& x10, X11&& x11, X12&& x12, X13&& x13, X14&& x14
0118 , Xn&& ...xn)
0119 {
0120 return foldl1_impl<sizeof...(xn) + 1>::apply(
0121 f,
0122 f(f(f(f(f(f(f(f(f(f(f(f(f(
0123 static_cast<X1&&>(x1), static_cast<X2&&>(x2)), static_cast<X3&&>(x3)), static_cast<X4&&>(x4)), static_cast<X5&&>(x5)), static_cast<X6&&>(x6)), static_cast<X7&&>(x7)),
0124 static_cast<X8&&>(x8)), static_cast<X9&&>(x9)), static_cast<X10&&>(x10)), static_cast<X11&&>(x11)), static_cast<X12&&>(x12)), static_cast<X13&&>(x13)), static_cast<X14&&>(x14))
0125 , static_cast<Xn&&>(xn)...);
0126
0127 }
0128 };
0129
0130 template <unsigned int n>
0131 struct foldl1_impl<n, when<(n >= 28) && (n < 56)>> {
0132 template <
0133 typename F
0134 , typename X1, typename X2, typename X3, typename X4, typename X5, typename X6, typename X7
0135 , typename X8, typename X9, typename X10, typename X11, typename X12, typename X13, typename X14
0136 , typename X15, typename X16, typename X17, typename X18, typename X19, typename X20, typename X21
0137 , typename X22, typename X23, typename X24, typename X25, typename X26, typename X27, typename X28
0138 , typename ...Xn
0139 >
0140 static constexpr decltype(auto)
0141 apply(F&& f
0142 , X1&& x1, X2&& x2, X3&& x3, X4&& x4, X5&& x5, X6&& x6, X7&& x7
0143 , X8&& x8, X9&& x9, X10&& x10, X11&& x11, X12&& x12, X13&& x13, X14&& x14
0144 , X15&& x15, X16&& x16, X17&& x17, X18&& x18, X19&& x19, X20&& x20, X21&& x21
0145 , X22&& x22, X23&& x23, X24&& x24, X25&& x25, X26&& x26, X27&& x27, X28&& x28
0146 , Xn&& ...xn)
0147 {
0148 return foldl1_impl<sizeof...(xn) + 1>::apply(
0149 f,
0150 f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(
0151 static_cast<X1&&>(x1), static_cast<X2&&>(x2)), static_cast<X3&&>(x3)), static_cast<X4&&>(x4)), static_cast<X5&&>(x5)), static_cast<X6&&>(x6)), static_cast<X7&&>(x7)),
0152 static_cast<X8&&>(x8)), static_cast<X9&&>(x9)), static_cast<X10&&>(x10)), static_cast<X11&&>(x11)), static_cast<X12&&>(x12)), static_cast<X13&&>(x13)), static_cast<X14&&>(x14)),
0153 static_cast<X15&&>(x15)), static_cast<X16&&>(x16)), static_cast<X17&&>(x17)), static_cast<X18&&>(x18)), static_cast<X19&&>(x19)), static_cast<X20&&>(x20)), static_cast<X21&&>(x21)),
0154 static_cast<X22&&>(x22)), static_cast<X23&&>(x23)), static_cast<X24&&>(x24)), static_cast<X25&&>(x25)), static_cast<X26&&>(x26)), static_cast<X27&&>(x27)), static_cast<X28&&>(x28))
0155 , static_cast<Xn&&>(xn)...);
0156 }
0157 };
0158
0159 template <unsigned int n>
0160 struct foldl1_impl<n, when<(n >= 56)>> {
0161 template <
0162 typename F
0163 , typename X1, typename X2, typename X3, typename X4, typename X5, typename X6, typename X7
0164 , typename X8, typename X9, typename X10, typename X11, typename X12, typename X13, typename X14
0165 , typename X15, typename X16, typename X17, typename X18, typename X19, typename X20, typename X21
0166 , typename X22, typename X23, typename X24, typename X25, typename X26, typename X27, typename X28
0167 , typename X29, typename X30, typename X31, typename X32, typename X33, typename X34, typename X35
0168 , typename X36, typename X37, typename X38, typename X39, typename X40, typename X41, typename X42
0169 , typename X43, typename X44, typename X45, typename X46, typename X47, typename X48, typename X49
0170 , typename X50, typename X51, typename X52, typename X53, typename X54, typename X55, typename X56
0171 , typename ...Xn
0172 >
0173 static constexpr decltype(auto)
0174 apply(F&& f
0175 , X1&& x1, X2&& x2, X3&& x3, X4&& x4, X5&& x5, X6&& x6, X7&& x7
0176 , X8&& x8, X9&& x9, X10&& x10, X11&& x11, X12&& x12, X13&& x13, X14&& x14
0177 , X15&& x15, X16&& x16, X17&& x17, X18&& x18, X19&& x19, X20&& x20, X21&& x21
0178 , X22&& x22, X23&& x23, X24&& x24, X25&& x25, X26&& x26, X27&& x27, X28&& x28
0179 , X29&& x29, X30&& x30, X31&& x31, X32&& x32, X33&& x33, X34&& x34, X35&& x35
0180 , X36&& x36, X37&& x37, X38&& x38, X39&& x39, X40&& x40, X41&& x41, X42&& x42
0181 , X43&& x43, X44&& x44, X45&& x45, X46&& x46, X47&& x47, X48&& x48, X49&& x49
0182 , X50&& x50, X51&& x51, X52&& x52, X53&& x53, X54&& x54, X55&& x55, X56&& x56
0183 , Xn&& ...xn)
0184 {
0185 return foldl1_impl<sizeof...(xn) + 1>::apply(
0186 f,
0187 f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(
0188 static_cast<X1&&>(x1), static_cast<X2&&>(x2)), static_cast<X3&&>(x3)), static_cast<X4&&>(x4)), static_cast<X5&&>(x5)), static_cast<X6&&>(x6)), static_cast<X7&&>(x7)),
0189 static_cast<X8&&>(x8)), static_cast<X9&&>(x9)), static_cast<X10&&>(x10)), static_cast<X11&&>(x11)), static_cast<X12&&>(x12)), static_cast<X13&&>(x13)), static_cast<X14&&>(x14)),
0190 static_cast<X15&&>(x15)), static_cast<X16&&>(x16)), static_cast<X17&&>(x17)), static_cast<X18&&>(x18)), static_cast<X19&&>(x19)), static_cast<X20&&>(x20)), static_cast<X21&&>(x21)),
0191 static_cast<X22&&>(x22)), static_cast<X23&&>(x23)), static_cast<X24&&>(x24)), static_cast<X25&&>(x25)), static_cast<X26&&>(x26)), static_cast<X27&&>(x27)), static_cast<X28&&>(x28)),
0192 static_cast<X29&&>(x29)), static_cast<X30&&>(x30)), static_cast<X31&&>(x31)), static_cast<X32&&>(x32)), static_cast<X33&&>(x33)), static_cast<X34&&>(x34)), static_cast<X35&&>(x35)),
0193 static_cast<X36&&>(x36)), static_cast<X37&&>(x37)), static_cast<X38&&>(x38)), static_cast<X39&&>(x39)), static_cast<X40&&>(x40)), static_cast<X41&&>(x41)), static_cast<X42&&>(x42)),
0194 static_cast<X43&&>(x43)), static_cast<X44&&>(x44)), static_cast<X45&&>(x45)), static_cast<X46&&>(x46)), static_cast<X47&&>(x47)), static_cast<X48&&>(x48)), static_cast<X49&&>(x49)),
0195 static_cast<X50&&>(x50)), static_cast<X51&&>(x51)), static_cast<X52&&>(x52)), static_cast<X53&&>(x53)), static_cast<X54&&>(x54)), static_cast<X55&&>(x55)), static_cast<X56&&>(x56))
0196 , static_cast<Xn&&>(xn)...);
0197 }
0198 };
0199
0200
0201 struct foldl1_t {
0202 template <typename F, typename X1, typename ...Xn>
0203 constexpr decltype(auto) operator()(F&& f, X1&& x1, Xn&& ...xn) const {
0204 return foldl1_impl<sizeof...(xn) + 1>::apply(
0205 static_cast<F&&>(f), static_cast<X1&&>(x1), static_cast<Xn&&>(xn)...
0206 );
0207 }
0208 };
0209
0210 BOOST_HANA_INLINE_VARIABLE constexpr foldl1_t foldl1{};
0211 BOOST_HANA_INLINE_VARIABLE constexpr auto foldl = foldl1;
0212 }} }}
0213
0214 #endif