Blame boost/functional.hpp

Packit 58578d
// ------------------------------------------------------------------------------
Packit 58578d
// Copyright (c) 2000 Cadenza New Zealand Ltd
Packit 58578d
// Distributed under the Boost Software License, Version 1.0. (See accompany-
Packit 58578d
// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Packit 58578d
// ------------------------------------------------------------------------------
Packit 58578d
// Boost functional.hpp header file
Packit 58578d
// See http://www.boost.org/libs/functional for documentation.
Packit 58578d
// ------------------------------------------------------------------------------
Packit 58578d
// $Id$
Packit 58578d
// ------------------------------------------------------------------------------
Packit 58578d
Packit 58578d
#ifndef BOOST_FUNCTIONAL_HPP
Packit 58578d
#define BOOST_FUNCTIONAL_HPP
Packit 58578d
Packit 58578d
#include <boost/config.hpp>
Packit 58578d
#include <boost/call_traits.hpp>
Packit 58578d
#include <functional>
Packit 58578d
Packit 58578d
namespace boost
Packit 58578d
{
Packit 58578d
    namespace functional
Packit 58578d
    {
Packit 58578d
        namespace detail {
Packit 58578d
#if defined(_HAS_AUTO_PTR_ETC) && !_HAS_AUTO_PTR_ETC
Packit 58578d
            // std::unary_function and std::binary_function were both removed
Packit 58578d
            // in C++17.
Packit 58578d
Packit 58578d
            template <typename Arg1, typename Result>
Packit 58578d
            struct unary_function
Packit 58578d
            {
Packit 58578d
                typedef Arg1 argument_type;
Packit 58578d
                typedef Result result_type;
Packit 58578d
            };
Packit 58578d
Packit 58578d
            template <typename Arg1, typename Arg2, typename Result>
Packit 58578d
            struct binary_function
Packit 58578d
            {
Packit 58578d
                typedef Arg1 first_argument_type;
Packit 58578d
                typedef Arg2 second_argument_type;
Packit 58578d
                typedef Result result_type;
Packit 58578d
            };
Packit 58578d
#else
Packit 58578d
            // Use the standard objects when we have them.
Packit 58578d
Packit 58578d
            using std::unary_function;
Packit 58578d
            using std::binary_function;
Packit 58578d
#endif
Packit 58578d
        }
Packit 58578d
    }
Packit 58578d
Packit 58578d
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // The following traits classes allow us to avoid the need for ptr_fun
Packit 58578d
    // because the types of arguments and the result of a function can be 
Packit 58578d
    // deduced.
Packit 58578d
    //
Packit 58578d
    // In addition to the standard types defined in unary_function and 
Packit 58578d
    // binary_function, we add
Packit 58578d
    //
Packit 58578d
    // - function_type, the type of the function or function object itself.
Packit 58578d
    //
Packit 58578d
    // - param_type, the type that should be used for passing the function or
Packit 58578d
    //   function object as an argument.
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    namespace detail
Packit 58578d
    {
Packit 58578d
        template <class Operation>
Packit 58578d
        struct unary_traits_imp;
Packit 58578d
        
Packit 58578d
        template <class Operation>
Packit 58578d
        struct unary_traits_imp<Operation*>
Packit 58578d
        {
Packit 58578d
            typedef Operation                         function_type;
Packit 58578d
            typedef const function_type &             param_type;
Packit 58578d
            typedef typename Operation::result_type   result_type;
Packit 58578d
            typedef typename Operation::argument_type argument_type;
Packit 58578d
        };
Packit 58578d
Packit 58578d
        template <class R, class A>
Packit 58578d
        struct unary_traits_imp<R(*)(A)>
Packit 58578d
        {
Packit 58578d
            typedef R (*function_type)(A);
Packit 58578d
            typedef R (*param_type)(A);
Packit 58578d
            typedef R result_type;
Packit 58578d
            typedef A argument_type;
Packit 58578d
        };
Packit 58578d
Packit 58578d
        template <class Operation>
Packit 58578d
        struct binary_traits_imp;
Packit 58578d
Packit 58578d
        template <class Operation>
Packit 58578d
        struct binary_traits_imp<Operation*>
Packit 58578d
        {
Packit 58578d
            typedef Operation                                function_type;
Packit 58578d
            typedef const function_type &                    param_type;
Packit 58578d
            typedef typename Operation::result_type          result_type;
Packit 58578d
            typedef typename Operation::first_argument_type  first_argument_type;
Packit 58578d
            typedef typename Operation::second_argument_type second_argument_type;
Packit 58578d
        };
Packit 58578d
        
Packit 58578d
        template <class R, class A1, class A2>
Packit 58578d
        struct binary_traits_imp<R(*)(A1,A2)>
Packit 58578d
        {
Packit 58578d
            typedef R (*function_type)(A1,A2);
Packit 58578d
            typedef R (*param_type)(A1,A2);
Packit 58578d
            typedef R result_type;
Packit 58578d
            typedef A1 first_argument_type;
Packit 58578d
            typedef A2 second_argument_type;
Packit 58578d
        };
Packit 58578d
    } // namespace detail
Packit 58578d
    
Packit 58578d
    template <class Operation>
Packit 58578d
    struct unary_traits
Packit 58578d
    {
Packit 58578d
        typedef typename detail::unary_traits_imp<Operation*>::function_type function_type;
Packit 58578d
        typedef typename detail::unary_traits_imp<Operation*>::param_type    param_type;
Packit 58578d
        typedef typename detail::unary_traits_imp<Operation*>::result_type   result_type;
Packit 58578d
        typedef typename detail::unary_traits_imp<Operation*>::argument_type argument_type;
Packit 58578d
    }; 
Packit 58578d
Packit 58578d
    template <class R, class A>
Packit 58578d
    struct unary_traits<R(*)(A)>
Packit 58578d
    {
Packit 58578d
        typedef R (*function_type)(A);
Packit 58578d
        typedef R (*param_type)(A);
Packit 58578d
        typedef R result_type;
Packit 58578d
        typedef A argument_type;
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Operation>
Packit 58578d
    struct binary_traits
Packit 58578d
    {
Packit 58578d
        typedef typename detail::binary_traits_imp<Operation*>::function_type        function_type;
Packit 58578d
        typedef typename detail::binary_traits_imp<Operation*>::param_type           param_type;
Packit 58578d
        typedef typename detail::binary_traits_imp<Operation*>::result_type          result_type;
Packit 58578d
        typedef typename detail::binary_traits_imp<Operation*>::first_argument_type  first_argument_type;
Packit 58578d
        typedef typename detail::binary_traits_imp<Operation*>::second_argument_type second_argument_type;
Packit 58578d
    };
Packit 58578d
    
Packit 58578d
    template <class R, class A1, class A2>
Packit 58578d
    struct binary_traits<R(*)(A1,A2)>
Packit 58578d
    {
Packit 58578d
        typedef R (*function_type)(A1,A2);
Packit 58578d
        typedef R (*param_type)(A1,A2);
Packit 58578d
        typedef R result_type;
Packit 58578d
        typedef A1 first_argument_type;
Packit 58578d
        typedef A2 second_argument_type;
Packit 58578d
    };
Packit 58578d
#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // If we have no partial specialisation available, decay to a situation
Packit 58578d
    // that is no worse than in the Standard, i.e., ptr_fun will be required.
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
Packit 58578d
    template <class Operation>
Packit 58578d
    struct unary_traits
Packit 58578d
    {
Packit 58578d
        typedef Operation                         function_type;
Packit 58578d
        typedef const Operation&                  param_type;
Packit 58578d
        typedef typename Operation::result_type   result_type;
Packit 58578d
        typedef typename Operation::argument_type argument_type;
Packit 58578d
    }; 
Packit 58578d
    
Packit 58578d
    template <class Operation>
Packit 58578d
    struct binary_traits
Packit 58578d
    {
Packit 58578d
        typedef Operation                                function_type;
Packit 58578d
        typedef const Operation &                        param_type;
Packit 58578d
        typedef typename Operation::result_type          result_type;
Packit 58578d
        typedef typename Operation::first_argument_type  first_argument_type;
Packit 58578d
        typedef typename Operation::second_argument_type second_argument_type;
Packit 58578d
    };    
Packit 58578d
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Packit 58578d
    
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // unary_negate, not1
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class Predicate>
Packit 58578d
    class unary_negate
Packit 58578d
        : public boost::functional::detail::unary_function<typename unary_traits<Predicate>::argument_type,bool>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit unary_negate(typename unary_traits<Predicate>::param_type x)
Packit 58578d
            :
Packit 58578d
            pred(x)
Packit 58578d
        {}
Packit 58578d
        bool operator()(typename call_traits<typename unary_traits<Predicate>::argument_type>::param_type x) const
Packit 58578d
        {
Packit 58578d
            return !pred(x);
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        typename unary_traits<Predicate>::function_type pred;
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Predicate>
Packit 58578d
    unary_negate<Predicate> not1(const Predicate &pred)
Packit 58578d
    {
Packit 58578d
        // The cast is to placate Borland C++Builder in certain circumstances.
Packit 58578d
        // I don't think it should be necessary.
Packit 58578d
        return unary_negate<Predicate>((typename unary_traits<Predicate>::param_type)pred);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template <class Predicate>
Packit 58578d
    unary_negate<Predicate> not1(Predicate &pred)
Packit 58578d
    {
Packit 58578d
        return unary_negate<Predicate>(pred);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // binary_negate, not2
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class Predicate>
Packit 58578d
    class binary_negate
Packit 58578d
        : public boost::functional::detail::binary_function<
Packit 58578d
                                      typename binary_traits<Predicate>::first_argument_type,
Packit 58578d
                                      typename binary_traits<Predicate>::second_argument_type,
Packit 58578d
                                      bool>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit binary_negate(typename binary_traits<Predicate>::param_type x)
Packit 58578d
            :
Packit 58578d
            pred(x)
Packit 58578d
        {}
Packit 58578d
        bool operator()(typename call_traits<typename binary_traits<Predicate>::first_argument_type>::param_type x,
Packit 58578d
                        typename call_traits<typename binary_traits<Predicate>::second_argument_type>::param_type y) const
Packit 58578d
        {
Packit 58578d
            return !pred(x,y);
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        typename binary_traits<Predicate>::function_type pred;
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Predicate>
Packit 58578d
    binary_negate<Predicate> not2(const Predicate &pred)
Packit 58578d
    {
Packit 58578d
        // The cast is to placate Borland C++Builder in certain circumstances.
Packit 58578d
        // I don't think it should be necessary.
Packit 58578d
        return binary_negate<Predicate>((typename binary_traits<Predicate>::param_type)pred);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template <class Predicate>
Packit 58578d
    binary_negate<Predicate> not2(Predicate &pred)
Packit 58578d
    {
Packit 58578d
        return binary_negate<Predicate>(pred);
Packit 58578d
    }
Packit 58578d
        
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // binder1st, bind1st
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class Operation>
Packit 58578d
    class binder1st
Packit 58578d
        : public boost::functional::detail::unary_function<
Packit 58578d
                                     typename binary_traits<Operation>::second_argument_type,
Packit 58578d
                                     typename binary_traits<Operation>::result_type>
Packit 58578d
    {       
Packit 58578d
      public:
Packit 58578d
        binder1st(typename binary_traits<Operation>::param_type x,
Packit 58578d
                  typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type y)
Packit 58578d
            :
Packit 58578d
            op(x), value(y)
Packit 58578d
        {}
Packit 58578d
        
Packit 58578d
        typename binary_traits<Operation>::result_type
Packit 58578d
        operator()(typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type x) const
Packit 58578d
        {
Packit 58578d
            return op(value, x);
Packit 58578d
        }
Packit 58578d
        
Packit 58578d
      protected:
Packit 58578d
        typename binary_traits<Operation>::function_type op;
Packit 58578d
        typename binary_traits<Operation>::first_argument_type value;
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Operation>
Packit 58578d
    inline binder1st<Operation> bind1st(const Operation &op,
Packit 58578d
                                        typename call_traits<
Packit 58578d
                                                    typename binary_traits<Operation>::first_argument_type
Packit 58578d
                                        >::param_type x)
Packit 58578d
    {
Packit 58578d
        // The cast is to placate Borland C++Builder in certain circumstances.
Packit 58578d
        // I don't think it should be necessary.
Packit 58578d
        return binder1st<Operation>((typename binary_traits<Operation>::param_type)op, x);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template <class Operation>
Packit 58578d
    inline binder1st<Operation> bind1st(Operation &op,
Packit 58578d
                                        typename call_traits<
Packit 58578d
                                                    typename binary_traits<Operation>::first_argument_type
Packit 58578d
                                        >::param_type x)
Packit 58578d
    {
Packit 58578d
        return binder1st<Operation>(op, x);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // binder2nd, bind2nd
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class Operation>
Packit 58578d
    class binder2nd
Packit 58578d
        : public boost::functional::detail::unary_function<
Packit 58578d
                                     typename binary_traits<Operation>::first_argument_type,
Packit 58578d
                                     typename binary_traits<Operation>::result_type>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        binder2nd(typename binary_traits<Operation>::param_type x,
Packit 58578d
                  typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type y)
Packit 58578d
            :
Packit 58578d
            op(x), value(y)
Packit 58578d
        {}
Packit 58578d
        
Packit 58578d
        typename binary_traits<Operation>::result_type
Packit 58578d
        operator()(typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type x) const
Packit 58578d
        {
Packit 58578d
            return op(x, value);
Packit 58578d
        }               
Packit 58578d
        
Packit 58578d
      protected:
Packit 58578d
        typename binary_traits<Operation>::function_type op;
Packit 58578d
        typename binary_traits<Operation>::second_argument_type value;
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Operation>
Packit 58578d
    inline binder2nd<Operation> bind2nd(const Operation &op,
Packit 58578d
                                        typename call_traits<
Packit 58578d
                                                    typename binary_traits<Operation>::second_argument_type
Packit 58578d
                                        >::param_type x)
Packit 58578d
    {
Packit 58578d
        // The cast is to placate Borland C++Builder in certain circumstances.
Packit 58578d
        // I don't think it should be necessary.
Packit 58578d
        return binder2nd<Operation>((typename binary_traits<Operation>::param_type)op, x);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template <class Operation>
Packit 58578d
    inline binder2nd<Operation> bind2nd(Operation &op,
Packit 58578d
                                        typename call_traits<
Packit 58578d
                                                    typename binary_traits<Operation>::second_argument_type
Packit 58578d
                                        >::param_type x)
Packit 58578d
    {
Packit 58578d
        return binder2nd<Operation>(op, x);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // mem_fun, etc
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class S, class T>
Packit 58578d
    class mem_fun_t : public boost::functional::detail::unary_function<T*, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit mem_fun_t(S (T::*p)())
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        S operator()(T* p) const
Packit 58578d
        {
Packit 58578d
            return (p->*ptr)();
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)();
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class S, class T, class A>
Packit 58578d
    class mem_fun1_t : public boost::functional::detail::binary_function<T*, A, S>
Packit 58578d
    {
Packit 58578d
      public:   
Packit 58578d
        explicit mem_fun1_t(S (T::*p)(A))
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        S operator()(T* p, typename call_traits::param_type x) const
Packit 58578d
        {
Packit 58578d
            return (p->*ptr)(x);
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)(A);
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class S, class T>
Packit 58578d
    class const_mem_fun_t : public boost::functional::detail::unary_function<const T*, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit const_mem_fun_t(S (T::*p)() const)
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        S operator()(const T* p) const
Packit 58578d
        {
Packit 58578d
            return (p->*ptr)();
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)() const;        
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class S, class T, class A>
Packit 58578d
    class const_mem_fun1_t : public boost::functional::detail::binary_function<const T*, A, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit const_mem_fun1_t(S (T::*p)(A) const)
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        S operator()(const T* p, typename call_traits::param_type x) const
Packit 58578d
        {
Packit 58578d
            return (p->*ptr)(x);
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)(A) const;
Packit 58578d
    };
Packit 58578d
    
Packit 58578d
    template<class S, class T>
Packit 58578d
    inline mem_fun_t<S,T> mem_fun(S (T::*f)())
Packit 58578d
    {
Packit 58578d
        return mem_fun_t<S,T>(f);
Packit 58578d
    }
Packit 58578d
    
Packit 58578d
    template<class S, class T, class A>
Packit 58578d
    inline mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A))
Packit 58578d
    {
Packit 58578d
        return mem_fun1_t<S,T,A>(f);
Packit 58578d
    }
Packit 58578d
Packit 58578d
#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
Packit 58578d
    template<class S, class T>
Packit 58578d
    inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const)
Packit 58578d
    {
Packit 58578d
        return const_mem_fun_t<S,T>(f);
Packit 58578d
    }
Packit 58578d
    
Packit 58578d
    template<class S, class T, class A>
Packit 58578d
    inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const)
Packit 58578d
    {
Packit 58578d
        return const_mem_fun1_t<S,T,A>(f);
Packit 58578d
    }
Packit 58578d
#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
Packit 58578d
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // mem_fun_ref, etc
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class S, class T>
Packit 58578d
    class mem_fun_ref_t : public boost::functional::detail::unary_function<T&, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit mem_fun_ref_t(S (T::*p)())
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        S operator()(T& p) const
Packit 58578d
        {
Packit 58578d
            return (p.*ptr)();
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)();
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class S, class T, class A>
Packit 58578d
    class mem_fun1_ref_t : public boost::functional::detail::binary_function<T&, A, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit mem_fun1_ref_t(S (T::*p)(A))
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        S operator()(T& p, typename call_traits::param_type x) const
Packit 58578d
        {
Packit 58578d
            return (p.*ptr)(x);
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)(A);
Packit 58578d
    };
Packit 58578d
    
Packit 58578d
    template <class S, class T>
Packit 58578d
    class const_mem_fun_ref_t : public boost::functional::detail::unary_function<const T&, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit const_mem_fun_ref_t(S (T::*p)() const)
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
        
Packit 58578d
        S operator()(const T &p) const
Packit 58578d
        {
Packit 58578d
            return (p.*ptr)();
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)() const;
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class S, class T, class A>
Packit 58578d
    class const_mem_fun1_ref_t : public boost::functional::detail::binary_function<const T&, A, S>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit const_mem_fun1_ref_t(S (T::*p)(A) const)
Packit 58578d
            :
Packit 58578d
            ptr(p)
Packit 58578d
        {}
Packit 58578d
Packit 58578d
        S operator()(const T& p, typename call_traits::param_type x) const
Packit 58578d
        {
Packit 58578d
            return (p.*ptr)(x);
Packit 58578d
        }
Packit 58578d
      private:
Packit 58578d
        S (T::*ptr)(A) const;
Packit 58578d
    };
Packit 58578d
    
Packit 58578d
    template<class S, class T>
Packit 58578d
    inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)())
Packit 58578d
    {
Packit 58578d
        return mem_fun_ref_t<S,T>(f);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template<class S, class T, class A>
Packit 58578d
    inline mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A))
Packit 58578d
    {
Packit 58578d
        return mem_fun1_ref_t<S,T,A>(f);
Packit 58578d
    }
Packit 58578d
Packit 58578d
#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
Packit 58578d
    template<class S, class T>
Packit 58578d
    inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const)
Packit 58578d
    {
Packit 58578d
        return const_mem_fun_ref_t<S,T>(f);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template<class S, class T, class A>
Packit 58578d
    inline const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const)
Packit 58578d
    {
Packit 58578d
        return const_mem_fun1_ref_t<S,T,A>(f);
Packit 58578d
    }   
Packit 58578d
#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
Packit 58578d
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    // ptr_fun
Packit 58578d
    // --------------------------------------------------------------------------
Packit 58578d
    template <class Arg, class Result>
Packit 58578d
    class pointer_to_unary_function : public boost::functional::detail::unary_function<Arg,Result>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit pointer_to_unary_function(Result (*f)(Arg))
Packit 58578d
            :
Packit 58578d
            func(f)
Packit 58578d
        {}
Packit 58578d
Packit 58578d
        Result operator()(typename call_traits<Arg>::param_type x) const
Packit 58578d
        {
Packit 58578d
            return func(x);
Packit 58578d
        }
Packit 58578d
        
Packit 58578d
      private:
Packit 58578d
        Result (*func)(Arg);
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Arg, class Result>
Packit 58578d
    inline pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg))
