epoc32/include/stdapis/boost/functional.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
// ------------------------------------------------------------------------------
williamr@2
     2
// Copyright (c) 2000 Cadenza New Zealand Ltd
williamr@2
     3
// Distributed under the Boost Software License, Version 1.0. (See accompany-
williamr@2
     4
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     5
// ------------------------------------------------------------------------------
williamr@2
     6
// Boost functional.hpp header file
williamr@2
     7
// See http://www.boost.org/libs/functional for documentation.
williamr@2
     8
// ------------------------------------------------------------------------------
williamr@2
     9
// $Id: functional.hpp,v 1.4.20.1 2006/12/02 14:17:26 andreas_huber69 Exp $
williamr@2
    10
// ------------------------------------------------------------------------------
williamr@2
    11
williamr@2
    12
#ifndef BOOST_FUNCTIONAL_HPP
williamr@2
    13
#define BOOST_FUNCTIONAL_HPP
williamr@2
    14
williamr@2
    15
#include <boost/config.hpp>
williamr@2
    16
#include <boost/call_traits.hpp>
williamr@2
    17
#include <functional>
williamr@2
    18
williamr@2
    19
namespace boost
williamr@2
    20
{
williamr@2
    21
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
williamr@2
    22
    // --------------------------------------------------------------------------
williamr@2
    23
    // The following traits classes allow us to avoid the need for ptr_fun
williamr@2
    24
    // because the types of arguments and the result of a function can be 
williamr@2
    25
    // deduced.
williamr@2
    26
    //
williamr@2
    27
    // In addition to the standard types defined in unary_function and 
williamr@2
    28
    // binary_function, we add
williamr@2
    29
    //
williamr@2
    30
    // - function_type, the type of the function or function object itself.
williamr@2
    31
    //
williamr@2
    32
    // - param_type, the type that should be used for passing the function or
williamr@2
    33
    //   function object as an argument.
williamr@2
    34
    // --------------------------------------------------------------------------
williamr@2
    35
    namespace detail
williamr@2
    36
    {
williamr@2
    37
        template <class Operation>
williamr@2
    38
        struct unary_traits_imp;
williamr@2
    39
        
williamr@2
    40
        template <class Operation>
williamr@2
    41
        struct unary_traits_imp<Operation*>
williamr@2
    42
        {
williamr@2
    43
            typedef Operation                         function_type;
williamr@2
    44
            typedef const function_type &             param_type;
williamr@2
    45
            typedef typename Operation::result_type   result_type;
williamr@2
    46
            typedef typename Operation::argument_type argument_type;
williamr@2
    47
        };
williamr@2
    48
williamr@2
    49
        template <class R, class A>
williamr@2
    50
        struct unary_traits_imp<R(*)(A)>
williamr@2
    51
        {
williamr@2
    52
            typedef R (*function_type)(A);
williamr@2
    53
            typedef R (*param_type)(A);
williamr@2
    54
            typedef R result_type;
williamr@2
    55
            typedef A argument_type;
williamr@2
    56
        };
williamr@2
    57
williamr@2
    58
        template <class Operation>
williamr@2
    59
        struct binary_traits_imp;
williamr@2
    60
williamr@2
    61
        template <class Operation>
williamr@2
    62
        struct binary_traits_imp<Operation*>
williamr@2
    63
        {
williamr@2
    64
            typedef Operation                                function_type;
williamr@2
    65
            typedef const function_type &                    param_type;
williamr@2
    66
            typedef typename Operation::result_type          result_type;
williamr@2
    67
            typedef typename Operation::first_argument_type  first_argument_type;
williamr@2
    68
            typedef typename Operation::second_argument_type second_argument_type;
williamr@2
    69
        };
williamr@2
    70
        
williamr@2
    71
        template <class R, class A1, class A2>
williamr@2
    72
        struct binary_traits_imp<R(*)(A1,A2)>
williamr@2
    73
        {
williamr@2
    74
            typedef R (*function_type)(A1,A2);
williamr@2
    75
            typedef R (*param_type)(A1,A2);
williamr@2
    76
            typedef R result_type;
williamr@2
    77
            typedef A1 first_argument_type;
williamr@2
    78
            typedef A2 second_argument_type;
williamr@2
    79
        };
williamr@2
    80
    } // namespace detail
williamr@2
    81
    
williamr@2
    82
    template <class Operation>
williamr@2
    83
    struct unary_traits
williamr@2
    84
    {
williamr@2
    85
        typedef typename detail::unary_traits_imp<Operation*>::function_type function_type;
williamr@2
    86
        typedef typename detail::unary_traits_imp<Operation*>::param_type    param_type;
williamr@2
    87
        typedef typename detail::unary_traits_imp<Operation*>::result_type   result_type;
williamr@2
    88
        typedef typename detail::unary_traits_imp<Operation*>::argument_type argument_type;
williamr@2
    89
    }; 
williamr@2
    90
williamr@2
    91
    template <class R, class A>
williamr@2
    92
    struct unary_traits<R(*)(A)>
williamr@2
    93
    {
williamr@2
    94
        typedef R (*function_type)(A);
williamr@2
    95
        typedef R (*param_type)(A);
williamr@2
    96
        typedef R result_type;
williamr@2
    97
        typedef A argument_type;
williamr@2
    98
    };
williamr@2
    99
williamr@2
   100
    template <class Operation>
williamr@2
   101
    struct binary_traits
williamr@2
   102
    {
williamr@2
   103
        typedef typename detail::binary_traits_imp<Operation*>::function_type        function_type;
williamr@2
   104
        typedef typename detail::binary_traits_imp<Operation*>::param_type           param_type;
williamr@2
   105
        typedef typename detail::binary_traits_imp<Operation*>::result_type          result_type;
williamr@2
   106
        typedef typename detail::binary_traits_imp<Operation*>::first_argument_type  first_argument_type;
williamr@2
   107
        typedef typename detail::binary_traits_imp<Operation*>::second_argument_type second_argument_type;
williamr@2
   108
    };
williamr@2
   109
    
williamr@2
   110
    template <class R, class A1, class A2>
williamr@2
   111
    struct binary_traits<R(*)(A1,A2)>
williamr@2
   112
    {
williamr@2
   113
        typedef R (*function_type)(A1,A2);
williamr@2
   114
        typedef R (*param_type)(A1,A2);
williamr@2
   115
        typedef R result_type;
williamr@2
   116
        typedef A1 first_argument_type;
williamr@2
   117
        typedef A2 second_argument_type;
williamr@2
   118
    };
williamr@2
   119
#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
williamr@2
   120
    // --------------------------------------------------------------------------
williamr@2
   121
    // If we have no partial specialisation available, decay to a situation
williamr@2
   122
    // that is no worse than in the Standard, i.e., ptr_fun will be required.
williamr@2
   123
    // --------------------------------------------------------------------------
williamr@2
   124
williamr@2
   125
    template <class Operation>
williamr@2
   126
    struct unary_traits
williamr@2
   127
    {
williamr@2
   128
        typedef Operation                         function_type;
williamr@2
   129
        typedef const Operation&                  param_type;
williamr@2
   130
        typedef typename Operation::result_type   result_type;
williamr@2
   131
        typedef typename Operation::argument_type argument_type;
williamr@2
   132
    }; 
williamr@2
   133
    
williamr@2
   134
    template <class Operation>
williamr@2
   135
    struct binary_traits
williamr@2
   136
    {
williamr@2
   137
        typedef Operation                                function_type;
williamr@2
   138
        typedef const Operation &                        param_type;
williamr@2
   139
        typedef typename Operation::result_type          result_type;
williamr@2
   140
        typedef typename Operation::first_argument_type  first_argument_type;
williamr@2
   141
        typedef typename Operation::second_argument_type second_argument_type;
williamr@2
   142
    };    
williamr@2
   143
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
williamr@2
   144
    
williamr@2
   145
    // --------------------------------------------------------------------------
williamr@2
   146
    // unary_negate, not1
williamr@2
   147
    // --------------------------------------------------------------------------
williamr@2
   148
    template <class Predicate>
williamr@2
   149
    class unary_negate
williamr@2
   150
        : public std::unary_function<typename unary_traits<Predicate>::argument_type,bool>
williamr@2
   151
    {
williamr@2
   152
      public:
williamr@2
   153
        explicit unary_negate(typename unary_traits<Predicate>::param_type x)
williamr@2
   154
            :
williamr@2
   155
            pred(x)
williamr@2
   156
        {}
williamr@2
   157
        bool operator()(typename call_traits<typename unary_traits<Predicate>::argument_type>::param_type x) const
williamr@2
   158
        {
williamr@2
   159
            return !pred(x);
williamr@2
   160
        }
williamr@2
   161
      private:
williamr@2
   162
        typename unary_traits<Predicate>::function_type pred;
williamr@2
   163
    };
williamr@2
   164
williamr@2
   165
    template <class Predicate>
williamr@2
   166
    unary_negate<Predicate> not1(const Predicate &pred)
williamr@2
   167
    {
williamr@2
   168
        // The cast is to placate Borland C++Builder in certain circumstances.
williamr@2
   169
        // I don't think it should be necessary.
williamr@2
   170
        return unary_negate<Predicate>((typename unary_traits<Predicate>::param_type)pred);
williamr@2
   171
    }
williamr@2
   172
williamr@2
   173
    template <class Predicate>
williamr@2
   174
    unary_negate<Predicate> not1(Predicate &pred)
williamr@2
   175
    {
williamr@2
   176
        return unary_negate<Predicate>(pred);
williamr@2
   177
    }
williamr@2
   178
williamr@2
   179
    // --------------------------------------------------------------------------
williamr@2
   180
    // binary_negate, not2
williamr@2
   181
    // --------------------------------------------------------------------------
williamr@2
   182
    template <class Predicate>
williamr@2
   183
    class binary_negate
williamr@2
   184
        : public std::binary_function<typename binary_traits<Predicate>::first_argument_type,
williamr@2
   185
                                      typename binary_traits<Predicate>::second_argument_type,
williamr@2
   186
                                      bool>
williamr@2
   187
    {
williamr@2
   188
      public:
williamr@2
   189
        explicit binary_negate(typename binary_traits<Predicate>::param_type x)
williamr@2
   190
            :
williamr@2
   191
            pred(x)
williamr@2
   192
        {}
williamr@2
   193
        bool operator()(typename call_traits<typename binary_traits<Predicate>::first_argument_type>::param_type x,
williamr@2
   194
                        typename call_traits<typename binary_traits<Predicate>::second_argument_type>::param_type y) const
williamr@2
   195
        {
williamr@2
   196
            return !pred(x,y);
williamr@2
   197
        }
williamr@2
   198
      private:
williamr@2
   199
        typename binary_traits<Predicate>::function_type pred;
williamr@2
   200
    };
williamr@2
   201
williamr@2
   202
    template <class Predicate>
williamr@2
   203
    binary_negate<Predicate> not2(const Predicate &pred)
williamr@2
   204
    {
williamr@2
   205
        // The cast is to placate Borland C++Builder in certain circumstances.
williamr@2
   206
        // I don't think it should be necessary.
williamr@2
   207
        return binary_negate<Predicate>((typename binary_traits<Predicate>::param_type)pred);
williamr@2
   208
    }
williamr@2
   209
williamr@2
   210
    template <class Predicate>
williamr@2
   211
    binary_negate<Predicate> not2(Predicate &pred)
williamr@2
   212
    {
williamr@2
   213
        return binary_negate<Predicate>(pred);
williamr@2
   214
    }
williamr@2
   215
        
williamr@2
   216
    // --------------------------------------------------------------------------
williamr@2
   217
    // binder1st, bind1st
williamr@2
   218
    // --------------------------------------------------------------------------
williamr@2
   219
    template <class Operation>
williamr@2
   220
    class binder1st
williamr@2
   221
        : public std::unary_function<typename binary_traits<Operation>::second_argument_type,
williamr@2
   222
                                     typename binary_traits<Operation>::result_type>
williamr@2
   223
    {       
williamr@2
   224
      public:
williamr@2
   225
        binder1st(typename binary_traits<Operation>::param_type x,
williamr@2
   226
                  typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type y)
williamr@2
   227
            :
williamr@2
   228
            op(x), value(y)
williamr@2
   229
        {}
williamr@2
   230
        
williamr@2
   231
        typename binary_traits<Operation>::result_type
williamr@2
   232
        operator()(typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type x) const
williamr@2
   233
        {
williamr@2
   234
            return op(value, x);
williamr@2
   235
        }
williamr@2
   236
        
williamr@2
   237
      protected:
williamr@2
   238
        typename binary_traits<Operation>::function_type op;
williamr@2
   239
        typename binary_traits<Operation>::first_argument_type value;
williamr@2
   240
    };
williamr@2
   241
williamr@2
   242
    template <class Operation>
williamr@2
   243
    inline binder1st<Operation> bind1st(const Operation &op,
williamr@2
   244
                                        typename call_traits<
williamr@2
   245
                                                    typename binary_traits<Operation>::first_argument_type
williamr@2
   246
                                        >::param_type x)
williamr@2
   247
    {
williamr@2
   248
        // The cast is to placate Borland C++Builder in certain circumstances.
williamr@2
   249
        // I don't think it should be necessary.
williamr@2
   250
        return binder1st<Operation>((typename binary_traits<Operation>::param_type)op, x);
williamr@2
   251
    }
williamr@2
   252
williamr@2
   253
    template <class Operation>
williamr@2
   254
    inline binder1st<Operation> bind1st(Operation &op,
williamr@2
   255
                                        typename call_traits<
williamr@2
   256
                                                    typename binary_traits<Operation>::first_argument_type
williamr@2
   257
                                        >::param_type x)
williamr@2
   258
    {
williamr@2
   259
        return binder1st<Operation>(op, x);
williamr@2
   260
    }
williamr@2
   261
williamr@2
   262
    // --------------------------------------------------------------------------
williamr@2
   263
    // binder2nd, bind2nd
williamr@2
   264
    // --------------------------------------------------------------------------
williamr@2
   265
    template <class Operation>
williamr@2
   266
    class binder2nd
williamr@2
   267
        : public std::unary_function<typename binary_traits<Operation>::first_argument_type,
williamr@2
   268
                                     typename binary_traits<Operation>::result_type>
williamr@2
   269
    {
williamr@2
   270
      public:
williamr@2
   271
        binder2nd(typename binary_traits<Operation>::param_type x,
williamr@2
   272
                  typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type y)
williamr@2
   273
            :
williamr@2
   274
            op(x), value(y)
williamr@2
   275
        {}
williamr@2
   276
        
williamr@2
   277
        typename binary_traits<Operation>::result_type
williamr@2
   278
        operator()(typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type x) const
williamr@2
   279
        {
williamr@2
   280
            return op(x, value);
williamr@2
   281
        }               
williamr@2
   282
        
williamr@2
   283
      protected:
williamr@2
   284
        typename binary_traits<Operation>::function_type op;
williamr@2
   285
        typename binary_traits<Operation>::second_argument_type value;
williamr@2
   286
    };
williamr@2
   287
williamr@2
   288
    template <class Operation>
williamr@2
   289
    inline binder2nd<Operation> bind2nd(const Operation &op,
williamr@2
   290
                                        typename call_traits<
williamr@2
   291
                                                    typename binary_traits<Operation>::second_argument_type
williamr@2
   292
                                        >::param_type x)
williamr@2
   293
    {
williamr@2
   294
        // The cast is to placate Borland C++Builder in certain circumstances.
williamr@2
   295
        // I don't think it should be necessary.
williamr@2
   296
        return binder2nd<Operation>((typename binary_traits<Operation>::param_type)op, x);
williamr@2
   297
    }
williamr@2
   298
williamr@2
   299
    template <class Operation>
williamr@2
   300
    inline binder2nd<Operation> bind2nd(Operation &op,
williamr@2
   301
                                        typename call_traits<
williamr@2
   302
                                                    typename binary_traits<Operation>::second_argument_type
williamr@2
   303
                                        >::param_type x)
williamr@2
   304
    {
williamr@2
   305
        return binder2nd<Operation>(op, x);
williamr@2
   306
    }
williamr@2
   307
williamr@2
   308
    // --------------------------------------------------------------------------
williamr@2
   309
    // mem_fun, etc
williamr@2
   310
    // --------------------------------------------------------------------------
williamr@2
   311
    template <class S, class T>
williamr@2
   312
    class mem_fun_t : public std::unary_function<T*, S>
williamr@2
   313
    {
williamr@2
   314
      public:
williamr@2
   315
        explicit mem_fun_t(S (T::*p)())
williamr@2
   316
            :
williamr@2
   317
            ptr(p)
williamr@2
   318
        {}
williamr@2
   319
        S operator()(T* p) const
williamr@2
   320
        {
williamr@2
   321
            return (p->*ptr)();
williamr@2
   322
        }
williamr@2
   323
      private:
williamr@2
   324
        S (T::*ptr)();
williamr@2
   325
    };
williamr@2
   326
williamr@2
   327
    template <class S, class T, class A>
williamr@2
   328
    class mem_fun1_t : public std::binary_function<T*, A, S>
williamr@2
   329
    {
williamr@2
   330
      public:   
williamr@2
   331
        explicit mem_fun1_t(S (T::*p)(A))
williamr@2
   332
            :
williamr@2
   333
            ptr(p)
williamr@2
   334
        {}
williamr@2
   335
        S operator()(T* p, typename call_traits<A>::param_type x) const
williamr@2
   336
        {
williamr@2
   337
            return (p->*ptr)(x);
williamr@2
   338
        }
williamr@2
   339
      private:
williamr@2
   340
        S (T::*ptr)(A);
williamr@2
   341
    };
williamr@2
   342
williamr@2
   343
    template <class S, class T>
williamr@2
   344
    class const_mem_fun_t : public std::unary_function<const T*, S>
williamr@2
   345
    {
williamr@2
   346
      public:
williamr@2
   347
        explicit const_mem_fun_t(S (T::*p)() const)
williamr@2
   348
            :
williamr@2
   349
            ptr(p)
williamr@2
   350
        {}
williamr@2
   351
        S operator()(const T* p) const
williamr@2
   352
        {
williamr@2
   353
            return (p->*ptr)();
williamr@2
   354
        }
williamr@2
   355
      private:
williamr@2
   356
        S (T::*ptr)() const;        
williamr@2
   357
    };
williamr@2
   358
williamr@2
   359
    template <class S, class T, class A>
williamr@2
   360
    class const_mem_fun1_t : public std::binary_function<const T*, A, S>
williamr@2
   361
    {
williamr@2
   362
      public:
williamr@2
   363
        explicit const_mem_fun1_t(S (T::*p)(A) const)
williamr@2
   364
            :
williamr@2
   365
            ptr(p)
williamr@2
   366
        {}
williamr@2
   367
        S operator()(const T* p, typename call_traits<A>::param_type x) const
williamr@2
   368
        {
williamr@2
   369
            return (p->*ptr)(x);
williamr@2
   370
        }
williamr@2
   371
      private:
williamr@2
   372
        S (T::*ptr)(A) const;
williamr@2
   373
    };
williamr@2
   374
    
williamr@2
   375
    template<class S, class T>
williamr@2
   376
    inline mem_fun_t<S,T> mem_fun(S (T::*f)())
williamr@2
   377
    {
williamr@2
   378
        return mem_fun_t<S,T>(f);
williamr@2
   379
    }
williamr@2
   380
    
williamr@2
   381
    template<class S, class T, class A>
williamr@2
   382
    inline mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A))
