]> git.lyx.org Git - lyx.git/blob - boost/boost/utility/detail/result_of_iterate.hpp
boost: add eol property
[lyx.git] / 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 // For more information, see http://www.boost.org/libs/utility
9 #if !defined(BOOST_PP_IS_ITERATING)
10 # error Boost result_of - do not include this file!
11 #endif
12
13 // CWPro8 requires an argument in a function type specialization
14 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
15 # define BOOST_RESULT_OF_ARGS void
16 #else
17 # define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
18 #endif
19
20 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
21 template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
22          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
23 struct result_of<F(BOOST_RESULT_OF_ARGS)>
24     : boost::detail::result_of_impl<F, F(BOOST_RESULT_OF_ARGS), (boost::detail::has_result_type<F>::value)> {};
25 #endif
26
27 #undef BOOST_RESULT_OF_ARGS
28
29 #if BOOST_PP_ITERATION() >= 1 
30
31 namespace detail {
32
33 template<typename R,  typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
34          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
35 struct result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
36 {
37   typedef R type;
38 };
39
40 template<typename R,  typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
41          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
42 struct result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
43 {
44   typedef R type;
45 };
46
47 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
48 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
49          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
50 struct result_of_impl<R (T0::*)
51                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
52                  FArgs, false>
53 {
54   typedef R type;
55 };
56
57 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
58          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
59 struct result_of_impl<R (T0::*)
60                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
61                      const,
62                  FArgs, false>
63 {
64   typedef R type;
65 };
66
67 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
68          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
69 struct result_of_impl<R (T0::*)
70                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
71                      volatile,
72                  FArgs, false>
73 {
74   typedef R type;
75 };
76
77 template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
78          BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
79 struct result_of_impl<R (T0::*)
80                      (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
81                      const volatile,
82                  FArgs, false>
83 {
84   typedef R type;
85 };
86 #endif
87
88 }
89 #endif