os/ossrv/ossrv_pub/boost_apis/boost/lambda/algorithm.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// -- algorithm.hpp -- Boost Lambda Library -----------------------------------
sl@0
     2
// Copyright (C) 2002 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
sl@0
     3
// Copyright (C) 2002 Gary Powell (gwpowell@hotmail.com)
sl@0
     4
//
sl@0
     5
// Distributed under the Boost Software License, Version 1.0. (See
sl@0
     6
// accompanying file LICENSE_1_0.txt or copy at
sl@0
     7
// http://www.boost.org/LICENSE_1_0.txt)
sl@0
     8
//
sl@0
     9
// For more information, see http://www.boost.org
sl@0
    10
sl@0
    11
#ifndef BOOST_LAMBDA_ALGORITHM_HPP
sl@0
    12
#define BOOST_LAMBDA_ALGORITHM_HPP
sl@0
    13
sl@0
    14
#include "boost/lambda/core.hpp"
sl@0
    15
sl@0
    16
#include <algorithm>
sl@0
    17
#include <iterator>  // for iterator_traits
sl@0
    18
#include <utility> // for std::pair
sl@0
    19
sl@0
    20
namespace boost {
sl@0
    21
  namespace lambda {
sl@0
    22
sl@0
    23
namespace ll {
sl@0
    24
sl@0
    25
// for_each ---------------------------------
sl@0
    26
sl@0
    27
struct for_each {
sl@0
    28
  
sl@0
    29
  template <class Args>
sl@0
    30
  struct sig { 
sl@0
    31
    typedef typename boost::remove_const<
sl@0
    32
        typename boost::tuples::element<3, Args>::type 
sl@0
    33
     >::type type; 
sl@0
    34
  };
sl@0
    35
sl@0
    36
  template <class A, class C>
sl@0
    37
  C
sl@0
    38
  operator()(A a, A b, C c) const
sl@0
    39
  { return ::std::for_each(a, b, c); }
sl@0
    40
};
sl@0
    41
sl@0
    42
// find  ---------------------------------
sl@0
    43
sl@0
    44
struct find {
sl@0
    45
  
sl@0
    46
  template <class Args>
sl@0
    47
  struct sig { 
sl@0
    48
    typedef typename boost::remove_const<
sl@0
    49
        typename boost::tuples::element<1, Args>::type 
sl@0
    50
     >::type type; 
sl@0
    51
  };
sl@0
    52
sl@0
    53
  template <class A, class C>
sl@0
    54
  A
sl@0
    55
  operator()(A a, A b, const C& c) const
sl@0
    56
  { return ::std::find(a, b, c); }
sl@0
    57
};
sl@0
    58
sl@0
    59
sl@0
    60
// find_if  ---------------------------------
sl@0
    61
sl@0
    62
struct find_if {
sl@0
    63
  
sl@0
    64
  template <class Args>
sl@0
    65
  struct sig { 
sl@0
    66
    typedef typename boost::remove_const<
sl@0
    67
        typename boost::tuples::element<1, Args>::type 
sl@0
    68
     >::type type; 
sl@0
    69
  };
sl@0
    70
sl@0
    71
  template <class A, class C>
sl@0
    72
  A
sl@0
    73
  operator()(A a, A b, C c) const
sl@0
    74
  { return ::std::find_if(a, b, c); }
sl@0
    75
};
sl@0
    76
sl@0
    77
// find_end  ---------------------------------
sl@0
    78
sl@0
    79
struct find_end {
sl@0
    80
sl@0
    81
  template <class Args>
sl@0
    82
  struct sig { 
sl@0
    83
    typedef typename boost::remove_const<
sl@0
    84
        typename boost::tuples::element<1, Args>::type 
sl@0
    85
     >::type type; 
sl@0
    86
  };
sl@0
    87
sl@0
    88
  template <class A, class C>
sl@0
    89
  A
sl@0
    90
  operator()(A a, A b, C c, C d) const
sl@0
    91
  { return ::std::find_end(a, b, c, d); }
sl@0
    92
sl@0
    93
  template <class A, class C, class E>
sl@0
    94
  A
sl@0
    95
  operator()(A a, A b, C c, C d, E e) const
sl@0
    96
  { return ::std::find_end(a, b, c, d, e); }
sl@0
    97
sl@0
    98
};
sl@0
    99
sl@0
   100
// find_first_of  ---------------------------------
sl@0
   101
sl@0
   102
struct find_first_of {
sl@0
   103
sl@0
   104
  template <class Args>
sl@0
   105
  struct sig { 
sl@0
   106
    typedef typename boost::remove_const<
sl@0
   107
        typename boost::tuples::element<1, Args>::type 
sl@0
   108
     >::type type; 
sl@0
   109
  };
sl@0
   110
sl@0
   111
  template <class A, class C>
sl@0
   112
  A
sl@0
   113
  operator()(A a, A b, C c, C d) const
sl@0
   114
  { return ::std::find_first_of(a, b, c, d); }
sl@0
   115
sl@0
   116
  template <class A, class C, class E>
sl@0
   117
  A
sl@0
   118
  operator()(A a, A b, C c, C d, E e) const
sl@0
   119
  { return ::std::find_first_of(a, b, c, d, e); }
sl@0
   120
sl@0
   121
};
sl@0
   122
sl@0
   123
// adjacent_find  ---------------------------------
sl@0
   124
sl@0
   125
struct adjacent_find {
sl@0
   126
sl@0
   127
  template <class Args>
sl@0
   128
  struct sig { 
sl@0
   129
    typedef typename boost::remove_const<
sl@0
   130
        typename boost::tuples::element<1, Args>::type 
sl@0
   131
     >::type type; 
sl@0
   132
  };
sl@0
   133
sl@0
   134
  template <class A>
sl@0
   135
  A
sl@0
   136
  operator()(A a, A b) const
sl@0
   137
  { return ::std::adjacent_find(a, b); }
sl@0
   138
sl@0
   139
  template <class A, class C>
sl@0
   140
  A
sl@0
   141
  operator()(A a, A b, C c) const
sl@0
   142
  { return ::std::adjacent_find(a, b, c); }
sl@0
   143
sl@0
   144
};
sl@0
   145
sl@0
   146
// count  ---------------------------------
sl@0
   147
sl@0
   148
struct count {
sl@0
   149
sl@0
   150
  template <class Args>
sl@0
   151
  struct sig { 
sl@0
   152
    typedef typename ::std::iterator_traits<
sl@0
   153
      typename boost::remove_const<
sl@0
   154
           typename boost::tuples::element<1, Args>::type
sl@0
   155
      >::type 
sl@0
   156
    >::difference_type type;
sl@0
   157
  };
sl@0
   158
sl@0
   159
  template <class A, class C >
sl@0
   160
  typename ::std::iterator_traits<A>::difference_type
sl@0
   161
  operator()(A a, A b, const C& c) const
sl@0
   162
  { return ::std::count(a, b, c); }
sl@0
   163
};
sl@0
   164
sl@0
   165
// count_if  ---------------------------------
sl@0
   166
sl@0
   167
struct count_if {
sl@0
   168
sl@0
   169
  template <class Args>
sl@0
   170
  struct sig { 
sl@0
   171
    typedef typename ::std::iterator_traits<
sl@0
   172
     typename boost::remove_const<
sl@0
   173
           typename boost::tuples::element<1, Args>::type
sl@0
   174
       >::type
sl@0
   175
    >::difference_type type;
sl@0
   176
  };
sl@0
   177
sl@0
   178
  template <class A, class C >
sl@0
   179
  typename ::std::iterator_traits<A>::difference_type
sl@0
   180
  operator()(A a, A b, C c) const
sl@0
   181
  { return ::std::count_if(a, b, c); }
sl@0
   182
};
sl@0
   183
sl@0
   184
sl@0
   185
// mismatch  ---------------------------------
sl@0
   186
sl@0
   187
struct mismatch {
sl@0
   188
sl@0
   189
  template <class Args>
sl@0
   190
  struct sig { 
sl@0
   191
    typedef typename boost::remove_const<
sl@0
   192
        typename boost::tuples::element<1, Args>::type
sl@0
   193
     >::type element1_type; 
sl@0
   194
sl@0
   195
    typedef typename boost::remove_const<
sl@0
   196
        typename boost::tuples::element<3, Args>::type
sl@0
   197
     >::type element2_type; 
sl@0
   198
sl@0
   199
    typedef ::std::pair< element1_type, element2_type > type;
sl@0
   200
   };
sl@0
   201
sl@0
   202
  template <class A, class C >
sl@0
   203
  ::std::pair<A,C>
sl@0
   204
  operator()(A a, A b, C c) const
sl@0
   205
  { return ::std::mismatch(a, b, c); }
sl@0
   206
sl@0
   207
  template <class A, class C, class D>
sl@0
   208
  ::std::pair<A,C>
sl@0
   209
  operator()(A a, A b, C c, D d) const
sl@0
   210
  { return ::std::mismatch(a, b, c, d); }
sl@0
   211
sl@0
   212
};
sl@0
   213
sl@0
   214
// equal  ---------------------------------
sl@0
   215
sl@0
   216
struct equal {
sl@0
   217
sl@0
   218
  template <class Args>
sl@0
   219
  struct sig { 
sl@0
   220
    typedef bool type;
sl@0
   221
  };
sl@0
   222
sl@0
   223
  template <class A, class C >
sl@0
   224
  bool
sl@0
   225
  operator()(A a, A b, C c) const
sl@0
   226
  { return ::std::equal(a, b, c); }
sl@0
   227
sl@0
   228
  template <class A, class C, class D>
sl@0
   229
  bool
sl@0
   230
  operator()(A a, A b, C c, D d) const
sl@0
   231
  { return ::std::equal(a, b, c, d); }
sl@0
   232
sl@0
   233
};
sl@0
   234
sl@0
   235
// search --------------------------------
sl@0
   236
sl@0
   237
struct search {
sl@0
   238
  
sl@0
   239
  template <class Args>
sl@0
   240
  struct sig { 
sl@0
   241
    typedef typename boost::remove_const<
sl@0
   242
        typename boost::tuples::element<1, Args>::type
sl@0
   243
     >::type type; 
sl@0
   244
  };
sl@0
   245
sl@0
   246
  template <class A, class C>
sl@0
   247
  A
sl@0
   248
  operator()(A a, A b, C c, C d) const
sl@0
   249
  { return std::search(a, b, c, d);}
sl@0
   250
sl@0
   251
  template <class A, class C, class E>
sl@0
   252
  A
sl@0
   253
  operator()(A a, A b, C c, C d, E e) const
sl@0
   254
  { return std::search(a, b, c, d, e);}
sl@0
   255
sl@0
   256
};
sl@0
   257
sl@0
   258
// copy  ---------------------------------
sl@0
   259
sl@0
   260
struct copy {
sl@0
   261
sl@0
   262
  template <class Args>
sl@0
   263
  struct sig { 
sl@0
   264
    typedef typename boost::remove_const<
sl@0
   265
        typename boost::tuples::element<3, Args>::type 
sl@0
   266
     >::type type; 
sl@0
   267
  };
sl@0
   268
sl@0
   269
  template <class A, class C>
sl@0
   270
  C
sl@0
   271
  operator()(A a, A b, C c) const
sl@0
   272
  { return ::std::copy(a, b, c); }
sl@0
   273
sl@0
   274
};
sl@0
   275
sl@0
   276
// copy_backward  ---------------------------------
sl@0
   277
sl@0
   278
struct copy_backward {
sl@0
   279
sl@0
   280
  template <class Args>
sl@0
   281
  struct sig { 
sl@0
   282
    typedef typename boost::remove_const<
sl@0
   283
        typename boost::tuples::element<3, Args>::type 
sl@0
   284
     >::type type; 
sl@0
   285
  };
sl@0
   286
sl@0
   287
  template <class A, class C>
sl@0
   288
  C
sl@0
   289
  operator()(A a, A b, C c) const
sl@0
   290
  { return ::std::copy_backward(a, b, c); }
sl@0
   291
sl@0
   292
};
sl@0
   293
sl@0
   294
// swap  ---------------------------------
sl@0
   295
sl@0
   296
struct swap {
sl@0
   297
sl@0
   298
  template <class Args>
sl@0
   299
  struct sig { 
sl@0
   300
    typedef void type; 
sl@0
   301
  };
sl@0
   302
sl@0
   303
  template <class A>
sl@0
   304
  void
sl@0
   305
  operator()(A a, A b) const
sl@0
   306
  { ::std::swap(a, b); }
sl@0
   307
sl@0
   308
};
sl@0
   309
sl@0
   310
// swap_ranges  ---------------------------------
sl@0
   311
sl@0
   312
struct swap_ranges {
sl@0
   313
sl@0
   314
  template <class Args>
sl@0
   315
  struct sig { 
sl@0
   316
    typedef typename boost::remove_const<
sl@0
   317
        typename boost::tuples::element<3, Args>::type 
sl@0
   318
     >::type type; 
sl@0
   319
  };
sl@0
   320
sl@0
   321
  template <class A, class C>
sl@0
   322
  C
sl@0
   323
  operator()(A a, A b, C c) const
sl@0
   324
  { return ::std::swap_ranges(a, b, c); }
sl@0
   325
sl@0
   326
};
sl@0
   327
sl@0
   328
// iter_swap  ---------------------------------
sl@0
   329
sl@0
   330
struct iter_swap {
sl@0
   331
sl@0
   332
  template <class Args>
sl@0
   333
  struct sig { 
sl@0
   334
     typedef void type; 
sl@0
   335
  };
sl@0
   336
sl@0
   337
  template <class A>
sl@0
   338
  void 
sl@0
   339
  operator()(A a, A b) const
sl@0
   340
  { ::std::iter_swap(a, b); }
sl@0
   341
sl@0
   342
};
sl@0
   343
sl@0
   344
sl@0
   345
// transform --------------------------------
sl@0
   346
sl@0
   347
struct transform {
sl@0
   348
  
sl@0
   349
  template <class Args>
sl@0
   350
  struct sig { 
sl@0
   351
    typedef typename boost::remove_const<
sl@0
   352
        typename boost::tuples::element<
sl@0
   353
          boost::tuples::length<Args>::value - 2, 
sl@0
   354
          Args
sl@0
   355
      >::type
sl@0
   356
     >::type type; 
sl@0
   357
  };
sl@0
   358
sl@0
   359
  template <class A, class C, class D>
sl@0
   360
  C
sl@0
   361
  operator()(A a, A b, C c, D d) const
sl@0
   362
  { return std::transform(a, b, c, d);}
sl@0
   363
sl@0
   364
  template <class A, class C, class D, class E>
sl@0
   365
  D
sl@0
   366
  operator()(A a, A b, C c, D d, E e) const
sl@0
   367
  { return std::transform(a, b, c, d, e);}
sl@0
   368
sl@0
   369
};
sl@0
   370
sl@0
   371
// replace  ---------------------------------
sl@0
   372
sl@0
   373
struct replace {
sl@0
   374
sl@0
   375
  template <class Args>
sl@0
   376
  struct sig {
sl@0
   377
    typedef void type;
sl@0
   378
  };
sl@0
   379
sl@0
   380
  template <class A, class C>
sl@0
   381
  void
sl@0
   382
  operator()(A a, A b, const C& c, const C& d) const
sl@0
   383
  { ::std::replace(a, b, c, d); }
sl@0
   384
sl@0
   385
};
sl@0
   386
sl@0
   387
// replace_if  ---------------------------------
sl@0
   388
sl@0
   389
struct replace_if {
sl@0
   390
sl@0
   391
  template <class Args>
sl@0
   392
  struct sig {
sl@0
   393
    typedef void type;
sl@0
   394
  };
sl@0
   395
sl@0
   396
  template <class A, class C, class D>
sl@0
   397
  void
sl@0
   398
  operator()(A a, A b, C c, const D& d) const
sl@0
   399
  { ::std::replace_if(a, b, c, d); }
sl@0
   400
sl@0
   401
};
sl@0
   402
sl@0
   403
// replace_copy  ---------------------------------
sl@0
   404
sl@0
   405
struct replace_copy {
sl@0
   406
sl@0
   407
 template <class Args>
sl@0
   408
  struct sig { 
sl@0
   409
    typedef typename boost::remove_const<
sl@0
   410
        typename boost::tuples::element<3, Args>::type 
sl@0
   411
     >::type type; 
sl@0
   412
  };
sl@0
   413
sl@0
   414
  template <class A, class C, class D>
sl@0
   415
  C
sl@0
   416
  operator()(A a, A b, C c, const D& d, const D& e) const
sl@0
   417
  { return ::std::replace_copy(a, b, c, d, e); }
sl@0
   418
sl@0
   419
};
sl@0
   420
sl@0
   421
// replace_copy_if  ---------------------------------
sl@0
   422
sl@0
   423
struct replace_copy_if {
sl@0
   424
sl@0
   425
 template <class Args>
sl@0
   426
  struct sig { 
sl@0
   427
    typedef typename boost::remove_const<
sl@0
   428
        typename boost::tuples::element<3, Args>::type 
sl@0
   429
     >::type type; 
sl@0
   430
  };
sl@0
   431
sl@0
   432
  template <class A, class C, class D, class E>
sl@0
   433
  C
sl@0
   434
  operator()(A a, A b, C c, D d, const E& e) const
sl@0
   435
  { return ::std::replace_copy_if(a, b, c, d, e); }
sl@0
   436
sl@0
   437
};
sl@0
   438
sl@0
   439
// fill  ---------------------------------
sl@0
   440
sl@0
   441
struct fill {
sl@0
   442
sl@0
   443
  template <class Args>
sl@0
   444
  struct sig { 
sl@0
   445
     typedef void type; 
sl@0
   446
  };
sl@0
   447
sl@0
   448
  template <class A, class C>
sl@0
   449
  void 
sl@0
   450
  operator()(A a, A b, const C& c) const
sl@0
   451
  { ::std::fill(a, b, c); }
sl@0
   452
sl@0
   453
};
sl@0
   454
sl@0
   455
// fill_n  ---------------------------------
sl@0
   456
sl@0
   457
struct fill_n {
sl@0
   458
sl@0
   459
  template <class Args>
sl@0
   460
  struct sig { 
sl@0
   461
     typedef void type; 
sl@0
   462
  };
sl@0
   463
sl@0
   464
  template <class A, class B, class C>
sl@0
   465
  void 
sl@0
   466
  operator()(A a, B b, const C& c) const
sl@0
   467
  { ::std::fill_n(a, b, c); }
sl@0
   468
sl@0
   469
};
sl@0
   470
sl@0
   471
// generate  ---------------------------------
sl@0
   472
sl@0
   473
struct generate {
sl@0
   474
sl@0
   475
  template <class Args>
sl@0
   476
  struct sig { 
sl@0
   477
     typedef void type; 
sl@0
   478
  };
sl@0
   479
sl@0
   480
  template <class A, class C>
sl@0
   481
  void 
sl@0
   482
  operator()(A a, A b, C c) const
sl@0
   483
  { ::std::generate(a, b, c); }
sl@0
   484
sl@0
   485
};
sl@0
   486
sl@0
   487
// generate_n  ---------------------------------
sl@0
   488
sl@0
   489
struct generate_n {
sl@0
   490
sl@0
   491
  template <class Args>
sl@0
   492
  struct sig { 
sl@0
   493
     typedef void type; 
sl@0
   494
  };
sl@0
   495
sl@0
   496
  template <class A, class B, class C>
sl@0
   497
  void 
sl@0
   498
  operator()(A a, B b, C c) const
sl@0
   499
  { ::std::generate_n(a, b, c); }
sl@0
   500
sl@0
   501
};
sl@0
   502
sl@0
   503
// remove  ---------------------------------
sl@0
   504
sl@0
   505
struct remove {
sl@0
   506
sl@0
   507
  template <class Args>
sl@0
   508
  struct sig { 
sl@0
   509
    typedef typename boost::remove_const<
sl@0
   510
        typename boost::tuples::element<1, Args>::type 
sl@0
   511
     >::type type; 
sl@0
   512
  };
sl@0
   513
sl@0
   514
  template <class A, class C >
sl@0
   515
  A
sl@0
   516
  operator()(A a, A b, const C& c) const
sl@0
   517
  { return ::std::remove(a, b, c); }
sl@0
   518
};
sl@0
   519
sl@0
   520
// remove_if  ---------------------------------
sl@0
   521
sl@0
   522
struct remove_if {
sl@0
   523
sl@0
   524
  template <class Args>
sl@0
   525
  struct sig { 
sl@0
   526
    typedef typename boost::remove_const<
sl@0
   527
       typename boost::tuples::element<1, Args>::type
sl@0
   528
     >::type type; 
sl@0
   529
  };
sl@0
   530
sl@0
   531
  template <class A, class C >
sl@0
   532
  A
sl@0
   533
  operator()(A a, A b, C c) const
sl@0
   534
  { return ::std::remove_if(a, b, c); }
sl@0
   535
};
sl@0
   536
sl@0
   537
// remove_copy  ---------------------------------
sl@0
   538
sl@0
   539
struct remove_copy {
sl@0
   540
sl@0
   541
  template <class Args>
sl@0
   542
  struct sig { 
sl@0
   543
    typedef typename boost::remove_const<
sl@0
   544
       typename boost::tuples::element<3, Args>::type
sl@0
   545
     >::type type; 
sl@0
   546
  };
sl@0
   547
sl@0
   548
  template <class A, class C, class D >
sl@0
   549
  C
sl@0
   550
  operator()(A a, A b, C c, const D& d) const
sl@0
   551
  { return ::std::remove_copy(a, b, c, d); }
sl@0
   552
};
sl@0
   553
sl@0
   554
// remove_copy_if  ---------------------------------
sl@0
   555
sl@0
   556
struct remove_copy_if {
sl@0
   557
sl@0
   558
  template <class Args>
sl@0
   559
  struct sig { 
sl@0
   560
    typedef typename boost::remove_const<
sl@0
   561
       typename boost::tuples::element<3, Args>::type
sl@0
   562
     >::type type; 
sl@0
   563
  };
sl@0
   564
sl@0
   565
  template <class A, class C, class D >
sl@0
   566
  C
sl@0
   567
  operator()(A a, A b, C c, D d) const
sl@0
   568
  { return ::std::remove_copy_if(a, b, c, d); }
sl@0
   569
};
sl@0
   570
sl@0
   571
// unique  ---------------------------------
sl@0
   572
sl@0
   573
struct unique {
sl@0
   574
sl@0
   575
  template <class Args>
sl@0
   576
  struct sig { 
sl@0
   577
    typedef typename boost::remove_const<
sl@0
   578
        typename boost::tuples::element<1, Args>::type 
sl@0
   579
     >::type type; 
sl@0
   580
  };
sl@0
   581
sl@0
   582
  template <class A>
sl@0
   583
  A
sl@0
   584
  operator()(A a, A b) const
sl@0
   585
  { return ::std::unique(a, b); }
sl@0
   586
sl@0
   587
  template <class A, class C>
sl@0
   588
  A
sl@0
   589
  operator()(A a, A b, C c) const
sl@0
   590
  { return ::std::unique(a, b, c); }
sl@0
   591
sl@0
   592
};
sl@0
   593
sl@0
   594
// unique_copy  ---------------------------------
sl@0
   595
sl@0
   596
struct unique_copy {
sl@0
   597
sl@0
   598
  template <class Args>
sl@0
   599
  struct sig { 
sl@0
   600
    typedef typename boost::remove_const<
sl@0
   601
        typename boost::tuples::element<3, Args>::type 
sl@0
   602
     >::type type; 
sl@0
   603
  };
sl@0
   604
sl@0
   605
  template <class A, class C >
sl@0
   606
  C
sl@0
   607
  operator()(A a, A b, C c) const
sl@0
   608
  { return ::std::unique_copy(a, b, c); }
sl@0
   609
sl@0
   610
  template <class A, class C, class D>
sl@0
   611
  C
sl@0
   612
  operator()(A a, A b, C c, D d) const
sl@0
   613
  { return ::std::unique_copy(a, b, c, d); }
sl@0
   614
sl@0
   615
};
sl@0
   616
sl@0
   617
// reverse  ---------------------------------
sl@0
   618
sl@0
   619
struct reverse {
sl@0
   620
sl@0
   621
  template <class Args>
sl@0
   622
  struct sig { 
sl@0
   623
    typedef void type; 
sl@0
   624
  };
sl@0
   625
sl@0
   626
  template <class A>
sl@0
   627
  void
sl@0
   628
  operator()(A a, A b) const
sl@0
   629
  { ::std::reverse(a, b); }
sl@0
   630
sl@0
   631
};
sl@0
   632
sl@0
   633
// reverse_copy  ---------------------------------
sl@0
   634
sl@0
   635
struct reverse_copy {
sl@0
   636
sl@0
   637
  template <class Args>
sl@0
   638
  struct sig { 
sl@0
   639
    typedef typename boost::remove_const<
sl@0
   640
        typename boost::tuples::element<3, Args>::type 
sl@0
   641
     >::type type; 
sl@0
   642
  };
sl@0
   643
sl@0
   644
  template <class A, class C >
sl@0
   645
  C
sl@0
   646
  operator()(A a, A b, C c) const
sl@0
   647
  { return ::std::reverse_copy(a, b, c); }
sl@0
   648
sl@0
   649
};
sl@0
   650
sl@0
   651
// rotate  ---------------------------------
sl@0
   652
sl@0
   653
struct rotate {
sl@0
   654
sl@0
   655
  template <class Args>
sl@0
   656
  struct sig { 
sl@0
   657
    typedef void type; 
sl@0
   658
  };
sl@0
   659
sl@0
   660
  template <class A>
sl@0
   661
  void
sl@0
   662
  operator()(A a, A b, A c) const
sl@0
   663
  { ::std::rotate(a, b, c); }
sl@0
   664
sl@0
   665
};
sl@0
   666
sl@0
   667
// rotate_copy  ---------------------------------
sl@0
   668
sl@0
   669
struct rotate_copy {
sl@0
   670
sl@0
   671
  template <class Args>
sl@0
   672
  struct sig { 
sl@0
   673
    typedef typename boost::remove_const<
sl@0
   674
        typename boost::tuples::element<3, Args>::type 
sl@0
   675
     >::type type; 
sl@0
   676
  };
sl@0
   677
sl@0
   678
  template <class A, class D>
sl@0
   679
  D
sl@0
   680
  operator()(A a, A b, A c, D d) const
sl@0
   681
  { return ::std::rotate_copy(a, b, c, d); }
sl@0
   682
sl@0
   683
};
sl@0
   684
sl@0
   685
// random_shuffle  ---------------------------------
sl@0
   686
sl@0
   687
struct random_shuffle {
sl@0
   688
sl@0
   689
  template <class Args>
sl@0
   690
  struct sig { 
sl@0
   691
    typedef void type; 
sl@0
   692
  };
sl@0
   693
sl@0
   694
  template <class A>
sl@0
   695
  void
sl@0
   696
  operator()(A a, A b) const
sl@0
   697
  { ::std::random_shuffle(a, b); }
sl@0
   698
sl@0
   699
  template <class A, class C>
sl@0
   700
  void
sl@0
   701
  operator()(A a, A b, const C& c) const
sl@0
   702
  { ::std::random_shuffle(a, b, c); }
sl@0
   703
sl@0
   704
};
sl@0
   705
sl@0
   706
sl@0
   707
// partition  ---------------------------------
sl@0
   708
sl@0
   709
struct partition {
sl@0
   710
sl@0
   711
  template <class Args>
sl@0
   712
  struct sig { 
sl@0
   713
    typedef typename boost::remove_const<
sl@0
   714
        typename boost::tuples::element<1, Args>::type 
sl@0
   715
     >::type type; 
sl@0
   716
  };
sl@0
   717
sl@0
   718
  template <class A, class C>
sl@0
   719
  A
sl@0
   720
  operator()(A a, A b, C c) const
sl@0
   721
  { return ::std::partition(a, b, c); }
sl@0
   722
sl@0
   723
};
sl@0
   724
sl@0
   725
// stable_partition  ---------------------------------
sl@0
   726
sl@0
   727
struct stable_partition {
sl@0
   728
sl@0
   729
  template <class Args>
sl@0
   730
  struct sig { 
sl@0
   731
    typedef typename boost::remove_const<
sl@0
   732
        typename boost::tuples::element<1, Args>::type 
sl@0
   733
     >::type type; 
sl@0
   734
  };
sl@0
   735
sl@0
   736
  template <class A, class C>
sl@0
   737
  A
sl@0
   738
  operator()(A a, A b, C c) const
sl@0
   739
  { return ::std::stable_partition(a, b, c); }
sl@0
   740
sl@0
   741
};
sl@0
   742
sl@0
   743
// sort  ---------------------------------
sl@0
   744
sl@0
   745
struct sort {
sl@0
   746
sl@0
   747
  template <class Args>
sl@0
   748
  struct sig { 
sl@0
   749
     typedef void type; 
sl@0
   750
  };
sl@0
   751
sl@0
   752
  template <class A>
sl@0
   753
  void 
sl@0
   754
  operator()(A a, A b) const
sl@0
   755
  { ::std::sort(a, b); }
sl@0
   756
sl@0
   757
  template <class A, class C>
sl@0
   758
  void 
sl@0
   759
  operator()(A a, A b, C c) const
sl@0
   760
  { ::std::sort(a, b, c); }
sl@0
   761
sl@0
   762
};
sl@0
   763
sl@0
   764
// stable_sort  ---------------------------------
sl@0
   765
sl@0
   766
struct stable_sort {
sl@0
   767
sl@0
   768
  template <class Args>
sl@0
   769
  struct sig { 
sl@0
   770
     typedef void type; 
sl@0
   771
  };
sl@0
   772
sl@0
   773
  template <class A>
sl@0
   774
  void 
sl@0
   775
  operator()(A a, A b) const
sl@0
   776
  { ::std::stable_sort(a, b); }
sl@0
   777
sl@0
   778
  template <class A, class C>
sl@0
   779
  void 
sl@0
   780
  operator()(A a, A b, C c) const
sl@0
   781
  { ::std::stable_sort(a, b, c); }
sl@0
   782
sl@0
   783
};
sl@0
   784
sl@0
   785
// partial_sort  ---------------------------------
sl@0
   786
sl@0
   787
struct partial_sort {
sl@0
   788
sl@0
   789
  template <class Args>
sl@0
   790
  struct sig { 
sl@0
   791
     typedef void type; 
sl@0
   792
  };
sl@0
   793
sl@0
   794
  template <class A>
sl@0
   795
  void 
sl@0
   796
  operator()(A a, A b, A c) const
sl@0
   797
  { ::std::partial_sort(a, b, c); }
sl@0
   798
sl@0
   799
  template <class A, class D>
sl@0
   800
  void 
sl@0
   801
  operator()(A a, A b, A c, D d) const
sl@0
   802
  { ::std::partial_sort(a, b, c, d); }
sl@0
   803
sl@0
   804
};
sl@0
   805
sl@0
   806
// partial_sort_copy  ---------------------------------
sl@0
   807
sl@0
   808
struct partial_sort_copy {
sl@0
   809
sl@0
   810
  template <class Args>
sl@0
   811
  struct sig { 
sl@0
   812
    typedef typename boost::remove_const<
sl@0
   813
       typename boost::tuples::element<3, Args>::type
sl@0
   814
     >::type type; 
sl@0
   815
  };
sl@0
   816
sl@0
   817
  template <class A, class C>
sl@0
   818
  C
sl@0
   819
  operator()(A a, A b, C c, C d) const
sl@0
   820
  { return ::std::partial_sort_copy(a, b, c, d); }
sl@0
   821
sl@0
   822
  template <class A, class C, class E >
sl@0
   823
  C
sl@0
   824
  operator()(A a, A b, C c, C d, E e) const
sl@0
   825
  { return ::std::partial_sort_copy(a, b, c, d, e); }
sl@0
   826
};
sl@0
   827
sl@0
   828
// nth_element  ---------------------------------
sl@0
   829
sl@0
   830
struct nth_element {
sl@0
   831
sl@0
   832
  template <class Args>
sl@0
   833
  struct sig { 
sl@0
   834
     typedef void type; 
sl@0
   835
  };
sl@0
   836
sl@0
   837
  template <class A>
sl@0
   838
  void 
sl@0
   839
  operator()(A a, A b, A c) const
sl@0
   840
  { ::std::nth_element(a, b, c); }
sl@0
   841
sl@0
   842
  template <class A, class D>
sl@0
   843
  void 
sl@0
   844
  operator()(A a, A b, A c, D d) const
sl@0
   845
  { ::std::nth_element(a, b, c, d); }
sl@0
   846
sl@0
   847
};
sl@0
   848
sl@0
   849
// lower_bound  ---------------------------------
sl@0
   850
sl@0
   851
struct lower_bound {
sl@0
   852
sl@0
   853
  template <class Args>
sl@0
   854
  struct sig { 
sl@0
   855
    typedef typename boost::remove_const<
sl@0
   856
        typename boost::tuples::element<1, Args>::type 
sl@0
   857
     >::type type; 
sl@0
   858
  };
sl@0
   859
sl@0
   860
  template <class A, class C>
sl@0
   861
  A
sl@0
   862
  operator()(A a, A b, const C& c) const
sl@0
   863
  { return ::std::lower_bound(a, b, c); }
sl@0
   864
sl@0
   865
  template <class A, class C, class D>
sl@0
   866
  A
sl@0
   867
  operator()(A a, A b, const C& c, D d) const
sl@0
   868
  { return ::std::lower_bound(a, b, c, d); }
sl@0
   869
sl@0
   870
};
sl@0
   871
sl@0
   872
// upper_bound  ---------------------------------
sl@0
   873
sl@0
   874
struct upper_bound {
sl@0
   875
sl@0
   876
  template <class Args>
sl@0
   877
  struct sig { 
sl@0
   878
    typedef typename boost::remove_const<
sl@0
   879
        typename boost::tuples::element<1, Args>::type 
sl@0
   880
     >::type type; 
sl@0
   881
  };
sl@0
   882
sl@0
   883
  template <class A, class C>
sl@0
   884
  A
sl@0
   885
  operator()(A a, A b, const C& c) const
sl@0
   886
  { return ::std::upper_bound(a, b, c); }
sl@0
   887
sl@0
   888
  template <class A, class C, class D>
sl@0
   889
  A
sl@0
   890
  operator()(A a, A b, const C& c, D d) const
sl@0
   891
  { return ::std::upper_bound(a, b, c, d); }
sl@0
   892
sl@0
   893
};
sl@0
   894
sl@0
   895
// equal_range  ---------------------------------
sl@0
   896
sl@0
   897
struct equal_range {
sl@0
   898
sl@0
   899
 template <class Args>
sl@0
   900
  struct sig { 
sl@0
   901
    typedef typename boost::remove_const<
sl@0
   902
        typename boost::tuples::element<1, Args>::type
sl@0
   903
     >::type element_type; 
sl@0
   904
sl@0
   905
    typedef ::std::pair< element_type, element_type > type;
sl@0
   906
   };
sl@0
   907
sl@0
   908
  template <class A, class C>
sl@0
   909
  ::std::pair<A,A>
sl@0
   910
  operator()(A a, A b, const C& c) const
sl@0
   911
  { return ::std::equal_range(a, b, c); }
sl@0
   912
sl@0
   913
  template <class A, class C, class D>
sl@0
   914
  ::std::pair<A,A>
sl@0
   915
  operator()(A a, A b, const C& c, D d) const
sl@0
   916
  { return ::std::equal_range(a, b, c, d); }
sl@0
   917
sl@0
   918
};
sl@0
   919
sl@0
   920
// binary_search  ---------------------------------
sl@0
   921
sl@0
   922
struct binary_search {
sl@0
   923
sl@0
   924
  template <class Args>
sl@0
   925
  struct sig { 
sl@0
   926
    typedef bool type;
sl@0
   927
  };
sl@0
   928
sl@0
   929
  template <class A, class C >
sl@0
   930
  bool
sl@0
   931
  operator()(A a, A b, const C& c) const
sl@0
   932
  { return ::std::binary_search(a, b, c); }
sl@0
   933
sl@0
   934
  template <class A, class C, class D>
sl@0
   935
  bool
sl@0
   936
  operator()(A a, A b, const C& c, D d) const
sl@0
   937
  { return ::std::binary_search(a, b, c, d); }
sl@0
   938
sl@0
   939
};
sl@0
   940
sl@0
   941
// merge --------------------------------
sl@0
   942
sl@0
   943
struct merge {
sl@0
   944
  
sl@0
   945
  template <class Args>
sl@0
   946
  struct sig { 
sl@0
   947
    typedef typename boost::remove_const<
sl@0
   948
        typename boost::tuples::element<5, Args>::type 
sl@0
   949
     >::type type; 
sl@0
   950
  };
sl@0
   951
sl@0
   952
  template <class A, class C, class E>
sl@0
   953
  E
sl@0
   954
  operator()(A a, A b, C c, C d, E e) const
sl@0
   955
  { return std::merge(a, b, c, d, e);}
sl@0
   956
sl@0
   957
  template <class A, class C, class E, class F>
sl@0
   958
  E
sl@0
   959
  operator()(A a, A b, C c, C d, E e, F f) const
sl@0
   960
  { return std::merge(a, b, c, d, e, f);}
sl@0
   961
sl@0
   962
};
sl@0
   963
sl@0
   964
// inplace_merge  ---------------------------------
sl@0
   965
sl@0
   966
struct inplace_merge {
sl@0
   967
sl@0
   968
  template <class Args>
sl@0
   969
  struct sig {
sl@0
   970
    typedef void type;
sl@0
   971
  };
sl@0
   972
sl@0
   973
  template <class A>
sl@0
   974
  void
sl@0
   975
  operator()(A a, A b, A c) const
sl@0
   976
  { ::std::inplace_merge(a, b, c); }
sl@0
   977
sl@0
   978
  template <class A, class D>
sl@0
   979
  void
sl@0
   980
  operator()(A a, A b, A c, D d) const
sl@0
   981
  { ::std::inplace_merge(a, b, c, d); }
sl@0
   982
sl@0
   983
};
sl@0
   984
sl@0
   985
// includes  ---------------------------------
sl@0
   986
sl@0
   987
struct includes {
sl@0
   988
sl@0
   989
  template <class Args>
sl@0
   990
  struct sig { 
sl@0
   991
    typedef bool type;
sl@0
   992
  };
sl@0
   993
sl@0
   994
  template <class A, class C>
sl@0
   995
  bool
sl@0
   996
  operator()(A a, A b, C c, C d) const
sl@0
   997
  { return ::std::includes(a, b, c, d); }
sl@0
   998
sl@0
   999
  template <class A, class C, class E>
sl@0
  1000
  bool
sl@0
  1001
  operator()(A a, A b, C c, C d, E e) const
sl@0
  1002
  { return ::std::includes(a, b, c, d, e); }
sl@0
  1003
sl@0
  1004
};
sl@0
  1005
sl@0
  1006
// set_union --------------------------------
sl@0
  1007
sl@0
  1008
struct set_union {
sl@0
  1009
  
sl@0
  1010
  template <class Args>
sl@0
  1011
  struct sig { 
sl@0
  1012
    typedef typename boost::remove_const<
sl@0
  1013
        typename boost::tuples::element<5, Args>::type 
sl@0
  1014
     >::type type; 
sl@0
  1015
  };
sl@0
  1016
sl@0
  1017
  template <class A, class C, class E>
sl@0
  1018
  E
sl@0
  1019
  operator()(A a, A b, C c, C d, E e) const
sl@0
  1020
  { return std::set_union(a, b, c, d, e);}
sl@0
  1021
sl@0
  1022
  template <class A, class C, class E, class F>
sl@0
  1023
  E
sl@0
  1024
  operator()(A a, A b, C c, C d, E e, F f) const
sl@0
  1025
  { return std::set_union(a, b, c, d, e, f);}
sl@0
  1026
sl@0
  1027
};
sl@0
  1028
sl@0
  1029
// set_intersection --------------------------------
sl@0
  1030
sl@0
  1031
struct set_intersection {
sl@0
  1032
  
sl@0
  1033
  template <class Args>
sl@0
  1034
  struct sig { 
sl@0
  1035
    typedef typename boost::remove_const<
sl@0
  1036
        typename boost::tuples::element<5, Args>::type 
sl@0
  1037
     >::type type; 
sl@0
  1038
  };
sl@0
  1039
sl@0
  1040
  template <class A, class C, class E>
sl@0
  1041
  E
sl@0
  1042
  operator()(A a, A b, C c, C d, E e) const
sl@0
  1043
  { return std::set_intersection(a, b, c, d, e);}
sl@0
  1044
sl@0
  1045
  template <class A, class C, class E, class F>
sl@0
  1046
  E
sl@0
  1047
  operator()(A a,  A b, C c, C d, E e, F f) const
sl@0
  1048
  { return std::set_intersection(a, b, c, d, e, f);}
sl@0
  1049
sl@0
  1050
};
sl@0
  1051
sl@0
  1052
// set_difference --------------------------------
sl@0
  1053
sl@0
  1054
struct set_difference {
sl@0
  1055
  
sl@0
  1056
  template <class Args>
sl@0
  1057
  struct sig { 
sl@0
  1058
    typedef typename boost::remove_const<
sl@0
  1059
        typename boost::tuples::element<5, Args>::type 
sl@0
  1060
     >::type type; 
sl@0
  1061
  };
sl@0
  1062
sl@0
  1063
  template <class A, class C, class E>
sl@0
  1064
  E
sl@0
  1065
  operator()(A a, A b, C c, C d, E e) const
sl@0
  1066
  { return std::set_difference(a, b, c, d, e);}
sl@0
  1067
sl@0
  1068
  template <class A, class C, class E, class F>
sl@0
  1069
  E
sl@0
  1070
  operator()(A a, A b, C c, C d, E e, F f) const
sl@0
  1071
  { return std::set_difference(a, b, c, d, e, f);}
sl@0
  1072
sl@0
  1073
};
sl@0
  1074
sl@0
  1075
sl@0
  1076
// set_symmetric_difference --------------------------------
sl@0
  1077
sl@0
  1078
struct set_symmetric_difference {
sl@0
  1079
  
sl@0
  1080
  template <class Args>
sl@0
  1081
  struct sig { 
sl@0
  1082
    typedef typename boost::remove_const<
sl@0
  1083
        typename boost::tuples::element<5, Args>::type 
sl@0
  1084
     >::type type; 
sl@0
  1085
  };
sl@0
  1086
sl@0
  1087
  template <class A, class C, class E>
sl@0
  1088
  E
sl@0
  1089
  operator()(A a, A b, C c, C d, E e) const
sl@0
  1090
  { return std::set_symmetric_difference(a, b, c, d, e);}
sl@0
  1091
sl@0
  1092
  template <class A, class C, class E, class F>
sl@0
  1093
  E
sl@0
  1094
  operator()(A a, A b, C c, C d, E e, F f) const
sl@0
  1095
  { return std::set_symmetric_difference(a, b, c, d, e, f);}
sl@0
  1096
sl@0
  1097
};
sl@0
  1098
sl@0
  1099
// push_heap  ---------------------------------
sl@0
  1100
sl@0
  1101
struct push_heap {
sl@0
  1102
sl@0
  1103
  template <class Args>
sl@0
  1104
  struct sig { 
sl@0
  1105
    typedef void type; 
sl@0
  1106
  };
sl@0
  1107
sl@0
  1108
  template <class A>
sl@0
  1109
  void
sl@0
  1110
  operator()(A a, A b) const
sl@0
  1111
  { ::std::push_heap(a, b); }
sl@0
  1112
sl@0
  1113
  template <class A, class C>
sl@0
  1114
  void
sl@0
  1115
  operator()(A a, A b, C c) const
sl@0
  1116
  { ::std::push_heap(a, b, c); }
sl@0
  1117
sl@0
  1118
};
sl@0
  1119
sl@0
  1120
// pop_heap  ---------------------------------
sl@0
  1121
sl@0
  1122
struct pop_heap {
sl@0
  1123
sl@0
  1124
  template <class Args>
sl@0
  1125
  struct sig { 
sl@0
  1126
    typedef void type; 
sl@0
  1127
  };
sl@0
  1128
sl@0
  1129
  template <class A>
sl@0
  1130
  void
sl@0
  1131
  operator()(A a, A b) const
sl@0
  1132
  { ::std::pop_heap(a, b); }
sl@0
  1133
sl@0
  1134
  template <class A, class C>
sl@0
  1135
  void
sl@0
  1136
  operator()(A a, A b, C c) const
sl@0
  1137
  { ::std::pop_heap(a, b, c); }
sl@0
  1138
sl@0
  1139
};
sl@0
  1140
sl@0
  1141
sl@0
  1142
// make_heap  ---------------------------------
sl@0
  1143
sl@0
  1144
struct make_heap {
sl@0
  1145
sl@0
  1146
  template <class Args>
sl@0
  1147
  struct sig { 
sl@0
  1148
    typedef void type; 
sl@0
  1149
  };
sl@0
  1150
sl@0
  1151
  template <class A>
sl@0
  1152
  void
sl@0
  1153
  operator()(A a, A b) const
sl@0
  1154
  { ::std::make_heap(a, b); }
sl@0
  1155
sl@0
  1156
  template <class A, class C>
sl@0
  1157
  void
sl@0
  1158
  operator()(A a, A b, C c) const
sl@0
  1159
  { ::std::make_heap(a, b, c); }
sl@0
  1160
sl@0
  1161
};
sl@0
  1162
sl@0
  1163
// sort_heap  ---------------------------------
sl@0
  1164
sl@0
  1165
struct sort_heap {
sl@0
  1166
sl@0
  1167
  template <class Args>
sl@0
  1168
  struct sig { 
sl@0
  1169
    typedef void type; 
sl@0
  1170
  };
sl@0
  1171
sl@0
  1172
  template <class A>
sl@0
  1173
  void
sl@0
  1174
  operator()(A a, A b) const
sl@0
  1175
  { ::std::sort_heap(a, b); }
sl@0
  1176
sl@0
  1177
  template <class A, class C>
sl@0
  1178
  void
sl@0
  1179
  operator()(A a, A b, C c) const
sl@0
  1180
  { ::std::sort_heap(a, b, c); }
sl@0
  1181
sl@0
  1182
};
sl@0
  1183
sl@0
  1184
// min  ---------------------------------
sl@0
  1185
sl@0
  1186
struct min {
sl@0
  1187
sl@0
  1188
  template <class Args>
sl@0
  1189
  struct sig { 
sl@0
  1190
    typedef typename boost::remove_const<
sl@0
  1191
        typename boost::tuples::element<1, Args>::type 
sl@0
  1192
     >::type type; 
sl@0
  1193
  };
sl@0
  1194
sl@0
  1195
  template <class A>
sl@0
  1196
  A
sl@0
  1197
  operator()(const A& a, const A& b) const
sl@0
  1198
  { return (::std::min)(a, b); }
sl@0
  1199
sl@0
  1200
  template <class A, class C>
sl@0
  1201
  A
sl@0
  1202
  operator()(const A& a, const A& b, C c) const
sl@0
  1203
  { return (::std::min)(a, b, c); }
sl@0
  1204
sl@0
  1205
};
sl@0
  1206
sl@0
  1207
// max  ---------------------------------
sl@0
  1208
sl@0
  1209
struct max {
sl@0
  1210
sl@0
  1211
  template <class Args>
sl@0
  1212
  struct sig { 
sl@0
  1213
    typedef typename boost::remove_const<
sl@0
  1214
        typename boost::tuples::element<1, Args>::type 
sl@0
  1215
     >::type type; 
sl@0
  1216
  };
sl@0
  1217
sl@0
  1218
  template <class A>
sl@0
  1219
  A
sl@0
  1220
  operator()(const A& a, const A& b) const
sl@0
  1221
  { return (::std::max)(a, b); }
sl@0
  1222
sl@0
  1223
  template <class A, class C>
sl@0
  1224
  A
sl@0
  1225
  operator()(const A& a, const A& b, C c) const
sl@0
  1226
  { return (::std::max)(a, b, c); }
sl@0
  1227
sl@0
  1228
};
sl@0
  1229
sl@0
  1230
struct min_element {
sl@0
  1231
sl@0
  1232
  template <class Args>
sl@0
  1233
  struct sig { 
sl@0
  1234
    typedef typename boost::remove_const<
sl@0
  1235
        typename boost::tuples::element<1, Args>::type 
sl@0
  1236
     >::type type; 
sl@0
  1237
  };
sl@0
  1238
sl@0
  1239
  template <class A>
sl@0
  1240
  A
sl@0
  1241
  operator()(A a, A b) const
sl@0
  1242
  { return ::std::min_element(a, b); }
sl@0
  1243
sl@0
  1244
  template <class A, class C>
sl@0
  1245
  A
sl@0
  1246
  operator()(A a, A b, C c) const
sl@0
  1247
  { return ::std::min_element(a, b, c); }
sl@0
  1248
sl@0
  1249
};
sl@0
  1250
sl@0
  1251
// max_element  ---------------------------------
sl@0
  1252
sl@0
  1253
struct max_element {
sl@0
  1254
sl@0
  1255
  template <class Args>
sl@0
  1256
  struct sig { 
sl@0
  1257
    typedef typename boost::remove_const<
sl@0
  1258
        typename boost::tuples::element<1, Args>::type 
sl@0
  1259
     >::type type; 
sl@0
  1260
  };
sl@0
  1261
sl@0
  1262
  template <class A>
sl@0
  1263
  A
sl@0
  1264
  operator()(A a, A b) const
sl@0
  1265
  { return ::std::max_element(a, b); }
sl@0
  1266
sl@0
  1267
  template <class A, class C>
sl@0
  1268
  A
sl@0
  1269
  operator()(A a, A b, C c) const
sl@0
  1270
  { return ::std::max_element(a, b, c); }
sl@0
  1271
sl@0
  1272
};
sl@0
  1273
sl@0
  1274
sl@0
  1275
// lexicographical_compare  ---------------------------------
sl@0
  1276
sl@0
  1277
struct lexicographical_compare {
sl@0
  1278
sl@0
  1279
  template <class Args>
sl@0
  1280
  struct sig { 
sl@0
  1281
    typedef bool type;
sl@0
  1282
  };
sl@0
  1283
sl@0
  1284
  template <class A, class C>
sl@0
  1285
  bool
sl@0
  1286
  operator()(A a, A b, C c, C d) const
sl@0
  1287
  { return ::std::lexicographical_compare(a, b, c, d); }
sl@0
  1288
sl@0
  1289
  template <class A, class C, class E>
sl@0
  1290
  bool
sl@0
  1291
  operator()(A a, A b, C c, C d, E e) const
sl@0
  1292
  { return ::std::lexicographical_compare(a, b, c, d, e); }
sl@0
  1293
sl@0
  1294
};
sl@0
  1295
sl@0
  1296
// next_permutation  ---------------------------------
sl@0
  1297
sl@0
  1298
struct next_permutation {
sl@0
  1299
sl@0
  1300
  template <class Args>
sl@0
  1301
  struct sig { 
sl@0
  1302
    typedef bool type;
sl@0
  1303
  };
sl@0
  1304
sl@0
  1305
  template <class A>
sl@0
  1306
  bool
sl@0
  1307
  operator()(A a, A b) const
sl@0
  1308
  { return ::std::next_permutation(a, b); }
sl@0
  1309
sl@0
  1310
  template <class A, class C >
sl@0
  1311
  bool
sl@0
  1312
  operator()(A a, A b, C c) const
sl@0
  1313
  { return ::std::next_permutation(a, b, c); }
sl@0
  1314
sl@0
  1315
};
sl@0
  1316
sl@0
  1317
// prev_permutation  ---------------------------------
sl@0
  1318
sl@0
  1319
struct prev_permutation {
sl@0
  1320
sl@0
  1321
  template <class Args>
sl@0
  1322
  struct sig { 
sl@0
  1323
    typedef bool type;
sl@0
  1324
  };
sl@0
  1325
sl@0
  1326
  template <class A>
sl@0
  1327
  bool
sl@0
  1328
  operator()(A a, A b) const
sl@0
  1329
  { return ::std::prev_permutation(a, b); }
sl@0
  1330
sl@0
  1331
  template <class A, class C >
sl@0
  1332
  bool
sl@0
  1333
  operator()(A a, A b, C c) const
sl@0
  1334
  { return ::std::prev_permutation(a, b, c); }
sl@0
  1335
sl@0
  1336
};
sl@0
  1337
sl@0
  1338
sl@0
  1339
sl@0
  1340
sl@0
  1341
sl@0
  1342
} // end of ll namespace
sl@0
  1343
sl@0
  1344
// There is no good way to call an overloaded member function in a 
sl@0
  1345
// lambda expression. 
sl@0
  1346
// The macro below defines a function object class for calling a
sl@0
  1347
// const_iterator returning member function of a container.
sl@0
  1348
sl@0
  1349
#define CALL_MEMBER(X)                                     \
sl@0
  1350
struct call_##X {                                          \
sl@0
  1351
template <class Args>                                      \
sl@0
  1352
  struct sig {                                             \
sl@0
  1353
    typedef typename boost::remove_const<                  \
sl@0
  1354
        typename boost::tuples::element<1, Args>::type     \
sl@0
  1355
     >::type::const_iterator type;                         \
sl@0
  1356
  };                                                       \
sl@0
  1357
                                                           \
sl@0
  1358
  template<class T>                                        \
sl@0
  1359
  typename T::const_iterator                               \
sl@0
  1360
  operator()(const T& t) const                             \
sl@0
  1361
  {                                                        \
sl@0
  1362
    return t.X();                                          \
sl@0
  1363
  }                                                        \
sl@0
  1364
};
sl@0
  1365
sl@0
  1366
// create call_begin and call_end classes
sl@0
  1367
CALL_MEMBER(begin)
sl@0
  1368
CALL_MEMBER(end)
sl@0
  1369
sl@0
  1370
#undef CALL_MEMBER
sl@0
  1371
sl@0
  1372
} // end of lambda namespace
sl@0
  1373
} // end of boost namespace
sl@0
  1374
sl@0
  1375
sl@0
  1376
sl@0
  1377
#endif