williamr@2
   383
    {
williamr@2
   384
        return mem_fun1_t<S,T,A>(f);
williamr@2
   385
    }
williamr@2
   386
williamr@2
   387
#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
williamr@2
   388
    template<class S, class T>
williamr@2
   389
    inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const)
williamr@2
   390
    {
williamr@2
   391
        return const_mem_fun_t<S,T>(f);
williamr@2
   392
    }
williamr@2
   393
    
williamr@2
   394
    template<class S, class T, class A>
williamr@2
   395
    inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const)
williamr@2
   396
    {
williamr@2
   397
        return const_mem_fun1_t<S,T,A>(f);
williamr@2
   398
    }
williamr@2
   399
#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
williamr@2
   400
williamr@2
   401
    // --------------------------------------------------------------------------
williamr@2
   402
    // mem_fun_ref, etc
williamr@2
   403
    // --------------------------------------------------------------------------
williamr@2
   404
    template <class S, class T>
williamr@2
   405
    class mem_fun_ref_t : public std::unary_function<T&, S>
williamr@2
   406
    {
williamr@2
   407
      public:
williamr@2
   408
        explicit mem_fun_ref_t(S (T::*p)())
williamr@2
   409
            :
williamr@2
   410
            ptr(p)
williamr@2
   411
        {}
williamr@2
   412
        S operator()(T& p) const
williamr@2
   413
        {
williamr@2
   414
            return (p.*ptr)();
williamr@2
   415
        }
williamr@2
   416
      private:
williamr@2
   417
        S (T::*ptr)();
williamr@2
   418
    };
