signal_type.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. A meta function which supports using named template type parameters
  3. via Boost.Parameter to specify the template type parameters for
  4. the boost::signals2::signal class.
  5. Author: Frank Mori Hess <fmhess@users.sourceforge.net>
  6. Begin: 2009-01-22
  7. */
  8. // Copyright Frank Mori Hess 2009
  9. // Use, modification and
  10. // distribution is subject to the Boost Software License, Version
  11. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  12. // http://www.boost.org/LICENSE_1_0.txt)
  13. // For more information, see http://www.boost.org
  14. #ifndef BOOST_SIGNALS2_SIGNAL_TYPE_HPP
  15. #define BOOST_SIGNALS2_SIGNAL_TYPE_HPP
  16. #include <boost/parameter/config.hpp>
  17. #if BOOST_PARAMETER_MAX_ARITY < 7
  18. #error Define BOOST_PARAMETER_MAX_ARITY as 7 or greater.
  19. #endif
  20. #include <boost/parameter/template_keyword.hpp>
  21. #include <boost/parameter/parameters.hpp>
  22. #include <boost/parameter/required.hpp>
  23. #include <boost/parameter/optional.hpp>
  24. #include <boost/parameter/value_type.hpp>
  25. #include <boost/type_traits/is_function.hpp>
  26. #include <boost/type_traits/function_traits.hpp>
  27. #include <boost/signals2/signal.hpp>
  28. #include <functional>
  29. namespace boost
  30. {
  31. namespace signals2
  32. {
  33. namespace keywords
  34. {
  35. BOOST_PARAMETER_TEMPLATE_KEYWORD(signature_type)
  36. BOOST_PARAMETER_TEMPLATE_KEYWORD(combiner_type)
  37. BOOST_PARAMETER_TEMPLATE_KEYWORD(group_type)
  38. BOOST_PARAMETER_TEMPLATE_KEYWORD(group_compare_type)
  39. BOOST_PARAMETER_TEMPLATE_KEYWORD(slot_function_type)
  40. BOOST_PARAMETER_TEMPLATE_KEYWORD(extended_slot_function_type)
  41. BOOST_PARAMETER_TEMPLATE_KEYWORD(mutex_type)
  42. } // namespace keywords
  43. template <
  44. typename A0,
  45. typename A1 = parameter::void_,
  46. typename A2 = parameter::void_,
  47. typename A3 = parameter::void_,
  48. typename A4 = parameter::void_,
  49. typename A5 = parameter::void_,
  50. typename A6 = parameter::void_
  51. >
  52. class signal_type
  53. {
  54. typedef parameter::parameters<
  55. parameter::required<keywords::tag::signature_type, is_function<boost::mpl::_> >,
  56. parameter::optional<keywords::tag::combiner_type>,
  57. parameter::optional<keywords::tag::group_type>,
  58. parameter::optional<keywords::tag::group_compare_type>,
  59. parameter::optional<keywords::tag::slot_function_type>,
  60. parameter::optional<keywords::tag::extended_slot_function_type>,
  61. parameter::optional<keywords::tag::mutex_type>
  62. > parameter_spec;
  63. public:
  64. // ArgumentPack
  65. typedef typename parameter_spec::bind<A0, A1, A2, A3, A4, A5, A6>::type
  66. args;
  67. typedef typename parameter::value_type<args, keywords::tag::signature_type>::type
  68. signature_type;
  69. typedef typename parameter::value_type
  70. <
  71. args,
  72. keywords::tag::combiner_type,
  73. optional_last_value
  74. <
  75. typename boost::function_traits<signature_type>::result_type
  76. >
  77. >::type combiner_type;
  78. typedef typename
  79. parameter::value_type<args, keywords::tag::group_type, int>::type group_type;
  80. typedef typename
  81. parameter::value_type<args, keywords::tag::group_compare_type, std::less<group_type> >::type
  82. group_compare_type;
  83. typedef typename
  84. parameter::value_type<args, keywords::tag::slot_function_type, function<signature_type> >::type
  85. slot_function_type;
  86. typedef typename
  87. parameter::value_type
  88. <
  89. args,
  90. keywords::tag::extended_slot_function_type,
  91. typename detail::extended_signature<function_traits<signature_type>::arity, signature_type>::function_type
  92. >::type
  93. extended_slot_function_type;
  94. typedef typename
  95. parameter::value_type<args, keywords::tag::mutex_type, mutex>::type mutex_type;
  96. typedef signal
  97. <
  98. signature_type,
  99. combiner_type,
  100. group_type,
  101. group_compare_type,
  102. slot_function_type,
  103. extended_slot_function_type,
  104. mutex_type
  105. > type;
  106. };
  107. } // namespace signals2
  108. } // namespace boost
  109. #endif // BOOST_SIGNALS2_SIGNAL_TYPE_HPP