• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 // Copyright (C) 2009-2012 Lorenzo Caminiti
3 // Distributed under the Boost Software License, Version 1.0
4 // (see accompanying file LICENSE_1_0.txt or a copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 // Home at http://www.boost.org/libs/functional/overloaded_function
7 
8 #if !BOOST_PP_IS_ITERATING
9 #   ifndef BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_BASE_HPP_
10 #       define BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_DETAIL_BASE_HPP_
11 
12 #       include <boost/functional/overloaded_function/config.hpp>
13 #       include <boost/function.hpp>
14 #       include <boost/preprocessor/iteration/iterate.hpp>
15 #       include <boost/preprocessor/repetition/enum.hpp>
16 #       include <boost/preprocessor/cat.hpp>
17 #       include <boost/preprocessor/comma_if.hpp>
18 
19 #define BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused) \
20     BOOST_PP_CAT(A, n)
21 
22 #define BOOST_FUNCTIONAL_DETAIL_arg_name(z, n, unused) \
23     BOOST_PP_CAT(a, n)
24 
25 #define BOOST_FUNCTIONAL_DETAIL_arg_tparam(z, n, unused) \
26     typename BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused)
27 
28 #define BOOST_FUNCTIONAL_DETAIL_arg(z, n, unused) \
29     BOOST_FUNCTIONAL_DETAIL_arg_type(z, n, unused) \
30     BOOST_FUNCTIONAL_DETAIL_arg_name(z, n, unused)
31 
32 #define BOOST_FUNCTIONAL_DETAIL_f \
33     R (BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity, \
34             BOOST_FUNCTIONAL_DETAIL_arg_type, ~))
35 
36 // Do not use namespace ::detail because overloaded_function is already a class.
37 namespace boost { namespace overloaded_function_detail {
38 
39 template<typename F>
40 class base {}; // Empty template cannot be used directly (only its spec).
41 
42 #       define BOOST_PP_ITERATION_PARAMS_1 \
43                 (3, (0, BOOST_FUNCTIONAL_OVERLOADED_FUNCTION_CONFIG_ARITY_MAX, \
44                 "boost/functional/overloaded_function/detail/base.hpp"))
45 #       include BOOST_PP_ITERATE() // Iterate over funciton arity.
46 
47 } } // namespace
48 
49 #undef BOOST_FUNCTIONAL_DETAIL_arg_type
50 #undef BOOST_FUNCTIONAL_DETAIL_arg_name
51 #undef BOOST_FUNCTIONAL_DETAIL_arg_tparam
52 #undef BOOST_FUNCTIONAL_DETAIL_arg
53 #undef BOOST_FUNCTIONAL_DETAIL_f
54 
55 #   endif // #include guard
56 
57 #elif BOOST_PP_ITERATION_DEPTH() == 1
58 #   define BOOST_FUNCTIONAL_DETAIL_arity BOOST_PP_FRAME_ITERATION(1)
59 
60 template<
61     typename R
62     BOOST_PP_COMMA_IF(BOOST_FUNCTIONAL_DETAIL_arity)
63     BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
64             BOOST_FUNCTIONAL_DETAIL_arg_tparam, ~)
65 >
66 class base< BOOST_FUNCTIONAL_DETAIL_f > {
67 public:
base(boost::function<BOOST_FUNCTIONAL_DETAIL_f> const & f)68     /* implicit */ inline base(
69             // This requires specified type to be implicitly convertible to
70             // a boost::function<> functor.
71             boost::function< BOOST_FUNCTIONAL_DETAIL_f > const& f): f_(f)
72     {}
73 
74     inline R operator()(BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
75             BOOST_FUNCTIONAL_DETAIL_arg, ~)) const {
76         return f_(BOOST_PP_ENUM(BOOST_FUNCTIONAL_DETAIL_arity,
77                 BOOST_FUNCTIONAL_DETAIL_arg_name, ~));
78     }
79 
80 private:
81     boost::function< BOOST_FUNCTIONAL_DETAIL_f > const f_;
82 };
83 
84 #   undef BOOST_FUNCTIONAL_DETAIL_arity
85 #endif // iteration
86 
87