williamr@2
   419
williamr@2
   420
    template <class S, class T, class A>
williamr@2
   421
    class mem_fun1_ref_t : public std::binary_function<T&, A, S>
williamr@2
   422
    {
williamr@2
   423
      public:
williamr@2
   424
        explicit mem_fun1_ref_t(S (T::*p)(A))
williamr@2
   425
            :
williamr@2
   426
            ptr(p)
williamr@2
   427
        {}
williamr@2
   428
        S operator()(T& p, typename call_traits<A>::param_type x) const
williamr@2
   429
        {
williamr@2
   430
            return (p.*ptr)(x);
williamr@2
   431
        }
williamr@2
   432
      private:
williamr@2
   433
        S (T::*ptr)(A);
williamr@2
   434
    };
williamr@2
   435
    
williamr@2
   436
    template <class S, class T>
williamr@2
   437
    class const_mem_fun_ref_t : public std::unary_function<const T&, S>
williamr@2
   438
    {
williamr@2
   439
      public:
williamr@2
   440
        explicit const_mem_fun_ref_t(S (T::*p)() const)
williamr@2
   441
            :
williamr@2
   442
            ptr(p)
williamr@2
   443
        {}
williamr@2
   444
        
williamr@2
   445
        S operator()(const T &p) const
williamr@2
   446
        {
williamr@2
   447
            return (p.*ptr)();
williamr@2
   448
        }
williamr@2
   449
      private:
williamr@2
   450
        S (T::*ptr)() const;
williamr@2
   451
    };
