Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 10:08:48

0001 /*
0002   A meta function which supports using named template type parameters
0003   via Boost.Parameter to specify the template type parameters for
0004   the boost::signals2::signal class.
0005 
0006   Author: Frank Mori Hess <fmhess@users.sourceforge.net>
0007   Begin: 2009-01-22
0008 */
0009 // Copyright Frank Mori Hess 2009
0010 // Use, modification and
0011 // distribution is subject to the Boost Software License, Version
0012 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0013 // http://www.boost.org/LICENSE_1_0.txt)
0014 
0015 // For more information, see http://www.boost.org
0016 
0017 #ifndef BOOST_SIGNALS2_SIGNAL_TYPE_HPP
0018 #define BOOST_SIGNALS2_SIGNAL_TYPE_HPP
0019 
0020 #include <boost/parameter/config.hpp>
0021 
0022 #if BOOST_PARAMETER_MAX_ARITY < 7
0023 #error Define BOOST_PARAMETER_MAX_ARITY as 7 or greater.
0024 #endif
0025 
0026 #include <boost/parameter/template_keyword.hpp>
0027 #include <boost/parameter/parameters.hpp>
0028 #include <boost/parameter/required.hpp>
0029 #include <boost/parameter/optional.hpp>
0030 #include <boost/parameter/value_type.hpp>
0031 #include <boost/type_traits/is_function.hpp>
0032 #include <boost/type_traits/function_traits.hpp>
0033 #include <boost/signals2/signal.hpp>
0034 #include <functional>
0035 
0036 namespace boost
0037 {
0038   namespace signals2
0039   {
0040     namespace keywords
0041     {
0042       BOOST_PARAMETER_TEMPLATE_KEYWORD(signature_type)
0043       BOOST_PARAMETER_TEMPLATE_KEYWORD(combiner_type)
0044       BOOST_PARAMETER_TEMPLATE_KEYWORD(group_type)
0045       BOOST_PARAMETER_TEMPLATE_KEYWORD(group_compare_type)
0046       BOOST_PARAMETER_TEMPLATE_KEYWORD(slot_function_type)
0047       BOOST_PARAMETER_TEMPLATE_KEYWORD(extended_slot_function_type)
0048       BOOST_PARAMETER_TEMPLATE_KEYWORD(mutex_type)
0049     } // namespace keywords
0050 
0051     template <
0052         typename A0,
0053         typename A1 = parameter::void_,
0054         typename A2 = parameter::void_,
0055         typename A3 = parameter::void_,
0056         typename A4 = parameter::void_,
0057         typename A5 = parameter::void_,
0058         typename A6 = parameter::void_
0059       >
0060     class signal_type
0061     {
0062       typedef parameter::parameters<
0063           parameter::required<keywords::tag::signature_type, is_function<boost::mpl::_> >,
0064           parameter::optional<keywords::tag::combiner_type>,
0065           parameter::optional<keywords::tag::group_type>,
0066           parameter::optional<keywords::tag::group_compare_type>,
0067           parameter::optional<keywords::tag::slot_function_type>,
0068           parameter::optional<keywords::tag::extended_slot_function_type>,
0069           parameter::optional<keywords::tag::mutex_type>
0070         > parameter_spec;
0071 
0072     public:
0073       // ArgumentPack
0074       typedef typename parameter_spec::bind<A0, A1, A2, A3, A4, A5, A6>::type
0075         args;
0076 
0077       typedef typename parameter::value_type<args, keywords::tag::signature_type>::type
0078         signature_type;
0079 
0080       typedef typename parameter::value_type
0081         <
0082           args,
0083           keywords::tag::combiner_type,
0084           optional_last_value
0085             <
0086               typename boost::function_traits<signature_type>::result_type
0087             >
0088         >::type combiner_type;
0089 
0090       typedef typename
0091         parameter::value_type<args, keywords::tag::group_type, int>::type group_type;
0092 
0093       typedef typename
0094         parameter::value_type<args, keywords::tag::group_compare_type, std::less<group_type> >::type
0095         group_compare_type;
0096 
0097       typedef typename
0098         parameter::value_type<args, keywords::tag::slot_function_type, function<signature_type> >::type
0099         slot_function_type;
0100 
0101       typedef typename
0102         parameter::value_type
0103           <
0104             args,
0105             keywords::tag::extended_slot_function_type,
0106             typename detail::extended_signature<function_traits<signature_type>::arity, signature_type>::function_type
0107           >::type
0108           extended_slot_function_type;
0109 
0110       typedef typename
0111         parameter::value_type<args, keywords::tag::mutex_type, mutex>::type mutex_type;
0112 
0113       typedef signal
0114         <
0115           signature_type,
0116           combiner_type,
0117           group_type,
0118           group_compare_type,
0119           slot_function_type,
0120           extended_slot_function_type,
0121           mutex_type
0122         > type;
0123     };
0124   } // namespace signals2
0125 } // namespace boost
0126 
0127 #endif // BOOST_SIGNALS2_SIGNAL_TYPE_HPP