]> git.lyx.org Git - lyx.git/blob - 3rdparty/boost/boost/signals2/signal_type.hpp
Replace Boost.Signals with Boost.Signals2
[lyx.git] / 3rdparty / boost / boost / signals2 / signal_type.hpp
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
6   Author: Frank Mori Hess <fmhess@users.sourceforge.net>
7   Begin: 2009-01-22
8 */
9 // Copyright Frank Mori Hess 2009
10 // Use, modification and
11 // distribution is subject to the Boost Software License, Version
12 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
13 // http://www.boost.org/LICENSE_1_0.txt)
14
15 // For more information, see http://www.boost.org
16
17 #ifndef BOOST_SIGNALS2_SIGNAL_TYPE_HPP
18 #define BOOST_SIGNALS2_SIGNAL_TYPE_HPP
19
20 // support for function types is currently broken in Boost.Parameter
21 // #define BOOST_SIGNALS2_NAMED_SIGNATURE_PARAMETER
22
23 #include <boost/signals2/signal.hpp>
24
25 #if !defined(BOOST_PARAMETER_MAX_ARITY)
26 #define BOOST_PARAMETER_MAX_ARITY 7
27 #else
28 #if BOOST_PARAMETER_MAX_ARITY < 7
29 #error This header requires BOOST_PARAMETER_MAX_ARITY to be defined as 7 or greater prior to including Boost.Parameter headers
30 #endif // BOOST_PARAMETER_MAX_ARITY < 7
31 #endif // !defined(BOOST_PARAMETER_MAX_ARITY)
32 #include <boost/parameter.hpp>
33
34 #include <boost/type_traits/is_function.hpp>
35
36 namespace boost
37 {
38   namespace signals2
39   {
40     namespace keywords
41     {
42 #ifdef BOOST_SIGNALS2_NAMED_SIGNATURE_PARAMETER
43       BOOST_PARAMETER_TEMPLATE_KEYWORD(signature_type)
44 #endif
45       BOOST_PARAMETER_TEMPLATE_KEYWORD(combiner_type)
46       BOOST_PARAMETER_TEMPLATE_KEYWORD(group_type)
47       BOOST_PARAMETER_TEMPLATE_KEYWORD(group_compare_type)
48       BOOST_PARAMETER_TEMPLATE_KEYWORD(slot_function_type)
49       BOOST_PARAMETER_TEMPLATE_KEYWORD(extended_slot_function_type)
50       BOOST_PARAMETER_TEMPLATE_KEYWORD(mutex_type)
51     } // namespace keywords
52
53     template <
54 #ifdef BOOST_SIGNALS2_NAMED_SIGNATURE_PARAMETER
55         typename A0,
56 #else
57         typename Signature,
58 #endif
59         typename A1 = parameter::void_,
60         typename A2 = parameter::void_,
61         typename A3 = parameter::void_,
62         typename A4 = parameter::void_,
63         typename A5 = parameter::void_,
64         typename A6 = parameter::void_
65       >
66     class signal_type
67     {
68       typedef parameter::parameters<
69 #ifdef BOOST_SIGNALS2_NAMED_SIGNATURE_PARAMETER
70           parameter::required<keywords::tag::signature_type, is_function<boost::mpl::_> >,
71 #endif
72           parameter::optional<keywords::tag::combiner_type>,
73           parameter::optional<keywords::tag::group_type>,
74           parameter::optional<keywords::tag::group_compare_type>,
75           parameter::optional<keywords::tag::slot_function_type>,
76           parameter::optional<keywords::tag::extended_slot_function_type>,
77           parameter::optional<keywords::tag::mutex_type>
78         > parameter_spec;
79
80     public:
81       // ArgumentPack
82       typedef typename
83         parameter_spec::bind<
84 #ifdef BOOST_SIGNALS2_NAMED_SIGNATURE_PARAMETER
85         A0,
86 #endif
87         A1, A2, A3, A4, A5, A6>::type
88         args;
89
90 #ifdef BOOST_SIGNALS2_NAMED_SIGNATURE_PARAMETER
91       typedef typename parameter::value_type<args, keywords::tag::signature_type>::type
92         signature_type;
93 #else
94       typedef Signature signature_type;
95 #endif
96
97       typedef typename parameter::value_type
98         <
99           args,
100           keywords::tag::combiner_type,
101           optional_last_value
102             <
103               typename boost::function_traits<signature_type>::result_type
104             >
105         >::type combiner_type;
106
107       typedef typename
108         parameter::value_type<args, keywords::tag::group_type, int>::type group_type;
109
110       typedef typename
111         parameter::value_type<args, keywords::tag::group_compare_type, std::less<group_type> >::type
112         group_compare_type;
113
114       typedef typename
115         parameter::value_type<args, keywords::tag::slot_function_type, function<signature_type> >::type
116         slot_function_type;
117
118       typedef typename
119         parameter::value_type
120           <
121             args,
122             keywords::tag::extended_slot_function_type,
123             typename detail::extended_signature<function_traits<signature_type>::arity, signature_type>::function_type
124           >::type
125           extended_slot_function_type;
126
127       typedef typename
128         parameter::value_type<args, keywords::tag::mutex_type, mutex>::type mutex_type;
129
130       typedef signal
131         <
132           signature_type,
133           combiner_type,
134           group_type,
135           group_compare_type,
136           slot_function_type,
137           extended_slot_function_type,
138           mutex_type
139         > type;
140     };
141   } // namespace signals2
142 } // namespace boost
143
144 #endif // BOOST_SIGNALS2_SIGNAL_TYPE_HPP