williamr@2
   452
williamr@2
   453
    template <class S, class T, class A>
williamr@2
   454
    class const_mem_fun1_ref_t : public std::binary_function<const T&, A, S>
williamr@2
   455
    {
williamr@2
   456
      public:
williamr@2
   457
        explicit const_mem_fun1_ref_t(S (T::*p)(A) const)
williamr@2
   458
            :
williamr@2
   459
            ptr(p)
williamr@2
   460
        {}
williamr@2
   461
williamr@2
   462
        S operator()(const T& p, typename call_traits<A>::param_type x) const
williamr@2
   463
        {
williamr@2
   464
            return (p.*ptr)(x);
williamr@2
   465
        }
williamr@2
   466
      private:
williamr@2
   467
        S (T::*ptr)(A) const;
williamr@2
   468
    };
williamr@2
   469
    
williamr@2
   470
    template<class S, class T>
williamr@2
   471
    inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)())
williamr@2
   472
    {
williamr@2
   473
        return mem_fun_ref_t<S,T>(f);
williamr@2
   474
    }
williamr@2
   475
williamr@2
   476
    template<class S, class T, class A>
williamr@2
   477
    inline mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A))
williamr@2
   478
    {
williamr@2
   479
        return mem_fun1_ref_t<S,T,A>(f);
williamr@2
   480
    }
