annotate DEPENDENCIES/generic/include/boost/lambda/loops.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 2665513ce2d3
children
rev   line source
Chris@16 1 // Boost Lambda Library -- loops.hpp ----------------------------------------
Chris@16 2
Chris@16 3 // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
Chris@16 4 // Copyright (C) 2000 Gary Powell (powellg@amazon.com)
Chris@16 5 // Copyright (c) 2001-2002 Joel de Guzman
Chris@16 6 //
Chris@16 7 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 8 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10 //
Chris@16 11 // For more information, see www.boost.org
Chris@16 12
Chris@16 13 // --------------------------------------------------------------------------
Chris@16 14
Chris@16 15 #if !defined(BOOST_LAMBDA_LOOPS_HPP)
Chris@16 16 #define BOOST_LAMBDA_LOOPS_HPP
Chris@16 17
Chris@16 18 #include "boost/lambda/core.hpp"
Chris@16 19
Chris@16 20 namespace boost {
Chris@16 21 namespace lambda {
Chris@16 22
Chris@16 23 // -- loop control structure actions ----------------------
Chris@16 24
Chris@16 25 class forloop_action {};
Chris@16 26 class forloop_no_body_action {};
Chris@16 27 class whileloop_action {};
Chris@16 28 class whileloop_no_body_action {};
Chris@16 29 class dowhileloop_action {};
Chris@16 30 class dowhileloop_no_body_action {};
Chris@16 31
Chris@16 32
Chris@16 33 // For loop
Chris@16 34 template <class Arg1, class Arg2, class Arg3, class Arg4>
Chris@16 35 inline const
Chris@16 36 lambda_functor<
Chris@16 37 lambda_functor_base<
Chris@16 38 forloop_action,
Chris@16 39 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
Chris@16 40 lambda_functor<Arg3>, lambda_functor<Arg4> >
Chris@16 41 >
Chris@16 42 >
Chris@16 43 for_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,
Chris@16 44 const lambda_functor<Arg3>& a3, const lambda_functor<Arg4>& a4) {
Chris@16 45 return
Chris@16 46 lambda_functor_base<
Chris@16 47 forloop_action,
Chris@16 48 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
Chris@16 49 lambda_functor<Arg3>, lambda_functor<Arg4> >
Chris@16 50 >
Chris@16 51 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
Chris@16 52 lambda_functor<Arg3>, lambda_functor<Arg4> >(a1, a2, a3, a4)
Chris@16 53 );
Chris@16 54 }
Chris@16 55
Chris@16 56 // No body case.
Chris@16 57 template <class Arg1, class Arg2, class Arg3>
Chris@16 58 inline const
Chris@16 59 lambda_functor<
Chris@16 60 lambda_functor_base<
Chris@16 61 forloop_no_body_action,
Chris@16 62 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>, lambda_functor<Arg3> >
Chris@16 63 >
Chris@16 64 >
Chris@16 65 for_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2,
Chris@16 66 const lambda_functor<Arg3>& a3) {
Chris@16 67 return
Chris@16 68 lambda_functor_base<
Chris@16 69 forloop_no_body_action,
Chris@16 70 tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
Chris@16 71 lambda_functor<Arg3> >
Chris@16 72 >
Chris@16 73 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2>,
Chris@16 74 lambda_functor<Arg3> >(a1, a2, a3) );
Chris@16 75 }
Chris@16 76
Chris@16 77 // While loop
Chris@16 78 template <class Arg1, class Arg2>
Chris@16 79 inline const
Chris@16 80 lambda_functor<
Chris@16 81 lambda_functor_base<
Chris@16 82 whileloop_action,
Chris@16 83 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
Chris@16 84 >
Chris@16 85 >
Chris@16 86 while_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {
Chris@16 87 return
Chris@16 88 lambda_functor_base<
Chris@16 89 whileloop_action,
Chris@16 90 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
Chris@16 91 >
Chris@16 92 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));
Chris@16 93 }
Chris@16 94
Chris@16 95 // No body case.
Chris@16 96 template <class Arg1>
Chris@16 97 inline const
Chris@16 98 lambda_functor<
Chris@16 99 lambda_functor_base<
Chris@16 100 whileloop_no_body_action,
Chris@16 101 tuple<lambda_functor<Arg1> >
Chris@16 102 >
Chris@16 103 >
Chris@16 104 while_loop(const lambda_functor<Arg1>& a1) {
Chris@16 105 return
Chris@16 106 lambda_functor_base<
Chris@16 107 whileloop_no_body_action,
Chris@16 108 tuple<lambda_functor<Arg1> >
Chris@16 109 >
Chris@16 110 ( tuple<lambda_functor<Arg1> >(a1) );
Chris@16 111 }
Chris@16 112
Chris@16 113
Chris@16 114 // Do While loop
Chris@16 115 template <class Arg1, class Arg2>
Chris@16 116 inline const
Chris@16 117 lambda_functor<
Chris@16 118 lambda_functor_base<
Chris@16 119 dowhileloop_action,
Chris@16 120 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
Chris@16 121 >
Chris@16 122 >
Chris@16 123 do_while_loop(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2) {
Chris@16 124 return
Chris@16 125 lambda_functor_base<
Chris@16 126 dowhileloop_action,
Chris@16 127 tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
Chris@16 128 >
Chris@16 129 ( tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));
Chris@16 130 }
Chris@16 131
Chris@16 132 // No body case.
Chris@16 133 template <class Arg1>
Chris@16 134 inline const
Chris@16 135 lambda_functor<
Chris@16 136 lambda_functor_base<
Chris@16 137 dowhileloop_no_body_action,
Chris@16 138 tuple<lambda_functor<Arg1> >
Chris@16 139 >
Chris@16 140 >
Chris@16 141 do_while_loop(const lambda_functor<Arg1>& a1) {
Chris@16 142 return
Chris@16 143 lambda_functor_base<
Chris@16 144 dowhileloop_no_body_action,
Chris@16 145 tuple<lambda_functor<Arg1> >
Chris@16 146 >
Chris@16 147 ( tuple<lambda_functor<Arg1> >(a1));
Chris@16 148 }
Chris@16 149
Chris@16 150
Chris@16 151 // Control loop lambda_functor_base specializations.
Chris@16 152
Chris@16 153 // Specialization for for_loop.
Chris@16 154 template<class Args>
Chris@16 155 class
Chris@16 156 lambda_functor_base<forloop_action, Args> {
Chris@16 157 public:
Chris@16 158 Args args;
Chris@16 159 template <class T> struct sig { typedef void type; };
Chris@16 160 public:
Chris@16 161 explicit lambda_functor_base(const Args& a) : args(a) {}
Chris@16 162
Chris@16 163 template<class RET, CALL_TEMPLATE_ARGS>
Chris@16 164 RET call(CALL_FORMAL_ARGS) const {
Chris@16 165 for(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);
Chris@16 166 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
Chris@16 167 detail::select(boost::tuples::get<2>(args), CALL_ACTUAL_ARGS))
Chris@16 168
Chris@16 169 detail::select(boost::tuples::get<3>(args), CALL_ACTUAL_ARGS);
Chris@16 170 }
Chris@16 171 };
Chris@16 172
Chris@16 173 // No body case
Chris@16 174 template<class Args>
Chris@16 175 class
Chris@16 176 lambda_functor_base<forloop_no_body_action, Args> {
Chris@16 177 public:
Chris@16 178 Args args;
Chris@16 179 template <class T> struct sig { typedef void type; };
Chris@16 180 public:
Chris@16 181 explicit lambda_functor_base(const Args& a) : args(a) {}
Chris@16 182
Chris@16 183 template<class RET, CALL_TEMPLATE_ARGS>
Chris@16 184 RET call(CALL_FORMAL_ARGS) const {
Chris@16 185 for(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS);
Chris@16 186 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
Chris@16 187 detail::select(boost::tuples::get<2>(args), CALL_ACTUAL_ARGS)) {}
Chris@16 188 }
Chris@16 189 };
Chris@16 190
Chris@16 191
Chris@16 192 // Specialization for while_loop.
Chris@16 193 template<class Args>
Chris@16 194 class
Chris@16 195 lambda_functor_base<whileloop_action, Args> {
Chris@16 196 public:
Chris@16 197 Args args;
Chris@16 198 template <class T> struct sig { typedef void type; };
Chris@16 199 public:
Chris@16 200 explicit lambda_functor_base(const Args& a) : args(a) {}
Chris@16 201
Chris@16 202 template<class RET, CALL_TEMPLATE_ARGS>
Chris@16 203 RET call(CALL_FORMAL_ARGS) const {
Chris@16 204 while(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS))
Chris@16 205
Chris@16 206 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
Chris@16 207 }
Chris@16 208 };
Chris@16 209
Chris@16 210 // No body case
Chris@16 211 template<class Args>
Chris@16 212 class
Chris@16 213 lambda_functor_base<whileloop_no_body_action, Args> {
Chris@16 214 public:
Chris@16 215 Args args;
Chris@16 216 template <class T> struct sig { typedef void type; };
Chris@16 217 public:
Chris@16 218 explicit lambda_functor_base(const Args& a) : args(a) {}
Chris@16 219
Chris@16 220 template<class RET, CALL_TEMPLATE_ARGS>
Chris@16 221 RET call(CALL_FORMAL_ARGS) const {
Chris@16 222 while(detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS)) {}
Chris@16 223 }
Chris@16 224 };
Chris@16 225
Chris@16 226 // Specialization for do_while_loop.
Chris@16 227 // Note that the first argument is the condition.
Chris@16 228 template<class Args>
Chris@16 229 class
Chris@16 230 lambda_functor_base<dowhileloop_action, Args> {
Chris@16 231 public:
Chris@16 232 Args args;
Chris@16 233 template <class T> struct sig { typedef void type; };
Chris@16 234 public:
Chris@16 235 explicit lambda_functor_base(const Args& a) : args(a) {}
Chris@16 236
Chris@16 237 template<class RET, CALL_TEMPLATE_ARGS>
Chris@16 238 RET call(CALL_FORMAL_ARGS) const {
Chris@16 239 do {
Chris@16 240 detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS);
Chris@16 241 } while (detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) );
Chris@16 242 }
Chris@16 243 };
Chris@16 244
Chris@16 245 // No body case
Chris@16 246 template<class Args>
Chris@16 247 class
Chris@16 248 lambda_functor_base<dowhileloop_no_body_action, Args> {
Chris@16 249 public:
Chris@16 250 Args args;
Chris@16 251 template <class T> struct sig { typedef void type; };
Chris@16 252 public:
Chris@16 253 explicit lambda_functor_base(const Args& a) : args(a) {}
Chris@16 254
Chris@16 255 template<class RET, CALL_TEMPLATE_ARGS>
Chris@16 256 RET call(CALL_FORMAL_ARGS) const {
Chris@16 257 do {} while (detail::select(boost::tuples::get<0>(args), CALL_ACTUAL_ARGS) );
Chris@16 258 }
Chris@16 259 };
Chris@16 260
Chris@16 261 // The code below is from Joel de Guzman, some name changes etc.
Chris@16 262 // has been made.
Chris@16 263
Chris@16 264 ///////////////////////////////////////////////////////////////////////////////
Chris@16 265 //
Chris@16 266 // while_composite
Chris@16 267 //
Chris@16 268 // This composite has the form:
Chris@16 269 //
Chris@16 270 // while_(condition)
Chris@16 271 // [
Chris@16 272 // statement
Chris@16 273 // ]
Chris@16 274 //
Chris@16 275 // While the condition (an lambda_functor) evaluates to true, statement
Chris@16 276 // (another lambda_functor) is executed. The result type of this is void.
Chris@16 277 // Note the trailing underscore after while_.
Chris@16 278 //
Chris@16 279 ///////////////////////////////////////////////////////////////////////////////
Chris@16 280 template <typename CondT, typename DoT>
Chris@16 281 struct while_composite {
Chris@16 282
Chris@16 283 typedef while_composite<CondT, DoT> self_t;
Chris@16 284
Chris@16 285 template <class SigArgs>
Chris@16 286 struct sig { typedef void type; };
Chris@16 287
Chris@16 288 while_composite(CondT const& cond_, DoT const& do__)
Chris@16 289 : cond(cond_), do_(do__) {}
Chris@16 290
Chris@16 291 template <class Ret, CALL_TEMPLATE_ARGS>
Chris@16 292 Ret call(CALL_FORMAL_ARGS) const
Chris@16 293 {
Chris@16 294 while (cond.internal_call(CALL_ACTUAL_ARGS))
Chris@16 295 do_.internal_call(CALL_ACTUAL_ARGS);
Chris@16 296 }
Chris@16 297
Chris@16 298 CondT cond;
Chris@16 299 DoT do_;
Chris@16 300 };
Chris@16 301
Chris@16 302 //////////////////////////////////
Chris@16 303 template <typename CondT>
Chris@16 304 struct while_gen {
Chris@16 305
Chris@16 306 while_gen(CondT const& cond_)
Chris@16 307 : cond(cond_) {}
Chris@16 308
Chris@16 309 template <typename DoT>
Chris@16 310 lambda_functor<while_composite<
Chris@16 311 typename as_lambda_functor<CondT>::type,
Chris@16 312 typename as_lambda_functor<DoT>::type> >
Chris@16 313 operator[](DoT const& do_) const
Chris@16 314 {
Chris@16 315 typedef while_composite<
Chris@16 316 typename as_lambda_functor<CondT>::type,
Chris@16 317 typename as_lambda_functor<DoT>::type>
Chris@16 318 result;
Chris@16 319
Chris@16 320 return result(
Chris@16 321 to_lambda_functor(cond),
Chris@16 322 to_lambda_functor(do_));
Chris@16 323 }
Chris@16 324
Chris@16 325 CondT cond;
Chris@16 326 };
Chris@16 327
Chris@16 328 //////////////////////////////////
Chris@16 329 template <typename CondT>
Chris@16 330 inline while_gen<CondT>
Chris@16 331 while_(CondT const& cond)
Chris@16 332 {
Chris@16 333 return while_gen<CondT>(cond);
Chris@16 334 }
Chris@16 335
Chris@16 336 ///////////////////////////////////////////////////////////////////////////////
Chris@16 337 //
Chris@16 338 // do_composite
Chris@16 339 //
Chris@16 340 // This composite has the form:
Chris@16 341 //
Chris@16 342 // do_
Chris@16 343 // [
Chris@16 344 // statement
Chris@16 345 // ]
Chris@16 346 // .while_(condition)
Chris@16 347 //
Chris@16 348 // While the condition (an lambda_functor) evaluates to true, statement
Chris@16 349 // (another lambda_functor) is executed. The statement is executed at least
Chris@16 350 // once. The result type of this is void. Note the trailing
Chris@16 351 // underscore after do_ and the leading dot and the trailing
Chris@16 352 // underscore before and after .while_.
Chris@16 353 //
Chris@16 354 ///////////////////////////////////////////////////////////////////////////////
Chris@16 355 template <typename DoT, typename CondT>
Chris@16 356 struct do_composite {
Chris@16 357
Chris@16 358 typedef do_composite<DoT, CondT> self_t;
Chris@16 359
Chris@16 360 template <class SigArgs>
Chris@16 361 struct sig { typedef void type; };
Chris@16 362
Chris@16 363 do_composite(DoT const& do__, CondT const& cond_)
Chris@16 364 : do_(do__), cond(cond_) {}
Chris@16 365
Chris@16 366 template <class Ret, CALL_TEMPLATE_ARGS>
Chris@16 367 Ret call(CALL_FORMAL_ARGS) const
Chris@16 368 {
Chris@16 369 do
Chris@16 370 do_.internal_call(CALL_ACTUAL_ARGS);
Chris@16 371 while (cond.internal_call(CALL_ACTUAL_ARGS));
Chris@16 372 }
Chris@16 373
Chris@16 374 DoT do_;
Chris@16 375 CondT cond;
Chris@16 376 };
Chris@16 377
Chris@16 378 ////////////////////////////////////
Chris@16 379 template <typename DoT>
Chris@16 380 struct do_gen2 {
Chris@16 381
Chris@16 382 do_gen2(DoT const& do__)
Chris@16 383 : do_(do__) {}
Chris@16 384
Chris@16 385 template <typename CondT>
Chris@16 386 lambda_functor<do_composite<
Chris@16 387 typename as_lambda_functor<DoT>::type,
Chris@16 388 typename as_lambda_functor<CondT>::type> >
Chris@16 389 while_(CondT const& cond) const
Chris@16 390 {
Chris@16 391 typedef do_composite<
Chris@16 392 typename as_lambda_functor<DoT>::type,
Chris@16 393 typename as_lambda_functor<CondT>::type>
Chris@16 394 result;
Chris@16 395
Chris@16 396 return result(
Chris@16 397 to_lambda_functor(do_),
Chris@16 398 to_lambda_functor(cond));
Chris@16 399 }
Chris@16 400
Chris@16 401 DoT do_;
Chris@16 402 };
Chris@16 403
Chris@16 404 ////////////////////////////////////
Chris@16 405 struct do_gen {
Chris@16 406
Chris@16 407 template <typename DoT>
Chris@16 408 do_gen2<DoT>
Chris@16 409 operator[](DoT const& do_) const
Chris@16 410 {
Chris@16 411 return do_gen2<DoT>(do_);
Chris@16 412 }
Chris@16 413 };
Chris@16 414
Chris@16 415 do_gen const do_ = do_gen();
Chris@16 416
Chris@16 417 ///////////////////////////////////////////////////////////////////////////////
Chris@16 418 //
Chris@16 419 // for_composite
Chris@16 420 //
Chris@16 421 // This statement has the form:
Chris@16 422 //
Chris@16 423 // for_(init, condition, step)
Chris@16 424 // [
Chris@16 425 // statement
Chris@16 426 // ]
Chris@16 427 //
Chris@16 428 // Where init, condition, step and statement are all lambda_functors. init
Chris@16 429 // is executed once before entering the for-loop. The for-loop
Chris@16 430 // exits once condition evaluates to false. At each loop iteration,
Chris@16 431 // step and statement is called. The result of this statement is
Chris@16 432 // void. Note the trailing underscore after for_.
Chris@16 433 //
Chris@16 434 ///////////////////////////////////////////////////////////////////////////////
Chris@16 435 template <typename InitT, typename CondT, typename StepT, typename DoT>
Chris@16 436 struct for_composite {
Chris@16 437
Chris@16 438 template <class SigArgs>
Chris@16 439 struct sig { typedef void type; };
Chris@16 440
Chris@16 441 for_composite(
Chris@16 442 InitT const& init_,
Chris@16 443 CondT const& cond_,
Chris@16 444 StepT const& step_,
Chris@16 445 DoT const& do__)
Chris@16 446 : init(init_), cond(cond_), step(step_), do_(do__) {}
Chris@16 447
Chris@16 448 template <class Ret, CALL_TEMPLATE_ARGS>
Chris@16 449 Ret
Chris@16 450 call(CALL_FORMAL_ARGS) const
Chris@16 451 {
Chris@16 452 for (init.internal_call(CALL_ACTUAL_ARGS); cond.internal_call(CALL_ACTUAL_ARGS); step.internal_call(CALL_ACTUAL_ARGS))
Chris@16 453 do_.internal_call(CALL_ACTUAL_ARGS);
Chris@16 454 }
Chris@16 455
Chris@16 456 InitT init; CondT cond; StepT step; DoT do_; // lambda_functors
Chris@16 457 };
Chris@16 458
Chris@16 459 //////////////////////////////////
Chris@16 460 template <typename InitT, typename CondT, typename StepT>
Chris@16 461 struct for_gen {
Chris@16 462
Chris@16 463 for_gen(
Chris@16 464 InitT const& init_,
Chris@16 465 CondT const& cond_,
Chris@16 466 StepT const& step_)
Chris@16 467 : init(init_), cond(cond_), step(step_) {}
Chris@16 468
Chris@16 469 template <typename DoT>
Chris@16 470 lambda_functor<for_composite<
Chris@16 471 typename as_lambda_functor<InitT>::type,
Chris@16 472 typename as_lambda_functor<CondT>::type,
Chris@16 473 typename as_lambda_functor<StepT>::type,
Chris@16 474 typename as_lambda_functor<DoT>::type> >
Chris@16 475 operator[](DoT const& do_) const
Chris@16 476 {
Chris@16 477 typedef for_composite<
Chris@16 478 typename as_lambda_functor<InitT>::type,
Chris@16 479 typename as_lambda_functor<CondT>::type,
Chris@16 480 typename as_lambda_functor<StepT>::type,
Chris@16 481 typename as_lambda_functor<DoT>::type>
Chris@16 482 result;
Chris@16 483
Chris@16 484 return result(
Chris@16 485 to_lambda_functor(init),
Chris@16 486 to_lambda_functor(cond),
Chris@16 487 to_lambda_functor(step),
Chris@16 488 to_lambda_functor(do_));
Chris@16 489 }
Chris@16 490
Chris@16 491 InitT init; CondT cond; StepT step;
Chris@16 492 };
Chris@16 493
Chris@16 494 //////////////////////////////////
Chris@16 495 template <typename InitT, typename CondT, typename StepT>
Chris@16 496 inline for_gen<InitT, CondT, StepT>
Chris@16 497 for_(InitT const& init, CondT const& cond, StepT const& step)
Chris@16 498 {
Chris@16 499 return for_gen<InitT, CondT, StepT>(init, cond, step);
Chris@16 500 }
Chris@16 501
Chris@16 502 } // lambda
Chris@16 503 } // boost
Chris@16 504
Chris@16 505 #endif // BOOST_LAMBDA_LOOPS_HPP