1 | // Copyright Cromwell D. Enage 2019. |
---|---|
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // (See accompanying file LICENSE_1_0.txt or copy at |
4 | // http://www.boost.org/LICENSE_1_0.txt) |
5 | |
6 | #ifndef BOOST_PARAMETER_AUX_HAS_NESTED_TEMPLATE_FN_HPP |
7 | #define BOOST_PARAMETER_AUX_HAS_NESTED_TEMPLATE_FN_HPP |
8 | |
9 | #include <boost/parameter/aux_/yesno.hpp> |
10 | #include <boost/parameter/aux_/preprocessor/nullptr.hpp> |
11 | #include <boost/parameter/config.hpp> |
12 | |
13 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
14 | #include <boost/mp11/integral.hpp> |
15 | #include <boost/mp11/utility.hpp> |
16 | #else |
17 | #include <boost/mpl/bool.hpp> |
18 | #include <boost/mpl/identity.hpp> |
19 | #endif |
20 | |
21 | namespace boost { namespace parameter { namespace aux { |
22 | |
23 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
24 | template <template <typename ...> class F> |
25 | struct has_nested_template_fn_variadic |
26 | { |
27 | }; |
28 | #else |
29 | template <template <typename P0, typename P1> class F> |
30 | struct has_nested_template_fn_arity_2 |
31 | { |
32 | }; |
33 | #endif |
34 | |
35 | template <typename T> |
36 | class has_nested_template_fn_impl |
37 | { |
38 | template <typename U> |
39 | static ::boost::parameter::aux::no_tag _check(...); |
40 | |
41 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
42 | template <typename U> |
43 | static ::boost::parameter::aux::yes_tag |
44 | _check( |
45 | ::boost::mp11::mp_identity<U> const volatile* |
46 | , ::boost::parameter::aux::has_nested_template_fn_variadic< |
47 | U::template fn |
48 | >* = BOOST_PARAMETER_AUX_PP_NULLPTR |
49 | ); |
50 | #else |
51 | template <typename U> |
52 | static BOOST_CONSTEXPR ::boost::parameter::aux::yes_tag |
53 | _check( |
54 | ::boost::mpl::identity<U> const volatile* |
55 | , ::boost::parameter::aux::has_nested_template_fn_arity_2< |
56 | U::template fn |
57 | >* = BOOST_PARAMETER_AUX_PP_NULLPTR |
58 | ); |
59 | #endif |
60 | |
61 | public: |
62 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
63 | using type = ::boost::mp11::mp_bool< |
64 | #else |
65 | typedef ::boost::mpl::bool_< |
66 | #endif |
67 | sizeof( |
68 | ::boost::parameter::aux::has_nested_template_fn_impl<T> |
69 | ::template _check<T>( |
70 | static_cast< |
71 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
72 | ::boost::mp11::mp_identity<T> const volatile* |
73 | #else |
74 | ::boost::mpl::identity<T> const volatile* |
75 | #endif |
76 | >(BOOST_PARAMETER_AUX_PP_NULLPTR) |
77 | ) |
78 | ) == sizeof(::boost::parameter::aux::yes_tag) |
79 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
80 | >; |
81 | #else |
82 | > type; |
83 | #endif |
84 | }; |
85 | }}} // namespace boost::parameter::aux |
86 | |
87 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
88 | #include <type_traits> |
89 | #else |
90 | #include <boost/type_traits/remove_const.hpp> |
91 | #endif |
92 | |
93 | namespace boost { namespace parameter { namespace aux { |
94 | |
95 | template <typename T> |
96 | #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
97 | using has_nested_template_fn = typename ::boost::parameter::aux |
98 | ::has_nested_template_fn_impl<typename ::std::remove_const<T>::type> |
99 | ::type; |
100 | #else |
101 | struct has_nested_template_fn |
102 | : ::boost::parameter::aux::has_nested_template_fn_impl< |
103 | typename ::boost::remove_const<T>::type |
104 | >::type |
105 | { |
106 | }; |
107 | #endif |
108 | }}} // namespace boost::parameter::aux |
109 | |
110 | #endif // include guard |
111 | |
112 |