williamr@2
   481
williamr@2
   482
#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
williamr@2
   483
    template<class S, class T>
williamr@2
   484
    inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const)
williamr@2
   485
    {
williamr@2
   486
        return const_mem_fun_ref_t<S,T>(f);
williamr@2
   487
    }
williamr@2
   488
williamr@2
   489
    template<class S, class T, class A>
williamr@2
   490
    inline const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const)
williamr@2
   491
    {
williamr@2
   492
        return const_mem_fun1_ref_t<S,T,A>(f);
williamr@2
   493
    }   
williamr@2
   494
#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
williamr@2
   495
williamr@2
   496
    // --------------------------------------------------------------------------
williamr@2
   497
    // ptr_fun
williamr@2
   498
    // --------------------------------------------------------------------------
williamr@2
   499
    template <class Arg, class Result>
williamr@2
   500
    class pointer_to_unary_function : public std::unary_function<Arg,Result>
williamr@2
   501
    {
williamr@2
   502
      public:
williamr@2
   503
        explicit pointer_to_unary_function(Result (*f)(Arg))
williamr@2
   504
            :
williamr@2
   505
            func(f)
williamr@2
   506
        {}
williamr@2
   507
williamr@2
   508
        Result operator()(typename call_traits<Arg>::param_type x) const
williamr@2
   509
        {
williamr@2
   510
            return func(x);
williamr@2
   511
        }
williamr@2
   512
        
williamr@2
   513
      private:
williamr@2
   514
        Result (*func)(Arg);
williamr@2
   515
    };
