annotate DEPENDENCIES/generic/include/boost/mpl/aux_/fold_impl_body.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1
Chris@16 2 // NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
Chris@16 3
Chris@16 4 #if !defined(BOOST_PP_IS_ITERATING)
Chris@16 5
Chris@16 6 // Copyright Aleksey Gurtovoy 2000-2004
Chris@16 7 //
Chris@16 8 // Distributed under the Boost Software License, Version 1.0.
Chris@16 9 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 10 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 11 //
Chris@16 12 // See http://www.boost.org/libs/mpl for documentation.
Chris@16 13
Chris@101 14 // $Id$
Chris@101 15 // $Date$
Chris@101 16 // $Revision$
Chris@16 17
Chris@16 18 # include <boost/mpl/limits/unrolling.hpp>
Chris@16 19 # include <boost/mpl/aux_/preprocessor/repeat.hpp>
Chris@16 20 # include <boost/mpl/aux_/config/workaround.hpp>
Chris@16 21 # include <boost/mpl/aux_/config/ctps.hpp>
Chris@16 22 # include <boost/mpl/aux_/nttp_decl.hpp>
Chris@16 23 # include <boost/mpl/aux_/config/eti.hpp>
Chris@16 24
Chris@16 25 # include <boost/preprocessor/iterate.hpp>
Chris@16 26 # include <boost/preprocessor/dec.hpp>
Chris@16 27 # include <boost/preprocessor/cat.hpp>
Chris@16 28
Chris@16 29 // local macros, #undef-ined at the end of the header
Chris@16 30
Chris@16 31 # define AUX778076_ITER_FOLD_STEP(unused, i, unused2) \
Chris@16 32 typedef typename apply2< \
Chris@16 33 ForwardOp \
Chris@16 34 , BOOST_PP_CAT(state,i) \
Chris@16 35 , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,i)) \
Chris@16 36 >::type BOOST_PP_CAT(state,BOOST_PP_INC(i)); \
Chris@16 37 typedef typename mpl::next<BOOST_PP_CAT(iter,i)>::type \
Chris@16 38 BOOST_PP_CAT(iter,BOOST_PP_INC(i)); \
Chris@16 39 /**/
Chris@16 40
Chris@16 41 # define AUX778076_FOLD_IMPL_NAME \
Chris@16 42 BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \
Chris@16 43 /**/
Chris@16 44
Chris@16 45 # define AUX778076_FOLD_CHUNK_NAME \
Chris@16 46 BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \
Chris@16 47 /**/
Chris@16 48
Chris@16 49 namespace boost { namespace mpl { namespace aux {
Chris@16 50
Chris@16 51 /// forward declaration
Chris@16 52 template<
Chris@16 53 BOOST_MPL_AUX_NTTP_DECL(int, N)
Chris@16 54 , typename First
Chris@16 55 , typename Last
Chris@16 56 , typename State
Chris@16 57 , typename ForwardOp
Chris@16 58 >
Chris@16 59 struct AUX778076_FOLD_IMPL_NAME;
Chris@16 60
Chris@16 61 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
Chris@16 62
Chris@16 63 # if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
Chris@16 64
Chris@16 65 # define BOOST_PP_ITERATION_PARAMS_1 \
Chris@16 66 (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))
Chris@16 67 # include BOOST_PP_ITERATE()
Chris@16 68
Chris@16 69 // implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
Chris@16 70 template<
Chris@16 71 BOOST_MPL_AUX_NTTP_DECL(int, N)
Chris@16 72 , typename First
Chris@16 73 , typename Last
Chris@16 74 , typename State
Chris@16 75 , typename ForwardOp
Chris@16 76 >
Chris@16 77 struct AUX778076_FOLD_IMPL_NAME
Chris@16 78 {
Chris@16 79 typedef AUX778076_FOLD_IMPL_NAME<
Chris@16 80 BOOST_MPL_LIMIT_UNROLLING
Chris@16 81 , First
Chris@16 82 , Last
Chris@16 83 , State
Chris@16 84 , ForwardOp
Chris@16 85 > chunk_;
Chris@16 86
Chris@16 87 typedef AUX778076_FOLD_IMPL_NAME<
Chris@16 88 ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
Chris@16 89 , typename chunk_::iterator
Chris@16 90 , Last
Chris@16 91 , typename chunk_::state
Chris@16 92 , ForwardOp
Chris@16 93 > res_;
Chris@16 94
Chris@16 95 typedef typename res_::state state;
Chris@16 96 typedef typename res_::iterator iterator;
Chris@16 97 };
Chris@16 98
Chris@16 99 // fallback implementation for sequences of unknown size
Chris@16 100 template<
Chris@16 101 typename First
Chris@16 102 , typename Last
Chris@16 103 , typename State
Chris@16 104 , typename ForwardOp
Chris@16 105 >
Chris@16 106 struct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,ForwardOp>
Chris@16 107 : AUX778076_FOLD_IMPL_NAME<
Chris@16 108 -1
Chris@16 109 , typename mpl::next<First>::type
Chris@16 110 , Last
Chris@16 111 , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
Chris@16 112 , ForwardOp
Chris@16 113 >
Chris@16 114 {
Chris@16 115 };
Chris@16 116
Chris@16 117 template<
Chris@16 118 typename Last
Chris@16 119 , typename State
Chris@16 120 , typename ForwardOp
Chris@16 121 >
Chris@16 122 struct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,ForwardOp>
Chris@16 123 {
Chris@16 124 typedef State state;
Chris@16 125 typedef Last iterator;
Chris@16 126 };
Chris@16 127
Chris@16 128 # else // BOOST_WORKAROUND(__BORLANDC__, < 0x600)
Chris@16 129
Chris@16 130 // Borland have some serious problems with the unrolled version, so
Chris@16 131 // we always use a basic implementation
Chris@16 132 template<
Chris@16 133 BOOST_MPL_AUX_NTTP_DECL(int, N)
Chris@16 134 , typename First
Chris@16 135 , typename Last
Chris@16 136 , typename State
Chris@16 137 , typename ForwardOp
Chris@16 138 >
Chris@16 139 struct AUX778076_FOLD_IMPL_NAME
Chris@16 140 {
Chris@16 141 typedef AUX778076_FOLD_IMPL_NAME<
Chris@16 142 -1
Chris@16 143 , typename mpl::next<First>::type
Chris@16 144 , Last
Chris@16 145 , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
Chris@16 146 , ForwardOp
Chris@16 147 > res_;
Chris@16 148
Chris@16 149 typedef typename res_::state state;
Chris@16 150 typedef typename res_::iterator iterator;
Chris@16 151 typedef state type;
Chris@16 152 };
Chris@16 153
Chris@16 154 template<
Chris@16 155 BOOST_MPL_AUX_NTTP_DECL(int, N)
Chris@16 156 , typename Last
Chris@16 157 , typename State
Chris@16 158 , typename ForwardOp
Chris@16 159 >
Chris@16 160 struct AUX778076_FOLD_IMPL_NAME<N,Last,Last,State,ForwardOp >
Chris@16 161 {
Chris@16 162 typedef State state;
Chris@16 163 typedef Last iterator;
Chris@16 164 typedef state type;
Chris@16 165 };
Chris@16 166
Chris@16 167 # endif // BOOST_WORKAROUND(__BORLANDC__, < 0x600)
Chris@16 168
Chris@16 169 #else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 170
Chris@16 171 template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
Chris@16 172 struct AUX778076_FOLD_CHUNK_NAME;
Chris@16 173
Chris@16 174 # define BOOST_PP_ITERATION_PARAMS_1 \
Chris@16 175 (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))
Chris@16 176 # include BOOST_PP_ITERATE()
Chris@16 177
Chris@16 178 // implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING
Chris@16 179 template< BOOST_MPL_AUX_NTTP_DECL(int, N) >
Chris@16 180 struct AUX778076_FOLD_CHUNK_NAME
Chris@16 181 {
Chris@16 182 template<
Chris@16 183 typename First
Chris@16 184 , typename Last
Chris@16 185 , typename State
Chris@16 186 , typename ForwardOp
Chris@16 187 >
Chris@16 188 struct result_
Chris@16 189 {
Chris@16 190 typedef AUX778076_FOLD_IMPL_NAME<
Chris@16 191 BOOST_MPL_LIMIT_UNROLLING
Chris@16 192 , First
Chris@16 193 , Last
Chris@16 194 , State
Chris@16 195 , ForwardOp
Chris@16 196 > chunk_;
Chris@16 197
Chris@16 198 typedef AUX778076_FOLD_IMPL_NAME<
Chris@16 199 ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )
Chris@16 200 , typename chunk_::iterator
Chris@16 201 , Last
Chris@16 202 , typename chunk_::state
Chris@16 203 , ForwardOp
Chris@16 204 > res_;
Chris@16 205
Chris@16 206 typedef typename res_::state state;
Chris@16 207 typedef typename res_::iterator iterator;
Chris@16 208 };
Chris@16 209 };
Chris@16 210
Chris@16 211 // fallback implementation for sequences of unknown size
Chris@16 212 template<
Chris@16 213 typename First
Chris@16 214 , typename Last
Chris@16 215 , typename State
Chris@16 216 , typename ForwardOp
Chris@16 217 >
Chris@16 218 struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);
Chris@16 219
Chris@16 220 template<
Chris@16 221 typename Last
Chris@16 222 , typename State
Chris@16 223 >
Chris@16 224 struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)
Chris@16 225 {
Chris@16 226 typedef Last iterator;
Chris@16 227 typedef State state;
Chris@16 228 };
Chris@16 229
Chris@16 230 template<>
Chris@16 231 struct AUX778076_FOLD_CHUNK_NAME<-1>
Chris@16 232 {
Chris@16 233 template<
Chris@16 234 typename First
Chris@16 235 , typename Last
Chris@16 236 , typename State
Chris@16 237 , typename ForwardOp
Chris@16 238 >
Chris@16 239 struct result_
Chris@16 240 {
Chris@16 241 typedef typename if_<
Chris@16 242 typename is_same<First,Last>::type
Chris@16 243 , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>
Chris@16 244 , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,ForwardOp>
Chris@16 245 >::type res_;
Chris@16 246
Chris@16 247 typedef typename res_::state state;
Chris@16 248 typedef typename res_::iterator iterator;
Chris@16 249 };
Chris@16 250
Chris@16 251 #if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
Chris@16 252 /// ETI workaround
Chris@16 253 template<> struct result_<int,int,int,int>
Chris@16 254 {
Chris@16 255 typedef int state;
Chris@16 256 typedef int iterator;
Chris@16 257 };
Chris@16 258 #endif
Chris@16 259 };
Chris@16 260
Chris@16 261 template<
Chris@16 262 typename First
Chris@16 263 , typename Last
Chris@16 264 , typename State
Chris@16 265 , typename ForwardOp
Chris@16 266 >
Chris@16 267 struct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)
Chris@16 268 {
Chris@16 269 // can't inherit here - it breaks MSVC 7.0
Chris@16 270 typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<
Chris@16 271 typename mpl::next<First>::type
Chris@16 272 , Last
Chris@16 273 , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type
Chris@16 274 , ForwardOp
Chris@16 275 > chunk_;
Chris@16 276
Chris@16 277 typedef typename chunk_::state state;
Chris@16 278 typedef typename chunk_::iterator iterator;
Chris@16 279 };
Chris@16 280
Chris@16 281 template<
Chris@16 282 BOOST_MPL_AUX_NTTP_DECL(int, N)
Chris@16 283 , typename First
Chris@16 284 , typename Last
Chris@16 285 , typename State
Chris@16 286 , typename ForwardOp
Chris@16 287 >
Chris@16 288 struct AUX778076_FOLD_IMPL_NAME
Chris@16 289 : AUX778076_FOLD_CHUNK_NAME<N>
Chris@16 290 ::template result_<First,Last,State,ForwardOp>
Chris@16 291 {
Chris@16 292 };
Chris@16 293
Chris@16 294 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 295
Chris@16 296 }}}
Chris@16 297
Chris@16 298 # undef AUX778076_FOLD_IMPL_NAME
Chris@16 299 # undef AUX778076_FOLD_CHUNK_NAME
Chris@16 300 # undef AUX778076_ITER_FOLD_STEP
Chris@16 301
Chris@16 302 #undef AUX778076_FOLD_IMPL_OP
Chris@16 303 #undef AUX778076_FOLD_IMPL_NAME_PREFIX
Chris@16 304
Chris@16 305 ///// iteration
Chris@16 306
Chris@16 307 #else
Chris@16 308
Chris@16 309 # define n_ BOOST_PP_FRAME_ITERATION(1)
Chris@16 310
Chris@16 311 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
Chris@16 312
Chris@16 313 template<
Chris@16 314 typename First
Chris@16 315 , typename Last
Chris@16 316 , typename State
Chris@16 317 , typename ForwardOp
Chris@16 318 >
Chris@16 319 struct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,ForwardOp>
Chris@16 320 {
Chris@16 321 typedef First iter0;
Chris@16 322 typedef State state0;
Chris@16 323
Chris@16 324 BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)
Chris@16 325
Chris@16 326 typedef BOOST_PP_CAT(state,n_) state;
Chris@16 327 typedef BOOST_PP_CAT(iter,n_) iterator;
Chris@16 328 };
Chris@16 329
Chris@16 330 #else
Chris@16 331
Chris@16 332 template<> struct AUX778076_FOLD_CHUNK_NAME<n_>
Chris@16 333 {
Chris@16 334 template<
Chris@16 335 typename First
Chris@16 336 , typename Last
Chris@16 337 , typename State
Chris@16 338 , typename ForwardOp
Chris@16 339 >
Chris@16 340 struct result_
Chris@16 341 {
Chris@16 342 typedef First iter0;
Chris@16 343 typedef State state0;
Chris@16 344
Chris@16 345 BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)
Chris@16 346
Chris@16 347 typedef BOOST_PP_CAT(state,n_) state;
Chris@16 348 typedef BOOST_PP_CAT(iter,n_) iterator;
Chris@16 349 };
Chris@16 350
Chris@16 351 #if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)
Chris@16 352 /// ETI workaround
Chris@16 353 template<> struct result_<int,int,int,int>
Chris@16 354 {
Chris@16 355 typedef int state;
Chris@16 356 typedef int iterator;
Chris@16 357 };
Chris@16 358 #endif
Chris@16 359 };
Chris@16 360
Chris@16 361 #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Chris@16 362
Chris@16 363 # undef n_
Chris@16 364
Chris@16 365 #endif // BOOST_PP_IS_ITERATING