result_of_iterate.hpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Boost result_of library
  2. // Copyright Douglas Gregor 2004. Use, modification and
  3. // distribution is subject to the Boost Software License, Version
  4. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // For more information, see http://www.boost.org/libs/utility
  7. #if !defined(BOOST_PP_IS_ITERATING)
  8. # error Boost result_of - do not include this file!
  9. #endif
  10. // CWPro8 requires an argument in a function type specialization
  11. #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0
  12. # define BOOST_RESULT_OF_ARGS void
  13. #else
  14. # define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)
  15. #endif
  16. #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
  17. template<typename F BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  18. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  19. struct result_of<F(BOOST_RESULT_OF_ARGS)>
  20. : boost::detail::result_of_impl<F, F(BOOST_RESULT_OF_ARGS), (boost::detail::has_result_type<F>::value)> {};
  21. #endif
  22. #undef BOOST_RESULT_OF_ARGS
  23. #if BOOST_PP_ITERATION() >= 1
  24. namespace detail {
  25. template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  26. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  27. struct result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
  28. {
  29. typedef R type;
  30. };
  31. template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  32. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  33. struct result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>
  34. {
  35. typedef R type;
  36. };
  37. #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
  38. template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  39. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  40. struct result_of_impl<R (T0::*)
  41. (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),
  42. FArgs, false>
  43. {
  44. typedef R type;
  45. };
  46. template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  47. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  48. struct result_of_impl<R (T0::*)
  49. (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
  50. const,
  51. FArgs, false>
  52. {
  53. typedef R type;
  54. };
  55. template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  56. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  57. struct result_of_impl<R (T0::*)
  58. (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
  59. volatile,
  60. FArgs, false>
  61. {
  62. typedef R type;
  63. };
  64. template<typename R, typename FArgs BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
  65. BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),typename T)>
  66. struct result_of_impl<R (T0::*)
  67. (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))
  68. const volatile,
  69. FArgs, false>
  70. {
  71. typedef R type;
  72. };
  73. #endif
  74. }
  75. #endif