williamr@2
   516
williamr@2
   517
    template <class Arg, class Result>
williamr@2
   518
    inline pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg))
williamr@2
   519
    {
williamr@2
   520
        return pointer_to_unary_function<Arg,Result>(f);
williamr@2
   521
    }
williamr@2
   522
williamr@2
   523
    template <class Arg1, class Arg2, class Result>
williamr@2
   524
    class pointer_to_binary_function : public std::binary_function<Arg1,Arg2,Result>
williamr@2
   525
    {
williamr@2
   526
      public:
williamr@2
   527
        explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2))
williamr@2
   528
            :
williamr@2
   529
            func(f)
williamr@2
   530
        {}
williamr@2
   531
        
williamr@2
   532
        Result operator()(typename call_traits<Arg1>::param_type x, typename call_traits<Arg2>::param_type y) const
williamr@2
   533
        {
williamr@2
   534
            return func(x,y);
williamr@2
   535
        }
williamr@2
   536
        
williamr@2
   537
      private:
williamr@2
   538
        Result (*func)(Arg1, Arg2);
williamr@2
   539
    };
williamr@2
   540
williamr@2
   541
    template <class Arg1, class Arg2, class Result>
williamr@2
   542
    inline pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
williamr@2
   543
    {
williamr@2
   544
        return pointer_to_binary_function<Arg1,Arg2,Result>(f);
williamr@2
   545
    }
williamr@2
   546
} // namespace boost
williamr@2
   547
williamr@2
   548
#endif