Squashed 'third_party/boostorg/functional/' content from commit 7516442
Change-Id: I0e437294bc2af9d32de5022be6ac788cc67244d1
git-subtree-dir: third_party/boostorg/functional
git-subtree-split: 7516442815900430cc9c4a6190354e11bcbe72dd
diff --git a/include/boost/functional.hpp b/include/boost/functional.hpp
new file mode 100644
index 0000000..6443078
--- /dev/null
+++ b/include/boost/functional.hpp
@@ -0,0 +1,581 @@
+// ------------------------------------------------------------------------------
+// Copyright (c) 2000 Cadenza New Zealand Ltd
+// Distributed under the Boost Software License, Version 1.0. (See accompany-
+// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+// ------------------------------------------------------------------------------
+// Boost functional.hpp header file
+// See http://www.boost.org/libs/functional for documentation.
+// ------------------------------------------------------------------------------
+// $Id$
+// ------------------------------------------------------------------------------
+
+#ifndef BOOST_FUNCTIONAL_HPP
+#define BOOST_FUNCTIONAL_HPP
+
+#include <boost/config.hpp>
+#include <boost/call_traits.hpp>
+#include <functional>
+
+namespace boost
+{
+ namespace functional
+ {
+ namespace detail {
+#if defined(_HAS_AUTO_PTR_ETC) && !_HAS_AUTO_PTR_ETC
+ // std::unary_function and std::binary_function were both removed
+ // in C++17.
+
+ template <typename Arg1, typename Result>
+ struct unary_function
+ {
+ typedef Arg1 argument_type;
+ typedef Result result_type;
+ };
+
+ template <typename Arg1, typename Arg2, typename Result>
+ struct binary_function
+ {
+ typedef Arg1 first_argument_type;
+ typedef Arg2 second_argument_type;
+ typedef Result result_type;
+ };
+#else
+ // Use the standard objects when we have them.
+
+ using std::unary_function;
+ using std::binary_function;
+#endif
+ }
+ }
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+ // --------------------------------------------------------------------------
+ // The following traits classes allow us to avoid the need for ptr_fun
+ // because the types of arguments and the result of a function can be
+ // deduced.
+ //
+ // In addition to the standard types defined in unary_function and
+ // binary_function, we add
+ //
+ // - function_type, the type of the function or function object itself.
+ //
+ // - param_type, the type that should be used for passing the function or
+ // function object as an argument.
+ // --------------------------------------------------------------------------
+ namespace detail
+ {
+ template <class Operation>
+ struct unary_traits_imp;
+
+ template <class Operation>
+ struct unary_traits_imp<Operation*>
+ {
+ typedef Operation function_type;
+ typedef const function_type & param_type;
+ typedef typename Operation::result_type result_type;
+ typedef typename Operation::argument_type argument_type;
+ };
+
+ template <class R, class A>
+ struct unary_traits_imp<R(*)(A)>
+ {
+ typedef R (*function_type)(A);
+ typedef R (*param_type)(A);
+ typedef R result_type;
+ typedef A argument_type;
+ };
+
+ template <class Operation>
+ struct binary_traits_imp;
+
+ template <class Operation>
+ struct binary_traits_imp<Operation*>
+ {
+ typedef Operation function_type;
+ typedef const function_type & param_type;
+ typedef typename Operation::result_type result_type;
+ typedef typename Operation::first_argument_type first_argument_type;
+ typedef typename Operation::second_argument_type second_argument_type;
+ };
+
+ template <class R, class A1, class A2>
+ struct binary_traits_imp<R(*)(A1,A2)>
+ {
+ typedef R (*function_type)(A1,A2);
+ typedef R (*param_type)(A1,A2);
+ typedef R result_type;
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+ };
+ } // namespace detail
+
+ template <class Operation>
+ struct unary_traits
+ {
+ typedef typename detail::unary_traits_imp<Operation*>::function_type function_type;
+ typedef typename detail::unary_traits_imp<Operation*>::param_type param_type;
+ typedef typename detail::unary_traits_imp<Operation*>::result_type result_type;
+ typedef typename detail::unary_traits_imp<Operation*>::argument_type argument_type;
+ };
+
+ template <class R, class A>
+ struct unary_traits<R(*)(A)>
+ {
+ typedef R (*function_type)(A);
+ typedef R (*param_type)(A);
+ typedef R result_type;
+ typedef A argument_type;
+ };
+
+ template <class Operation>
+ struct binary_traits
+ {
+ typedef typename detail::binary_traits_imp<Operation*>::function_type function_type;
+ typedef typename detail::binary_traits_imp<Operation*>::param_type param_type;
+ typedef typename detail::binary_traits_imp<Operation*>::result_type result_type;
+ typedef typename detail::binary_traits_imp<Operation*>::first_argument_type first_argument_type;
+ typedef typename detail::binary_traits_imp<Operation*>::second_argument_type second_argument_type;
+ };
+
+ template <class R, class A1, class A2>
+ struct binary_traits<R(*)(A1,A2)>
+ {
+ typedef R (*function_type)(A1,A2);
+ typedef R (*param_type)(A1,A2);
+ typedef R result_type;
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+ };
+#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+ // --------------------------------------------------------------------------
+ // If we have no partial specialisation available, decay to a situation
+ // that is no worse than in the Standard, i.e., ptr_fun will be required.
+ // --------------------------------------------------------------------------
+
+ template <class Operation>
+ struct unary_traits
+ {
+ typedef Operation function_type;
+ typedef const Operation& param_type;
+ typedef typename Operation::result_type result_type;
+ typedef typename Operation::argument_type argument_type;
+ };
+
+ template <class Operation>
+ struct binary_traits
+ {
+ typedef Operation function_type;
+ typedef const Operation & param_type;
+ typedef typename Operation::result_type result_type;
+ typedef typename Operation::first_argument_type first_argument_type;
+ typedef typename Operation::second_argument_type second_argument_type;
+ };
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+ // --------------------------------------------------------------------------
+ // unary_negate, not1
+ // --------------------------------------------------------------------------
+ template <class Predicate>
+ class unary_negate
+ : public boost::functional::detail::unary_function<typename unary_traits<Predicate>::argument_type,bool>
+ {
+ public:
+ explicit unary_negate(typename unary_traits<Predicate>::param_type x)
+ :
+ pred(x)
+ {}
+ bool operator()(typename call_traits<typename unary_traits<Predicate>::argument_type>::param_type x) const
+ {
+ return !pred(x);
+ }
+ private:
+ typename unary_traits<Predicate>::function_type pred;
+ };
+
+ template <class Predicate>
+ unary_negate<Predicate> not1(const Predicate &pred)
+ {
+ // The cast is to placate Borland C++Builder in certain circumstances.
+ // I don't think it should be necessary.
+ return unary_negate<Predicate>((typename unary_traits<Predicate>::param_type)pred);
+ }
+
+ template <class Predicate>
+ unary_negate<Predicate> not1(Predicate &pred)
+ {
+ return unary_negate<Predicate>(pred);
+ }
+
+ // --------------------------------------------------------------------------
+ // binary_negate, not2
+ // --------------------------------------------------------------------------
+ template <class Predicate>
+ class binary_negate
+ : public boost::functional::detail::binary_function<
+ typename binary_traits<Predicate>::first_argument_type,
+ typename binary_traits<Predicate>::second_argument_type,
+ bool>
+ {
+ public:
+ explicit binary_negate(typename binary_traits<Predicate>::param_type x)
+ :
+ pred(x)
+ {}
+ bool operator()(typename call_traits<typename binary_traits<Predicate>::first_argument_type>::param_type x,
+ typename call_traits<typename binary_traits<Predicate>::second_argument_type>::param_type y) const
+ {
+ return !pred(x,y);
+ }
+ private:
+ typename binary_traits<Predicate>::function_type pred;
+ };
+
+ template <class Predicate>
+ binary_negate<Predicate> not2(const Predicate &pred)
+ {
+ // The cast is to placate Borland C++Builder in certain circumstances.
+ // I don't think it should be necessary.
+ return binary_negate<Predicate>((typename binary_traits<Predicate>::param_type)pred);
+ }
+
+ template <class Predicate>
+ binary_negate<Predicate> not2(Predicate &pred)
+ {
+ return binary_negate<Predicate>(pred);
+ }
+
+ // --------------------------------------------------------------------------
+ // binder1st, bind1st
+ // --------------------------------------------------------------------------
+ template <class Operation>
+ class binder1st
+ : public boost::functional::detail::unary_function<
+ typename binary_traits<Operation>::second_argument_type,
+ typename binary_traits<Operation>::result_type>
+ {
+ public:
+ binder1st(typename binary_traits<Operation>::param_type x,
+ typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type y)
+ :
+ op(x), value(y)
+ {}
+
+ typename binary_traits<Operation>::result_type
+ operator()(typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type x) const
+ {
+ return op(value, x);
+ }
+
+ protected:
+ typename binary_traits<Operation>::function_type op;
+ typename binary_traits<Operation>::first_argument_type value;
+ };
+
+ template <class Operation>
+ inline binder1st<Operation> bind1st(const Operation &op,
+ typename call_traits<
+ typename binary_traits<Operation>::first_argument_type
+ >::param_type x)
+ {
+ // The cast is to placate Borland C++Builder in certain circumstances.
+ // I don't think it should be necessary.
+ return binder1st<Operation>((typename binary_traits<Operation>::param_type)op, x);
+ }
+
+ template <class Operation>
+ inline binder1st<Operation> bind1st(Operation &op,
+ typename call_traits<
+ typename binary_traits<Operation>::first_argument_type
+ >::param_type x)
+ {
+ return binder1st<Operation>(op, x);
+ }
+
+ // --------------------------------------------------------------------------
+ // binder2nd, bind2nd
+ // --------------------------------------------------------------------------
+ template <class Operation>
+ class binder2nd
+ : public boost::functional::detail::unary_function<
+ typename binary_traits<Operation>::first_argument_type,
+ typename binary_traits<Operation>::result_type>
+ {
+ public:
+ binder2nd(typename binary_traits<Operation>::param_type x,
+ typename call_traits<typename binary_traits<Operation>::second_argument_type>::param_type y)
+ :
+ op(x), value(y)
+ {}
+
+ typename binary_traits<Operation>::result_type
+ operator()(typename call_traits<typename binary_traits<Operation>::first_argument_type>::param_type x) const
+ {
+ return op(x, value);
+ }
+
+ protected:
+ typename binary_traits<Operation>::function_type op;
+ typename binary_traits<Operation>::second_argument_type value;
+ };
+
+ template <class Operation>
+ inline binder2nd<Operation> bind2nd(const Operation &op,
+ typename call_traits<
+ typename binary_traits<Operation>::second_argument_type
+ >::param_type x)
+ {
+ // The cast is to placate Borland C++Builder in certain circumstances.
+ // I don't think it should be necessary.
+ return binder2nd<Operation>((typename binary_traits<Operation>::param_type)op, x);
+ }
+
+ template <class Operation>
+ inline binder2nd<Operation> bind2nd(Operation &op,
+ typename call_traits<
+ typename binary_traits<Operation>::second_argument_type
+ >::param_type x)
+ {
+ return binder2nd<Operation>(op, x);
+ }
+
+ // --------------------------------------------------------------------------
+ // mem_fun, etc
+ // --------------------------------------------------------------------------
+ template <class S, class T>
+ class mem_fun_t : public boost::functional::detail::unary_function<T*, S>
+ {
+ public:
+ explicit mem_fun_t(S (T::*p)())
+ :
+ ptr(p)
+ {}
+ S operator()(T* p) const
+ {
+ return (p->*ptr)();
+ }
+ private:
+ S (T::*ptr)();
+ };
+
+ template <class S, class T, class A>
+ class mem_fun1_t : public boost::functional::detail::binary_function<T*, A, S>
+ {
+ public:
+ explicit mem_fun1_t(S (T::*p)(A))
+ :
+ ptr(p)
+ {}
+ S operator()(T* p, typename call_traits<A>::param_type x) const
+ {
+ return (p->*ptr)(x);
+ }
+ private:
+ S (T::*ptr)(A);
+ };
+
+ template <class S, class T>
+ class const_mem_fun_t : public boost::functional::detail::unary_function<const T*, S>
+ {
+ public:
+ explicit const_mem_fun_t(S (T::*p)() const)
+ :
+ ptr(p)
+ {}
+ S operator()(const T* p) const
+ {
+ return (p->*ptr)();
+ }
+ private:
+ S (T::*ptr)() const;
+ };
+
+ template <class S, class T, class A>
+ class const_mem_fun1_t : public boost::functional::detail::binary_function<const T*, A, S>
+ {
+ public:
+ explicit const_mem_fun1_t(S (T::*p)(A) const)
+ :
+ ptr(p)
+ {}
+ S operator()(const T* p, typename call_traits<A>::param_type x) const
+ {
+ return (p->*ptr)(x);
+ }
+ private:
+ S (T::*ptr)(A) const;
+ };
+
+ template<class S, class T>
+ inline mem_fun_t<S,T> mem_fun(S (T::*f)())
+ {
+ return mem_fun_t<S,T>(f);
+ }
+
+ template<class S, class T, class A>
+ inline mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A))
+ {
+ return mem_fun1_t<S,T,A>(f);
+ }
+
+#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
+ template<class S, class T>
+ inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const)
+ {
+ return const_mem_fun_t<S,T>(f);
+ }
+
+ template<class S, class T, class A>
+ inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const)
+ {
+ return const_mem_fun1_t<S,T,A>(f);
+ }
+#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
+
+ // --------------------------------------------------------------------------
+ // mem_fun_ref, etc
+ // --------------------------------------------------------------------------
+ template <class S, class T>
+ class mem_fun_ref_t : public boost::functional::detail::unary_function<T&, S>
+ {
+ public:
+ explicit mem_fun_ref_t(S (T::*p)())
+ :
+ ptr(p)
+ {}
+ S operator()(T& p) const
+ {
+ return (p.*ptr)();
+ }
+ private:
+ S (T::*ptr)();
+ };
+
+ template <class S, class T, class A>
+ class mem_fun1_ref_t : public boost::functional::detail::binary_function<T&, A, S>
+ {
+ public:
+ explicit mem_fun1_ref_t(S (T::*p)(A))
+ :
+ ptr(p)
+ {}
+ S operator()(T& p, typename call_traits<A>::param_type x) const
+ {
+ return (p.*ptr)(x);
+ }
+ private:
+ S (T::*ptr)(A);
+ };
+
+ template <class S, class T>
+ class const_mem_fun_ref_t : public boost::functional::detail::unary_function<const T&, S>
+ {
+ public:
+ explicit const_mem_fun_ref_t(S (T::*p)() const)
+ :
+ ptr(p)
+ {}
+
+ S operator()(const T &p) const
+ {
+ return (p.*ptr)();
+ }
+ private:
+ S (T::*ptr)() const;
+ };
+
+ template <class S, class T, class A>
+ class const_mem_fun1_ref_t : public boost::functional::detail::binary_function<const T&, A, S>
+ {
+ public:
+ explicit const_mem_fun1_ref_t(S (T::*p)(A) const)
+ :
+ ptr(p)
+ {}
+
+ S operator()(const T& p, typename call_traits<A>::param_type x) const
+ {
+ return (p.*ptr)(x);
+ }
+ private:
+ S (T::*ptr)(A) const;
+ };
+
+ template<class S, class T>
+ inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)())
+ {
+ return mem_fun_ref_t<S,T>(f);
+ }
+
+ template<class S, class T, class A>
+ inline mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A))
+ {
+ return mem_fun1_ref_t<S,T,A>(f);
+ }
+
+#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST
+ template<class S, class T>
+ inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const)
+ {
+ return const_mem_fun_ref_t<S,T>(f);
+ }
+
+ template<class S, class T, class A>
+ inline const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const)
+ {
+ return const_mem_fun1_ref_t<S,T,A>(f);
+ }
+#endif // BOOST_NO_POINTER_TO_MEMBER_CONST
+
+ // --------------------------------------------------------------------------
+ // ptr_fun
+ // --------------------------------------------------------------------------
+ template <class Arg, class Result>
+ class pointer_to_unary_function : public boost::functional::detail::unary_function<Arg,Result>
+ {
+ public:
+ explicit pointer_to_unary_function(Result (*f)(Arg))
+ :
+ func(f)
+ {}
+
+ Result operator()(typename call_traits<Arg>::param_type x) const
+ {
+ return func(x);
+ }
+
+ private:
+ Result (*func)(Arg);
+ };
+
+ template <class Arg, class Result>
+ inline pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg))
+ {
+ return pointer_to_unary_function<Arg,Result>(f);
+ }
+
+ template <class Arg1, class Arg2, class Result>
+ class pointer_to_binary_function : public boost::functional::detail::binary_function<Arg1,Arg2,Result>
+ {
+ public:
+ explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2))
+ :
+ func(f)
+ {}
+
+ Result operator()(typename call_traits<Arg1>::param_type x, typename call_traits<Arg2>::param_type y) const
+ {
+ return func(x,y);
+ }
+
+ private:
+ Result (*func)(Arg1, Arg2);
+ };
+
+ template <class Arg1, class Arg2, class Result>
+ inline pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1, Arg2))
+ {
+ return pointer_to_binary_function<Arg1,Arg2,Result>(f);
+ }
+} // namespace boost
+
+#endif
diff --git a/include/boost/functional/factory.hpp b/include/boost/functional/factory.hpp
new file mode 100644
index 0000000..92f67d9
--- /dev/null
+++ b/include/boost/functional/factory.hpp
@@ -0,0 +1,214 @@
+/*=============================================================================
+ Copyright (c) 2007 Tobias Schwinger
+
+ Use modification and distribution are subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_FACTORY_HPP_INCLUDED
+# ifndef BOOST_PP_IS_ITERATING
+
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+# include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+
+# include <new>
+# include <boost/pointee.hpp>
+# include <boost/get_pointer.hpp>
+# include <boost/non_type.hpp>
+# include <boost/type_traits/remove_cv.hpp>
+
+# if defined(BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T)
+# include <boost/none_t.hpp>
+# endif
+
+# ifndef BOOST_FUNCTIONAL_FACTORY_MAX_ARITY
+# define BOOST_FUNCTIONAL_FACTORY_MAX_ARITY 10
+# elif BOOST_FUNCTIONAL_FACTORY_MAX_ARITY < 3
+# undef BOOST_FUNCTIONAL_FACTORY_MAX_ARITY
+# define BOOST_FUNCTIONAL_FACTORY_MAX_ARITY 3
+# endif
+
+namespace boost
+{
+ enum factory_alloc_propagation
+ {
+ factory_alloc_for_pointee_and_deleter,
+ factory_passes_alloc_to_smart_pointer
+ };
+
+#if defined(BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T)
+ template< typename Pointer, class Allocator = boost::none_t,
+ factory_alloc_propagation AP = factory_alloc_for_pointee_and_deleter >
+ class factory;
+#else
+ template< typename Pointer, class Allocator = void,
+ factory_alloc_propagation AP = factory_alloc_for_pointee_and_deleter >
+ class factory;
+#endif
+
+ //----- ---- --- -- - - - -
+
+ template< typename Pointer, factory_alloc_propagation AP >
+ class factory<Pointer, void, AP>
+ {
+ public:
+ typedef typename boost::remove_cv<Pointer>::type result_type;
+ typedef typename boost::pointee<result_type>::type value_type;
+
+ factory()
+ { }
+
+# define BOOST_PP_FILENAME_1 <boost/functional/factory.hpp>
+# define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_FACTORY_MAX_ARITY)
+# include BOOST_PP_ITERATE()
+ };
+
+#if defined(BOOST_FUNCTIONAL_FACTORY_SUPPORT_NONE_T)
+ template< typename Pointer, factory_alloc_propagation AP >
+ class factory<Pointer, boost::none_t, AP>
+ : public factory<Pointer, void, AP>
+ {};
+#endif
+
+ template< class Pointer, class Allocator, factory_alloc_propagation AP >
+ class factory
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+ : private Allocator::template rebind< typename boost::pointee<
+ typename boost::remove_cv<Pointer>::type >::type >::other
+#else
+ : private std::allocator_traits<Allocator>::template rebind_alloc<
+ typename boost::pointee< typename boost::remove_cv<Pointer>::type >::type >
+#endif
+ {
+ public:
+ typedef typename boost::remove_cv<Pointer>::type result_type;
+ typedef typename boost::pointee<result_type>::type value_type;
+
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+ typedef typename Allocator::template rebind<value_type>::other
+ allocator_type;
+#else
+ typedef typename std::allocator_traits<Allocator>::template rebind_alloc<value_type>
+ allocator_type;
+ typedef std::allocator_traits<allocator_type> allocator_traits;
+#endif
+
+ explicit factory(allocator_type const & a = allocator_type())
+ : allocator_type(a)
+ { }
+
+ private:
+
+ struct deleter
+ : allocator_type
+ {
+ inline deleter(allocator_type const& that)
+ : allocator_type(that)
+ { }
+
+ allocator_type& get_allocator() const
+ {
+ return *const_cast<allocator_type*>(
+ static_cast<allocator_type const*>(this));
+ }
+
+ void operator()(value_type* ptr) const
+ {
+ if (!! ptr) {
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+ ptr->~value_type();
+ const_cast<allocator_type*>(static_cast<allocator_type const*>(
+ this))->deallocate(ptr,1);
+#else
+ allocator_traits::destroy(this->get_allocator(), ptr);
+ allocator_traits::deallocate(this->get_allocator(),ptr,1);
+#endif
+ }
+ }
+ };
+
+ inline allocator_type& get_allocator() const
+ {
+ return *const_cast<allocator_type*>(
+ static_cast<allocator_type const*>(this));
+ }
+
+ inline result_type make_pointer(value_type* ptr, boost::non_type<
+ factory_alloc_propagation,factory_passes_alloc_to_smart_pointer>)
+ const
+ {
+ return result_type(ptr,deleter(this->get_allocator()));
+ }
+ inline result_type make_pointer(value_type* ptr, boost::non_type<
+ factory_alloc_propagation,factory_alloc_for_pointee_and_deleter>)
+ const
+ {
+ return result_type(ptr,deleter(this->get_allocator()),
+ this->get_allocator());
+ }
+
+ public:
+
+# define BOOST_TMP_MACRO
+# define BOOST_PP_FILENAME_1 <boost/functional/factory.hpp>
+# define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_FACTORY_MAX_ARITY)
+# include BOOST_PP_ITERATE()
+# undef BOOST_TMP_MACRO
+ };
+
+ template< typename Pointer, class Allocator, factory_alloc_propagation AP >
+ class factory<Pointer&, Allocator, AP>;
+ // forbidden, would create a dangling reference
+}
+
+# define BOOST_FUNCTIONAL_FACTORY_HPP_INCLUDED
+# else // defined(BOOST_PP_IS_ITERATING)
+# define N BOOST_PP_ITERATION()
+# if !defined(BOOST_TMP_MACRO)
+# if N > 0
+ template< BOOST_PP_ENUM_PARAMS(N, typename T) >
+# endif
+ inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+ {
+ return result_type( new value_type(BOOST_PP_ENUM_PARAMS(N,a)) );
+ }
+# else // defined(BOOST_TMP_MACRO)
+# if N > 0
+ template< BOOST_PP_ENUM_PARAMS(N, typename T) >
+# endif
+ inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+ {
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+ value_type* memory = this->get_allocator().allocate(1);
+#else
+ value_type* memory = allocator_traits::allocate(this->get_allocator(), 1);
+#endif
+ try
+ {
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+ new(memory) value_type(BOOST_PP_ENUM_PARAMS(N,a));
+#else
+ allocator_traits::construct(this->get_allocator(), memory
+ BOOST_PP_ENUM_TRAILING_PARAMS(N,a));
+#endif
+ }
+ catch (...) {
+#if defined(BOOST_NO_CXX11_ALLOCATOR)
+ this->get_allocator().deallocate(memory,1);
+#else
+ allocator_traits::deallocate(this->get_allocator(), memory, 1);
+#endif
+ throw;
+ }
+
+ return make_pointer(memory, boost::non_type<factory_alloc_propagation,AP>());
+ }
+# endif
+# undef N
+# endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/include/boost/functional/forward_adapter.hpp b/include/boost/functional/forward_adapter.hpp
new file mode 100644
index 0000000..0d486a6
--- /dev/null
+++ b/include/boost/functional/forward_adapter.hpp
@@ -0,0 +1,501 @@
+/*=============================================================================
+ Copyright (c) 2007-2008 Tobias Schwinger
+
+ Use modification and distribution are subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_FORWARD_ADAPTER_HPP_INCLUDED
+# ifndef BOOST_PP_IS_ITERATING
+
+# include <boost/config.hpp>
+# include <boost/config/workaround.hpp>
+
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+# include <boost/preprocessor/facilities/intercept.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+
+# include <boost/utility/result_of.hpp>
+
+# ifndef BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY
+# define BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY 6
+# elif BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY < 3
+# undef BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY
+# define BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY 3
+# endif
+
+
+namespace boost
+{
+ template< typename Function, int Arity_Or_MinArity = -1, int MaxArity = -1 >
+ class forward_adapter;
+
+ //----- ---- --- -- - - - -
+
+ namespace detail
+ {
+ template< class MostDerived, typename Function, typename FunctionConst,
+ int Arity, int MinArity >
+ struct forward_adapter_impl;
+
+ struct forward_adapter_result
+ {
+ template< typename Sig > struct apply;
+
+ // Utility metafunction for qualification adjustment on arguments
+ template< typename T > struct q { typedef T const t; };
+ template< typename T > struct q<T const> { typedef T const t; };
+ template< typename T > struct q<T &> { typedef T t; };
+
+ // Utility metafunction to choose target function qualification
+ template< typename T > struct c
+ { typedef typename T::target_function_t t; };
+ template< typename T > struct c<T& >
+ { typedef typename T::target_function_t t; };
+ template< typename T > struct c<T const >
+ { typedef typename T::target_function_const_t t; };
+ template< typename T > struct c<T const&>
+ { typedef typename T::target_function_const_t t; };
+ };
+ }
+
+# define BOOST_TMP_MACRO(f,fn,fc) \
+ boost::detail::forward_adapter_impl< \
+ forward_adapter<f,Arity_Or_MinArity,MaxArity>, fn, fc, \
+ (MaxArity!=-1? MaxArity :Arity_Or_MinArity!=-1? Arity_Or_MinArity \
+ :BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY), \
+ (Arity_Or_MinArity!=-1? Arity_Or_MinArity : 0) >
+
+ template< typename Function, int Arity_Or_MinArity, int MaxArity >
+ class forward_adapter
+ : public BOOST_TMP_MACRO(Function,Function,Function const)
+ , private Function
+ {
+ public:
+ forward_adapter(Function const& f = Function())
+ : Function(f)
+ { }
+
+ typedef Function target_function_t;
+ typedef Function const target_function_const_t;
+
+ Function & target_function() { return *this; }
+ Function const & target_function() const { return *this; }
+
+ template< typename Sig > struct result
+ : detail::forward_adapter_result::template apply<Sig>
+ { };
+
+ using BOOST_TMP_MACRO(Function,Function, Function const)::operator();
+ };
+ template< typename Function, int Arity_Or_MinArity, int MaxArity >
+ class forward_adapter< Function const, Arity_Or_MinArity, MaxArity >
+ : public BOOST_TMP_MACRO(Function const, Function const, Function const)
+ , private Function
+ {
+ public:
+ forward_adapter(Function const& f = Function())
+ : Function(f)
+ { }
+
+ typedef Function const target_function_t;
+ typedef Function const target_function_const_t;
+
+ Function const & target_function() const { return *this; }
+
+ template< typename Sig > struct result
+ : detail::forward_adapter_result::template apply<Sig>
+ { };
+
+ using BOOST_TMP_MACRO(Function const,Function const, Function const)
+ ::operator();
+ };
+ template< typename Function, int Arity_Or_MinArity, int MaxArity >
+ class forward_adapter< Function &, Arity_Or_MinArity, MaxArity >
+ : public BOOST_TMP_MACRO(Function&, Function, Function)
+ {
+ Function& ref_function;
+ public:
+ forward_adapter(Function& f)
+ : ref_function(f)
+ { }
+
+ typedef Function target_function_t;
+ typedef Function target_function_const_t;
+
+ Function & target_function() const { return this->ref_function; }
+
+ template< typename Sig > struct result
+ : detail::forward_adapter_result::template apply<Sig>
+ { };
+
+ using BOOST_TMP_MACRO(Function&, Function, Function)::operator();
+ };
+
+ #undef BOOST_TMP_MACRO
+
+ namespace detail
+ {
+ template< class Self >
+ struct forward_adapter_result::apply< Self() >
+ : boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
+ { };
+
+ // WHen operator()() doesn't have any parameters, it can't
+ // be templatized and can't use SFINAE, so intead use class
+ // template parameter SFINAE to decide whether to instantiate it.
+
+ template <typename T, typename R = void>
+ struct forward_adapter_sfinae
+ {
+ typedef T type;
+ };
+
+ // This is the fallback for when there isn't an operator()(),
+ // need to create an operator() that will never instantiate
+ // so that using parent::operator() will work okay.
+ template< class MD, class F, class FC, class Enable = void>
+ struct forward_adapter_impl_zero
+ {
+ template <typename T> struct never_instantiate {};
+ template <typename T>
+ typename never_instantiate<T>::type operator()(T) const {}
+ };
+
+ template< class MD, class F, class FC>
+ struct forward_adapter_impl_zero<MD, F, FC,
+ typename forward_adapter_sfinae<typename boost::result_of< FC() >::type>::type>
+ {
+ inline typename boost::result_of< FC() >::type
+ operator()() const
+ {
+ return static_cast<MD const*>(this)->target_function()();
+ }
+
+ inline typename boost::result_of< F() >::type
+ operator()()
+ {
+ return static_cast<MD*>(this)->target_function()();
+ }
+ };
+
+ template< class MD, class F, class FC >
+ struct forward_adapter_impl<MD,F,FC,0,0>
+ : forward_adapter_impl_zero<MD,F,FC>
+ {
+ using forward_adapter_impl_zero<MD,F,FC>::operator();
+
+ // closing brace gets generated by preprocessing code, below
+
+# define BOOST_TMP_MACRO(tpl_params,arg_types,params,args) \
+ template< tpl_params > \
+ inline typename boost::result_of< FC(arg_types) >::type \
+ operator()(params) const \
+ { \
+ return static_cast<MD const*>(this)->target_function()(args); \
+ } \
+ template< tpl_params > \
+ inline typename boost::result_of< F(arg_types)>::type \
+ operator()(params) \
+ { \
+ return static_cast<MD*>(this)->target_function()(args); \
+ }
+
+# // This is the total number of iterations we need
+# define count ((1 << BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY+1)-2)
+
+# // Chain file iteration to virtually one loop
+# if BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY <= 7
+# define limit1 count
+# define limit2 0
+# define limit3 0
+# else
+# if BOOST_FUNCTIONAL_FORWARD_ADAPTER_MAX_ARITY <= 15
+# define limit1 (count >> 8)
+# define limit2 255
+# define limit3 0
+# else
+# define limit1 (count >> 16)
+# define limit2 255
+# define limit3 255
+# endif
+# endif
+
+# define N 0
+
+# define BOOST_PP_FILENAME_1 <boost/functional/forward_adapter.hpp>
+# define BOOST_PP_ITERATION_LIMITS (0,limit1)
+# include BOOST_PP_ITERATE()
+
+# undef N
+# undef limit3
+# undef limit2
+# undef limit1
+# undef count
+# undef BOOST_TMP_MACRO
+
+ };
+
+ } // namespace detail
+
+ template<class F, int A0, int A1>
+ struct result_of<boost::forward_adapter<F,A0,A1> const ()>
+ : boost::detail::forward_adapter_result::template apply<
+ boost::forward_adapter<F,A0,A1> const () >
+ { };
+ template<class F, int A0, int A1>
+ struct result_of<boost::forward_adapter<F,A0,A1>()>
+ : boost::detail::forward_adapter_result::template apply<
+ boost::forward_adapter<F,A0,A1>() >
+ { };
+ template<class F, int A0, int A1>
+ struct result_of<boost::forward_adapter<F,A0,A1> const& ()>
+ : boost::detail::forward_adapter_result::template apply<
+ boost::forward_adapter<F,A0,A1> const () >
+ { };
+ template<class F, int A0, int A1>
+ struct result_of<boost::forward_adapter<F,A0,A1>& ()>
+ : boost::detail::forward_adapter_result::template apply<
+ boost::forward_adapter<F,A0,A1>() >
+ { };
+}
+
+# define BOOST_FUNCTIONAL_FORWARD_ADAPTER_HPP_INCLUDED
+
+# elif BOOST_PP_ITERATION_DEPTH() == 1 && limit2
+# define BOOST_PP_FILENAME_2 <boost/functional/forward_adapter.hpp>
+# define BOOST_PP_ITERATION_LIMITS (0,limit2)
+# include BOOST_PP_ITERATE()
+# elif BOOST_PP_ITERATION_DEPTH() == 2 && limit3
+# define BOOST_PP_FILENAME_3 <boost/functional/forward_adapter.hpp>
+# define BOOST_PP_ITERATION_LIMITS (0,limit3)
+# include BOOST_PP_ITERATE()
+
+# else
+
+# // I is the loop counter
+# if limit2 && limit3
+# define I (BOOST_PP_ITERATION_1 << 16 | BOOST_PP_ITERATION_2 << 8 | \
+ BOOST_PP_ITERATION_3)
+# elif limit2
+# define I (BOOST_PP_ITERATION_1 << 8 | BOOST_PP_ITERATION_2)
+# else
+# define I BOOST_PP_ITERATION_1
+# endif
+
+# if I < count
+
+# // Done for this arity? Increment N
+# if (I+2 >> N+1)
+# if N == 0
+# undef N
+# define N 1
+# elif N == 1
+# undef N
+# define N 2
+# elif N == 2
+# undef N
+# define N 3
+# elif N == 3
+# undef N
+# define N 4
+# elif N == 4
+# undef N
+# define N 5
+# elif N == 5
+# undef N
+# define N 6
+# elif N == 6
+# undef N
+# define N 7
+# elif N == 7
+# undef N
+# define N 8
+# elif N == 8
+# undef N
+# define N 9
+# elif N == 9
+# undef N
+# define N 10
+# elif N == 10
+# undef N
+# define N 11
+# elif N == 11
+# undef N
+# define N 12
+# elif N == 12
+# undef N
+# define N 13
+# elif N == 13
+# undef N
+# define N 14
+# elif N == 14
+# undef N
+# define N 15
+# elif N == 15
+# undef N
+# define N 16
+# endif
+
+ };
+
+ template< class Self, BOOST_PP_ENUM_PARAMS(N,typename T) >
+ struct forward_adapter_result::apply< Self(BOOST_PP_ENUM_PARAMS(N,T)) >
+ : boost::result_of<
+ BOOST_DEDUCED_TYPENAME c<Self>::t(BOOST_PP_ENUM_BINARY_PARAMS(N,
+ typename q<T,>::t& BOOST_PP_INTERCEPT)) >
+ { };
+
+ template< class MD, class F, class FC >
+ struct forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),N>
+ {
+ template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+ inline typename boost::result_of< F(
+ BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT)) >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT));
+ };
+
+ template< class MD, class F, class FC, int MinArity >
+ struct forward_adapter_impl<MD,F,FC,N,MinArity>
+ : forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),MinArity>
+ {
+ using forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),MinArity>::operator();
+
+# endif
+
+# // Zero based count for each arity would be I-(1<<N)+2, but we don't
+# // need it, unless we need a nicer order.
+
+# // Macros for the parameter's type modifiers.
+# if I & 0x000001
+# define PT0 T0 &
+# else
+# define PT0 T0 const &
+# endif
+# if I & 0x000002
+# define PT1 T1 &
+# else
+# define PT1 T1 const &
+# endif
+# if I & 0x000004
+# define PT2 T2 &
+# else
+# define PT2 T2 const &
+# endif
+# if I & 0x000008
+# define PT3 T3 &
+# else
+# define PT3 T3 const &
+# endif
+# if I & 0x000010
+# define PT4 T4 &
+# else
+# define PT4 T4 const &
+# endif
+# if I & 0x000020
+# define PT5 T5 &
+# else
+# define PT5 T5 const &
+# endif
+# if I & 0x000040
+# define PT6 T6 &
+# else
+# define PT6 T6 const &
+# endif
+# if I & 0x000080
+# define PT7 T7 &
+# else
+# define PT7 T7 const &
+# endif
+# if I & 0x000100
+# define PT8 T8 &
+# else
+# define PT8 T8 const &
+# endif
+# if I & 0x000200
+# define PT9 T9 &
+# else
+# define PT9 T9 const &
+# endif
+# if I & 0x000400
+# define PT10 T10 &
+# else
+# define PT10 T10 const &
+# endif
+# if I & 0x000800
+# define PT11 T11 &
+# else
+# define PT11 T11 const &
+# endif
+# if I & 0x001000
+# define PT12 T12 &
+# else
+# define PT12 T12 const &
+# endif
+# if I & 0x002000
+# define PT13 T13 &
+# else
+# define PT13 T13 const &
+# endif
+# if I & 0x004000
+# define PT14 T14 &
+# else
+# define PT14 T14 const &
+# endif
+# if I & 0x008000
+# define PT15 T15 &
+# else
+# define PT15 T15 const &
+# endif
+
+# if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1400))
+ template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+ inline typename boost::result_of< FC(BOOST_PP_ENUM_PARAMS(N,PT))
+ >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,PT,a)) const
+ {
+ return static_cast<MD const* const>(this)
+ ->target_function()(BOOST_PP_ENUM_PARAMS(N,a));
+ }
+ template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+ inline typename boost::result_of< F(BOOST_PP_ENUM_PARAMS(N,PT))
+ >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,PT,a))
+ {
+ return static_cast<MD* const>(this)
+ ->target_function()(BOOST_PP_ENUM_PARAMS(N,a));
+ }
+# else
+ BOOST_TMP_MACRO(BOOST_PP_ENUM_PARAMS(N,typename T),
+ BOOST_PP_ENUM_PARAMS(N,PT), BOOST_PP_ENUM_BINARY_PARAMS(N,PT,a),
+ BOOST_PP_ENUM_PARAMS(N,a) )
+ // ...generates uglier code but is faster - it caches ENUM_*
+# endif
+
+# undef PT0
+# undef PT1
+# undef PT2
+# undef PT3
+# undef PT4
+# undef PT5
+# undef PT6
+# undef PT7
+# undef PT8
+# undef PT9
+# undef PT10
+# undef PT11
+# undef PT12
+# undef PT13
+# undef PT14
+# undef PT15
+
+# endif // I < count
+
+# undef I
+# endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/include/boost/functional/lightweight_forward_adapter.hpp b/include/boost/functional/lightweight_forward_adapter.hpp
new file mode 100644
index 0000000..4c0d864
--- /dev/null
+++ b/include/boost/functional/lightweight_forward_adapter.hpp
@@ -0,0 +1,288 @@
+/*=============================================================================
+ Copyright (c) 2007 Tobias Schwinger
+
+ Use modification and distribution are subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_HPP_INCLUDED
+# ifndef BOOST_PP_IS_ITERATING
+
+# include <boost/config.hpp>
+# include <boost/config/workaround.hpp>
+
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+# include <boost/preprocessor/facilities/intercept.hpp>
+
+# include <boost/utility/result_of.hpp>
+# include <boost/ref.hpp>
+
+# ifndef BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY
+# define BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY 10
+# elif BOOST_FUNCTIONAL_FORDWARD_ADAPTER_MAX_ARITY < 3
+# undef BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY
+# define BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY 3
+# endif
+
+namespace boost
+{
+ template< typename Function, int Arity_Or_MinArity = -1, int MaxArity = -1 >
+ class lightweight_forward_adapter;
+
+ //----- ---- --- -- - - - -
+
+ namespace detail
+ {
+ template< class MostDerived, typename Function, typename FunctionConst,
+ int Arity, int MinArity >
+ struct lightweight_forward_adapter_impl;
+
+ struct lightweight_forward_adapter_result
+ {
+ template< typename Sig > struct apply;
+
+ // Utility metafunction for argument transform
+ template< typename T > struct x { typedef T const& t; };
+ template< typename T > struct x< boost::reference_wrapper<T> >
+ { typedef T& t; };
+ template< typename T > struct x<T&> : x<T> { };
+ template< typename T > struct x<T const&> : x<T> { };
+ template< typename T > struct x<T const> : x<T> { };
+
+ // Utility metafunction to choose target function qualification
+ template< typename T > struct c
+ { typedef typename T::target_function_t t; };
+ template< typename T > struct c<T& >
+ { typedef typename T::target_function_t t; };
+ template< typename T > struct c<T const >
+ { typedef typename T::target_function_const_t t; };
+ template< typename T > struct c<T const&>
+ { typedef typename T::target_function_const_t t; };
+ };
+ }
+
+# define BOOST_TMP_MACRO(f,fn,fc) \
+ boost::detail::lightweight_forward_adapter_impl< \
+ lightweight_forward_adapter<f,Arity_Or_MinArity,MaxArity>, fn, fc, \
+ (MaxArity!=-1? MaxArity :Arity_Or_MinArity!=-1? Arity_Or_MinArity \
+ :BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY), \
+ (Arity_Or_MinArity!=-1? Arity_Or_MinArity : 0) >
+
+ template< typename Function, int Arity_Or_MinArity, int MaxArity >
+ class lightweight_forward_adapter
+ : public BOOST_TMP_MACRO(Function,Function,Function const)
+ , private Function
+ {
+ public:
+ lightweight_forward_adapter(Function const& f = Function())
+ : Function(f)
+ { }
+
+ typedef Function target_function_t;
+ typedef Function const target_function_const_t;
+
+ Function & target_function() { return *this; }
+ Function const & target_function() const { return *this; }
+
+ template< typename Sig > struct result
+ : detail::lightweight_forward_adapter_result::template apply<Sig>
+ { };
+
+ using BOOST_TMP_MACRO(Function,Function, Function const)::operator();
+ };
+ template< typename Function, int Arity_Or_MinArity, int MaxArity >
+ class lightweight_forward_adapter< Function const, Arity_Or_MinArity,
+ MaxArity >
+ : public BOOST_TMP_MACRO(Function const, Function const, Function const)
+ , private Function
+ {
+ public:
+ lightweight_forward_adapter(Function const& f = Function())
+ : Function(f)
+ { }
+
+ typedef Function const target_function_t;
+ typedef Function const target_function_const_t;
+
+ Function const & target_function() const { return *this; }
+
+ template< typename Sig > struct result
+ : detail::lightweight_forward_adapter_result::template apply<Sig>
+ { };
+
+ using BOOST_TMP_MACRO(Function const,Function const, Function const)
+ ::operator();
+ };
+ template< typename Function, int Arity_Or_MinArity, int MaxArity >
+ class lightweight_forward_adapter< Function &, Arity_Or_MinArity, MaxArity >
+ : public BOOST_TMP_MACRO(Function&, Function, Function)
+ {
+ Function& ref_function;
+ public:
+ lightweight_forward_adapter(Function& f)
+ : ref_function(f)
+ { }
+
+ typedef Function target_function_t;
+ typedef Function target_function_const_t;
+
+ Function & target_function() const { return this->ref_function; }
+
+ template< typename Sig > struct result
+ : detail::lightweight_forward_adapter_result::template apply<Sig>
+ { };
+
+ using BOOST_TMP_MACRO(Function&, Function, Function)::operator();
+ };
+
+ #undef BOOST_TMP_MACRO
+
+ namespace detail
+ {
+ template< class Self >
+ struct lightweight_forward_adapter_result::apply< Self() >
+ : boost::result_of< BOOST_DEDUCED_TYPENAME c<Self>::t() >
+ { };
+
+ // When operator() doesn't have any parameters, it can't
+ // be templatized and can't use SFINAE, so intead use class
+ // template parameter SFINAE to decide whether to instantiate it.
+
+ template <typename T, typename R = void>
+ struct lightweight_forward_adapter_sfinae
+ {
+ typedef T type;
+ };
+
+ // This is the fallback for when there isn't an operator()(),
+ // need to create an operator() that will never instantiate
+ // so that using parent::operator() will work okay.
+ template< class MD, class F, class FC, class Enable = void>
+ struct lightweight_forward_adapter_impl_zero
+ : lightweight_forward_adapter_result
+ {
+ template <typename T> struct never_instantiate {};
+ template <typename T>
+ typename never_instantiate<T>::type operator()(T) const {}
+ };
+
+ template< class MD, class F, class FC>
+ struct lightweight_forward_adapter_impl_zero<MD, F, FC,
+ typename lightweight_forward_adapter_sfinae<typename boost::result_of< FC() >::type>::type>
+ : lightweight_forward_adapter_result
+ {
+ inline typename boost::result_of< FC() >::type
+ operator()() const
+ {
+ return static_cast<MD const*>(this)->target_function()();
+ }
+
+ inline typename boost::result_of< F() >::type
+ operator()()
+ {
+ return static_cast<MD*>(this)->target_function()();
+ }
+ };
+
+ template< class MD, class F, class FC >
+ struct lightweight_forward_adapter_impl<MD,F,FC,0,0>
+ : lightweight_forward_adapter_impl_zero<MD,F,FC>
+ {
+ };
+
+# define BOOST_PP_FILENAME_1 \
+ <boost/functional/lightweight_forward_adapter.hpp>
+# define BOOST_PP_ITERATION_LIMITS \
+ (1,BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_MAX_ARITY)
+# include BOOST_PP_ITERATE()
+
+ } // namespace detail
+
+ template<class F, int A0, int A1>
+ struct result_of<boost::lightweight_forward_adapter<F,A0,A1> const ()>
+ : boost::detail::lightweight_forward_adapter_result::template apply<
+ boost::lightweight_forward_adapter<F,A0,A1> const () >
+ { };
+ template<class F, int A0, int A1>
+ struct result_of<boost::lightweight_forward_adapter<F,A0,A1>()>
+ : boost::detail::lightweight_forward_adapter_result::template apply<
+ boost::lightweight_forward_adapter<F,A0,A1>() >
+ { };
+ template<class F, int A0, int A1>
+ struct result_of<boost::lightweight_forward_adapter<F,A0,A1> const& ()>
+ : boost::detail::lightweight_forward_adapter_result::template apply<
+ boost::lightweight_forward_adapter<F,A0,A1> const () >
+ { };
+ template<class F, int A0, int A1>
+ struct result_of<boost::lightweight_forward_adapter<F,A0,A1>& ()>
+ : boost::detail::lightweight_forward_adapter_result::template apply<
+ boost::lightweight_forward_adapter<F,A0,A1>() >
+ { };
+}
+
+# define BOOST_FUNCTIONAL_LIGHTWEIGHT_FORWARD_ADAPTER_HPP_INCLUDED
+
+# else // defined(BOOST_PP_IS_ITERATING)
+# define N BOOST_PP_ITERATION()
+
+ template< class Self, BOOST_PP_ENUM_PARAMS(N,typename T) >
+ struct lightweight_forward_adapter_result::apply<
+ Self (BOOST_PP_ENUM_PARAMS(N,T)) >
+ : boost::result_of<
+ BOOST_DEDUCED_TYPENAME c<Self>::t (BOOST_PP_ENUM_BINARY_PARAMS(N,
+ typename x<T,>::t BOOST_PP_INTERCEPT)) >
+ { };
+
+ template< class MD, class F, class FC >
+ struct lightweight_forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),N>
+ : lightweight_forward_adapter_result
+ {
+ template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+ inline typename boost::result_of< F(BOOST_PP_ENUM_BINARY_PARAMS(N,
+ T,const& BOOST_PP_INTERCEPT)) >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT));
+ };
+
+ template< class MD, class F, class FC, int MinArity >
+ struct lightweight_forward_adapter_impl<MD,F,FC,N,MinArity>
+ : lightweight_forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),MinArity>
+ {
+ using lightweight_forward_adapter_impl<MD,F,FC,BOOST_PP_DEC(N),
+ MinArity>::operator();
+
+# define M(z,i,d) \
+ static_cast<typename d::template x<T##i>::t>(a##i)
+
+ template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+ inline typename lightweight_forward_adapter_result::template apply<
+ MD const (BOOST_PP_ENUM_BINARY_PARAMS(N,
+ T,const& BOOST_PP_INTERCEPT)) >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const& a)) const
+ {
+ typedef lightweight_forward_adapter_result _;
+ return static_cast<MD const*>(this)->target_function()(
+ BOOST_PP_ENUM(N,M,_));
+ }
+ template< BOOST_PP_ENUM_PARAMS(N,typename T) >
+ inline typename lightweight_forward_adapter_result::template apply<
+ MD (BOOST_PP_ENUM_BINARY_PARAMS(N,
+ T,const& BOOST_PP_INTERCEPT)) >::type
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const& a))
+ {
+ typedef lightweight_forward_adapter_result _;
+ return static_cast<MD*>(this)->target_function()(
+ BOOST_PP_ENUM(N,M,_));
+ }
+# undef M
+ };
+
+# undef N
+# endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+
diff --git a/include/boost/functional/overloaded_function.hpp b/include/boost/functional/overloaded_function.hpp
new file mode 100644
index 0000000..83fe4b3
--- /dev/null
+++ b/include/boost/functional/overloaded_function.hpp
@@ -0,0 +1,311 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#ifndef DOXYGEN // Doxygen documentation only.
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_HPP_
+# define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_HPP_
+
+# include <boost/functional/overloaded_function/detail/base.hpp>
+# include <boost/functional/overloaded_function/detail/function_type.hpp>
+# include <boost/functional/overloaded_function/config.hpp>
+# include <boost/typeof/typeof.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/control/expr_iif.hpp>
+# include <boost/preprocessor/control/expr_if.hpp>
+# include <boost/preprocessor/comparison/greater.hpp>
+# include <boost/preprocessor/comparison/less.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/arithmetic/add.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/logical/and.hpp>
+# include <boost/preprocessor/logical/not.hpp>
+# include <boost/preprocessor/facilities/expand.hpp>
+
+#define BOOST_FUNCTIONAL_f_type(z, n, unused) \
+ BOOST_PP_CAT(F, n)
+
+#define BOOST_FUNCTIONAL_f_arg(z, n, unused) \
+ BOOST_PP_CAT(f, n)
+
+#define BOOST_FUNCTIONAL_f_tparam(z, n, unused) \
+ typename BOOST_FUNCTIONAL_f_type(z, n, ~) \
+
+#define BOOST_FUNCTIONAL_f_tparam_dflt(z, n, is_tspec) \
+ BOOST_FUNCTIONAL_f_tparam(z, n, ~) \
+ /* overload requires at least 2 functors so F0 and F1 not optional */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_AND(BOOST_PP_NOT(is_tspec), \
+ BOOST_PP_GREATER(n, 1)), \
+ = void \
+ )
+
+#define BOOST_FUNCTIONAL_f_arg_decl(z, n, unused) \
+ BOOST_FUNCTIONAL_f_type(z, n, ~) /* no qualifier to deduce tparam */ \
+ BOOST_FUNCTIONAL_f_arg(z, n, ~)
+
+#define BOOST_FUNCTIONAL_g_type(z, n, unused) \
+ BOOST_PP_CAT(G, n)
+
+#define BOOST_FUNCTIONAL_g_arg(z, n, unused) \
+ BOOST_PP_CAT(g, n)
+
+#define BOOST_FUNCTIONAL_g_tparam(z, n, unused) \
+ typename BOOST_FUNCTIONAL_g_type(z, n, ~)
+
+#define BOOST_FUNCTIONAL_g_arg_decl(z, n, unused) \
+ BOOST_FUNCTIONAL_g_type(z, n, ~) /* no qualifier to deduce tparam */ \
+ BOOST_FUNCTIONAL_g_arg(z, n, ~)
+
+#define BOOST_FUNCTIONAL_base(z, n, unused) \
+ ::boost::overloaded_function_detail::base< \
+ BOOST_FUNCTIONAL_f_type(z, n, ~) \
+ >
+
+#define BOOST_FUNCTIONAL_inherit(z, n, unused) \
+ public BOOST_FUNCTIONAL_base(z, n, ~)
+
+#define BOOST_FUNCTIONAL_base_init(z, n, unused) \
+ BOOST_FUNCTIONAL_base(z, n, ~)(BOOST_FUNCTIONAL_g_arg(z, n, ~))
+
+#define BOOST_FUNCTIONAL_using_operator_call(z, n, unused) \
+ using BOOST_FUNCTIONAL_base(z, n, ~)::operator();
+
+#define BOOST_FUNCTIONAL_function_type(z, n, unused) \
+ typename ::boost::overloaded_function_detail::function_type< \
+ BOOST_FUNCTIONAL_f_type(z, n, ~) \
+ >::type
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ /* at least 2 func to overload so start from 2 to MAX */ \
+ /* (cannot iterate [0, MAX-2) because error on Sun) */ \
+ (3, (2, BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX, \
+ "boost/functional/overloaded_function.hpp"))
+# include BOOST_PP_ITERATE() // Iterate over function arity.
+
+#undef BOOST_FUNCTIONAL_f_type
+#undef BOOST_FUNCTIONAL_f_arg
+#undef BOOST_FUNCTIONAL_f_tparam
+#undef BOOST_FUNCTIONAL_f_arg_decl
+#undef BOOST_FUNCTIONAL_f_tparam_dflt
+#undef BOOST_FUNCTIONAL_g_type
+#undef BOOST_FUNCTIONAL_g_arg
+#undef BOOST_FUNCTIONAL_g_tparam
+#undef BOOST_FUNCTIONAL_g_arg_decl
+#undef BOOST_FUNCTIONAL_base
+#undef BOOST_FUNCTIONAL_inherit
+#undef BOOST_FUNCTIONAL_base_init
+#undef BOOST_FUNCTIONAL_using_operator_call
+#undef BOOST_FUNCTIONAL_function_type
+
+# endif // #include guard
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+# define BOOST_FUNCTIONAL_overloads \
+ /* iterate as OVERLOADS, OVERLOADS-1, OVERLOADS-2, ... */ \
+ /* (add 2 because iteration started from 2 to MAX) */ \
+ BOOST_PP_ADD(2, BOOST_PP_SUB( \
+ BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX, \
+ BOOST_PP_FRAME_ITERATION(1)))
+# define BOOST_FUNCTIONAL_is_tspec \
+ /* if template specialization */ \
+ BOOST_PP_LESS(BOOST_FUNCTIONAL_overloads, \
+ BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX)
+
+// For type-of emulation: This must be included at this pp iteration level.
+# include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+
+namespace boost {
+
+template<
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_tparam_dflt,
+ BOOST_FUNCTIONAL_is_tspec)
+>
+class overloaded_function
+ // Template specialization.
+ BOOST_PP_EXPR_IIF(BOOST_PP_EXPAND(BOOST_FUNCTIONAL_is_tspec), <)
+ BOOST_PP_IIF(BOOST_FUNCTIONAL_is_tspec,
+ BOOST_PP_ENUM
+ ,
+ BOOST_PP_TUPLE_EAT(3)
+ )(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_type, ~)
+ BOOST_PP_EXPR_IIF(BOOST_PP_EXPAND(BOOST_FUNCTIONAL_is_tspec), >)
+ // Bases (overloads >= 2 so always at least 2 bases).
+ : BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+ BOOST_FUNCTIONAL_inherit, ~)
+{
+public:
+ template<
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_g_tparam, ~)
+ > /* implicit */ inline overloaded_function(
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+ BOOST_FUNCTIONAL_g_arg_decl, ~))
+ // Overloads >= 2 so always at least 2 bases to initialize.
+ : BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+ BOOST_FUNCTIONAL_base_init, ~)
+ {}
+
+ BOOST_PP_REPEAT(BOOST_FUNCTIONAL_overloads,
+ BOOST_FUNCTIONAL_using_operator_call, ~)
+};
+
+template<
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_tparam, ~)
+>
+overloaded_function<
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_function_type, ~)
+> make_overloaded_function(
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_arg_decl, ~)
+) {
+ return overloaded_function<
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads,
+ BOOST_FUNCTIONAL_function_type, ~)
+ >(BOOST_PP_ENUM(BOOST_FUNCTIONAL_overloads, BOOST_FUNCTIONAL_f_arg, ~));
+}
+
+} // namespace
+
+// For type-of emulation: Register overloaded function type (for _AUTO, etc).
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::overloaded_function,
+ BOOST_FUNCTIONAL_overloads)
+
+# undef BOOST_FUNCTIONAL_overloads
+# undef BOOST_FUNCTIONAL_is_tspec
+#endif // iteration
+
+// DOCUMENTATION //
+
+#else // DOXYGEN
+
+/** @file
+@brief Overload distinct function pointers, function references, and
+monomorphic function objects into a single function object.
+*/
+
+namespace boost {
+
+/**
+@brief Function object to overload functions with distinct signatures.
+
+This function object aggregates together calls to functions of all the
+specified function types <c>F1</c>, <c>F2</c>, etc which must have distinct
+function signatures from one another.
+
+@Params
+@Param{F<em>i</em>,
+Each function type must be specified using the following syntax (which is
+Boost.Function's preferred syntax):
+@code
+ result_type (argument1_type\, argumgnet2_type\, ...)
+@endcode
+}
+@EndParams
+
+In some cases, the @RefFunc{make_overloaded_function} function template can be
+useful to construct an overloaded function object without explicitly
+specifying the function types.
+
+At least two distinct function types must be specified (because there is
+nothing to overload between one or zero functions).
+The maximum number of functions to overload is given by the
+@RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX}
+configuration macro.
+The maximum number of function parameters for each of the specified function
+types is given by the
+@RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX}
+configuration macro.
+
+@See @RefSect{tutorial, Tutorial} section, @RefFunc{make_overloaded_function},
+@RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX},
+@RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX},
+Boost.Function.
+*/
+template<typename F1, typename F2, ...>
+class overloaded_function {
+public:
+ /**
+ @brief Construct the overloaded function object.
+
+ Any function pointer, function reference, and monomorphic function object
+ that can be converted to a <c>boost::function</c> function object can be
+ specified as parameter.
+
+ @Note Unfortunately, it is not possible to support polymorphic function
+ objects (as explained <a
+ href="http://lists.boost.org/Archives/boost/2012/03/191744.php">here</a>).
+ */
+ overloaded_function(const boost::function<F1>&,
+ const boost::function<F2>&, ...);
+
+ /**
+ @brief Call operator matching the signature of the function type specified
+ as 1st template parameter.
+
+ This will in turn invoke the call operator of the 1st function passed to
+ the constructor.
+ */
+ typename boost::function_traits<F1>::result_type operator()(
+ typename boost::function_traits<F1>::arg1_type,
+ typename boost::function_traits<F1>::arg2_type,
+ ...) const;
+
+ /**
+ @brief Call operator matching the signature of the function type specified
+ as 2nd template parameter.
+
+ This will in turn invoke the call operator of the 2nd function passed to
+ the constructor.
+
+ @Note Similar call operators are present for all specified function types
+ <c>F1</c>, <c>F2</c>, etc (even if not exhaustively listed by this
+ documentation).
+ */
+ typename boost::function_traits<F2>::result_type operator()(
+ typename boost::function_traits<F2>::arg1_type,
+ typename boost::function_traits<F2>::arg2_type,
+ ...) const;
+};
+
+/**
+@brief Make an overloaded function object without explicitly specifying the
+function types.
+
+This function template creates and returns an @RefClass{overloaded_function}
+object that overloads all the specified functions <c>f1</c>, <c>f2</c>, etc.
+
+The function types are internally determined from the template parameter types
+so they do not need to be explicitly specified.
+Therefore, this function template usually has a more concise syntax when
+compared with @RefClass{overloaded_function}.
+This is especially useful when the explicit type of the returned
+@RefClass{overloaded_function} object does not need to be known (e.g., when
+used with Boost.Typeof's <c>BOOST_AUTO</c>, C++11 <c>auto</c>, or when the
+overloaded function object is handled using a function template parameter, see
+the @RefSect{tutorial, Tutorial} section).
+
+The maximum number of functions to overload is given by the
+@RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX}
+configuration macro.
+
+@Note In this documentation, <c>__function_type__</c> is a placeholder for a
+symbol that is specific to the implementation of this library.
+
+@See @RefSect{tutorial, Tutorial} section, @RefClass{overloaded_function},
+@RefMacro{BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX}.
+*/
+template<typename F1, typename F2, ...>
+overloaded_function<
+ __function_type__<F1>, __function_type__<F2>, ...
+> make_overloaded_function(F1 f1, F2 f2, ...);
+
+} // namespace
+
+#endif // DOXYGEN
+
diff --git a/include/boost/functional/overloaded_function/config.hpp b/include/boost/functional/overloaded_function/config.hpp
new file mode 100644
index 0000000..2f5d9e1
--- /dev/null
+++ b/include/boost/functional/overloaded_function/config.hpp
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_HPP_
+#define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_HPP_
+
+/** @file
+@brief Change the compile-time configuration of this library.
+*/
+
+/**
+@brief Specify the maximum number of arguments of the functions being
+overloaded.
+
+If this macro is left undefined by the user, it has a default value of 5
+(increasing this number might increase compilation time).
+When specified by the user, this macro must be a non-negative integer number.
+
+@See @RefSect{getting_started, Getting Started},
+@RefClass{boost::overloaded_function}.
+*/
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX
+# define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX 5
+#endif
+
+/**
+@brief Specify the maximum number of functions that can be overloaded.
+
+If this macro is left undefined by the user, it has a default value of 5
+(increasing this number might increase compilation time).
+When defined by the user, this macro must be an integer number greater or
+equal than 2 (because at least two distinct functions need to be specified in
+order to define an overload).
+
+@See @RefSect{getting_started, Getting Started},
+@RefClass{boost::overloaded_function}.
+*/
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX
+# define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX 5
+#endif
+#if BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_OVERLOAD_MAX < 2
+# error "maximum overload macro cannot be less than 2"
+#endif
+
+#endif // #include guard
+
diff --git a/include/boost/functional/overloaded_function/detail/base.hpp b/include/boost/functional/overloaded_function/detail/base.hpp
new file mode 100644
index 0000000..8fd9a0a
--- /dev/null
+++ b/include/boost/functional/overloaded_function/detail/base.hpp
@@ -0,0 +1,86 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_BASE_HPP_
+# define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_BASE_HPP_
+
+# include <boost/functional/overloaded_function/config.hpp>
+# include <boost/function.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/comma_if.hpp>
+
+#define BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused) \
+ BOOST_PP_CAT(A, n)
+
+#define BOOST_FUNCTIONAL_DETAIL_arg_name(z, n, unused) \
+ BOOST_PP_CAT(a, n)
+
+#define BOOST_FUNCTIONAL_DETAIL_arg_tparam(z, n, unused) \
+ typename BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused)
+
+#define BOOST_FUNCTIONAL_DETAIL_arg(z, n, unused) \
+ BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused) \
+ BOOST_FUNCTIONAL_DETAIL_arg_name(z, n, unused)
+
+#define BOOST_FUNCTIONAL_DETAIL_f \
+ R (BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity, \
+ BOOST_FUNCTIONAL_DETAIL_arg_type, ~))
+
+// Do not use namespace ::detail because overloaded_function is already a class.
+namespace boost { namespace overloaded_function_detail {
+
+template<typename F>
+class base {}; // Empty template cannot be used directly (only its spec).
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (0, BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX, \
+ "boost/functional/overloaded_function/detail/base.hpp"))
+# include BOOST_PP_ITERATE() // Iterate over funciton arity.
+
+} } // namespace
+
+#undef BOOST_FUNCTIONAL_DETAIL_arg_type
+#undef BOOST_FUNCTIONAL_DETAIL_arg_name
+#undef BOOST_FUNCTIONAL_DETAIL_arg_tparam
+#undef BOOST_FUNCTIONAL_DETAIL_arg
+#undef BOOST_FUNCTIONAL_DETAIL_f
+
+# endif // #include guard
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+# define BOOST_FUNCTIONAL_DETAIL_arity BOOST_PP_FRAME_ITERATION(1)
+
+template<
+ typename R
+ BOOST_PP_COMMA_IF(BOOST_FUNCTIONAL_DETAIL_arity)
+ BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
+ BOOST_FUNCTIONAL_DETAIL_arg_tparam, ~)
+>
+class base< BOOST_FUNCTIONAL_DETAIL_f > {
+public:
+ /* implicit */ inline base(
+ // This requires specified type to be implicitly convertible to
+ // a boost::function<> functor.
+ boost::function< BOOST_FUNCTIONAL_DETAIL_f > const& f): f_(f)
+ {}
+
+ inline R operator()(BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
+ BOOST_FUNCTIONAL_DETAIL_arg, ~)) const {
+ return f_(BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
+ BOOST_FUNCTIONAL_DETAIL_arg_name, ~));
+ }
+
+private:
+ boost::function< BOOST_FUNCTIONAL_DETAIL_f > const f_;
+};
+
+# undef BOOST_FUNCTIONAL_DETAIL_arity
+#endif // iteration
+
diff --git a/include/boost/functional/overloaded_function/detail/function_type.hpp b/include/boost/functional/overloaded_function/detail/function_type.hpp
new file mode 100644
index 0000000..0c28607
--- /dev/null
+++ b/include/boost/functional/overloaded_function/detail/function_type.hpp
@@ -0,0 +1,85 @@
+
+// Copyright (C) 2009-2012 Lorenzo Caminiti
+// Distributed under the Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+// Home at http://www.boost.org/libs/functional/overloaded_function
+
+#ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_FUNCTION_TYPE_HPP_
+#define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_FUNCTION_TYPE_HPP_
+
+#include <boost/function_types/is_function.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/function.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/typeof/typeof.hpp>
+
+// Do not use namespace ::detail because overloaded_function is already a class.
+namespace boost { namespace overloaded_function_detail {
+
+// Requires: F is a monomorphic functor (i.e., has non-template `operator()`).
+// Returns: F's function type `result_type (arg1_type, arg2_type, ...)`.
+// It does not assume F typedef result_type, arg1_type, ... but needs typeof.
+template<typename F>
+class functor_type {
+ // NOTE: clang does not accept extra parenthesis `&(...)`.
+ typedef BOOST_TYPEOF_TPL(&F::operator()) call_ptr;
+public:
+ typedef
+ typename boost::function_types::function_type<
+ typename boost::mpl::push_front<
+ typename boost::mpl::pop_front< // Remove functor type (1st).
+ typename boost::function_types::parameter_types<
+ call_ptr>::type
+ >::type
+ , typename boost::function_types::result_type<call_ptr>::type
+ >::type
+ >::type
+ type;
+};
+
+// NOTE: When using boost::function in Boost.Typeof emulation mode, the user
+// has to register boost::functionN instead of boost::function in oder to
+// do TYPEOF(F::operator()). That is confusing, so boost::function is handled
+// separately so it does not require any Boost.Typeof registration at all.
+template<typename F>
+struct functor_type< boost::function<F> > {
+ typedef F type;
+};
+
+// Requires: F is a function type, pointer, reference, or monomorphic functor.
+// Returns: F's function type `result_type (arg1_type, arg2_type, ...)`.
+template<typename F>
+struct function_type {
+ typedef
+ typename boost::mpl::if_<boost::function_types::is_function<F>,
+ boost::mpl::identity<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_pointer<F>,
+ boost::remove_pointer<F>
+ ,
+ typename boost::mpl::if_<boost::function_types::
+ is_function_reference<F>,
+ boost::remove_reference<F>
+ , // Else, requires that F is a functor.
+ functor_type<F>
+ >::type
+ >::type
+ >::type
+ ::type type;
+};
+
+} } // namespace
+
+#endif // #include guard
+
diff --git a/include/boost/functional/value_factory.hpp b/include/boost/functional/value_factory.hpp
new file mode 100644
index 0000000..ba94c2a
--- /dev/null
+++ b/include/boost/functional/value_factory.hpp
@@ -0,0 +1,69 @@
+/*=============================================================================
+ Copyright (c) 2007 Tobias Schwinger
+
+ Use modification and distribution are subject to the Boost Software
+ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+==============================================================================*/
+
+#ifndef BOOST_FUNCTIONAL_VALUE_FACTORY_HPP_INCLUDED
+# ifndef BOOST_PP_IS_ITERATING
+
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+# include <new>
+# include <boost/pointee.hpp>
+# include <boost/get_pointer.hpp>
+# include <boost/non_type.hpp>
+# include <boost/type_traits/remove_cv.hpp>
+
+# ifndef BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY
+# define BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY 10
+# elif BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY < 3
+# undef BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY
+# define BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY 3
+# endif
+
+namespace boost
+{
+ template< typename T >
+ class value_factory;
+
+ //----- ---- --- -- - - - -
+
+ template< typename T >
+ class value_factory
+ {
+ public:
+ typedef T result_type;
+
+ value_factory()
+ { }
+
+# define BOOST_PP_FILENAME_1 <boost/functional/value_factory.hpp>
+# define BOOST_PP_ITERATION_LIMITS (0,BOOST_FUNCTIONAL_VALUE_FACTORY_MAX_ARITY)
+# include BOOST_PP_ITERATE()
+ };
+
+ template< typename T > class value_factory<T&>;
+ // forbidden, would create a dangling reference
+}
+# define BOOST_FUNCTIONAL_VALUE_FACTORY_HPP_INCLUDED
+# else // defined(BOOST_PP_IS_ITERATING)
+
+# define N BOOST_PP_ITERATION()
+# if N > 0
+ template< BOOST_PP_ENUM_PARAMS(N, typename T) >
+# endif
+ inline result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+ {
+ return result_type(BOOST_PP_ENUM_PARAMS(N,a));
+ }
+# undef N
+
+# endif // defined(BOOST_PP_IS_ITERATING)
+
+#endif // include guard
+