]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/boost/boost/utility/detail/result_of_iterate.hpp
Add subset of boost library headers needed for compilation on PowerPC
[eurobot/public.git] / src / boost / boost / utility / detail / result_of_iterate.hpp
1 // Boost result_of library
2
3 //  Copyright Douglas Gregor 2004. Use, modification and
4 //  distribution is subject to the Boost Software License, Version
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7
8 //  Copyright Daniel Walker, Eric Niebler, Michel Morin 2008-2012.
9 //  Use, modification and distribution is subject to the Boost Software
10 //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or
11 //  copy at http://www.boost.org/LICENSE_1_0.txt)
12
13 // For more information, see http://www.boost.org/libs/utility
14 #if !defined(BOOST_PP_IS_ITERATING)
15 # error Boost result_of - do not include this file!
16 #endif
17
18 // CWPro8 requires an argument in a function type specialization
19 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
20 # define BOOST_RESULT_OF_ARGS void
21 #else
22 # define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
23 #endif
24
25 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
26 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
27          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
28 struct tr1_result_of<F(BOOST_RESULT_OF_ARGS)>
29     : mpl::if_<
30           mpl::or_< is_pointer<F>, is_member_function_pointer<F> >
31         , boost::detail::tr1_result_of_impl<
32             typename remove_cv<F>::type, 
33             typename remove_cv<F>::type(BOOST_RESULT_OF_ARGS), 
34             (boost::detail::has_result_type<F>::value)>
35         , boost::detail::tr1_result_of_impl<
36             F,
37             F(BOOST_RESULT_OF_ARGS), 
38             (boost::detail::has_result_type<F>::value)> >::type { };
39 #endif
40
41 #if !defined(BOOST_NO_DECLTYPE) && defined(BOOST_RESULT_OF_USE_DECLTYPE)
42
43 // Uses declval following N3225 20.7.7.6 when F is not a pointer.
44 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
45          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
46 struct result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
47     : mpl::if_<
48           is_member_function_pointer<F>
49         , detail::tr1_result_of_impl<
50             typename remove_cv<F>::type, 
51             typename remove_cv<F>::type(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false
52           >
53         , detail::cpp0x_result_of_impl<
54               F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))
55           >
56       >::type
57 {};
58
59 namespace detail {
60
61 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
62          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
63 struct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>
64 {
65   typedef decltype(
66     boost::declval<F>()(
67       BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), declval<T, >() BOOST_PP_INTERCEPT)
68     )
69   ) type;
70 };
71
72 } // namespace detail 
73
74 #else // defined(BOOST_NO_DECLTYPE)
75
76 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
77 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
78          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
79 struct result_of<F(BOOST_RESULT_OF_ARGS)>
80     : tr1_result_of<F(BOOST_RESULT_OF_ARGS)> { };
81 #endif
82
83 #endif // defined(BOOST_NO_DECLTYPE)
84
85 #undef BOOST_RESULT_OF_ARGS
86
87 #if BOOST_PP_ITERATION() >= 1 
88
89 namespace detail {
90
91 template<typename R,  typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
92          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
93 struct tr1_result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
94 {
95   typedef R type;
96 };
97
98 template<typename R,  typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
99          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
100 struct tr1_result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
101 {
102   typedef R type;
103 };
104
105 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
106 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
107          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
108 struct tr1_result_of_impl<R (T0::*)
109                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
110                  FArgs, false>
111 {
112   typedef R type;
113 };
114
115 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
116          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
117 struct tr1_result_of_impl<R (T0::*)
118                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
119                      const,
120                  FArgs, false>
121 {
122   typedef R type;
123 };
124
125 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
126          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
127 struct tr1_result_of_impl<R (T0::*)
128                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
129                      volatile,
130                  FArgs, false>
131 {
132   typedef R type;
133 };
134
135 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
136          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
137 struct tr1_result_of_impl<R (T0::*)
138                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
139                      const volatile,
140                  FArgs, false>
141 {
142   typedef R type;
143 };
144 #endif
145
146 }
147 #endif