Packit 58578d
    {
Packit 58578d
        return pointer_to_unary_function<Arg,Result>(f);
Packit 58578d
    }
Packit 58578d
Packit 58578d
    template <class Arg1, class Arg2, class Result>
Packit 58578d
    class pointer_to_binary_function : public boost::functional::detail::binary_function<Arg1,Arg2,Result>
Packit 58578d
    {
Packit 58578d
      public:
Packit 58578d
        explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2))
Packit 58578d
            :
Packit 58578d
            func(f)
Packit 58578d
        {}
Packit 58578d
        
Packit 58578d
        Result operator()(typename call_traits<Arg1>::param_type x, typename call_traits<Arg2>::param_type y) const
Packit 58578d
        {
Packit 58578d
            return func(x,y);
Packit 58578d
        }
Packit 58578d
        
Packit 58578d
      private:
Packit 58578d
        Result (*func)(Arg1, Arg2);
Packit 58578d
    };
Packit 58578d
Packit 58578d
    template <class Arg1, class Arg2, class Result>
Packit 58578d
    inline pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
Packit 58578d
    {
Packit 58578d
        return pointer_to_binary_function<Arg1,Arg2,Result>(f);
Packit 58578d
    }
Packit 58578d
} // namespace boost
Packit 58578d
Packit 58578d
#endif