]> git.lyx.org Git - lyx.git/blob - 3rdparty/boost/boost/parameter/aux_/template_keyword.hpp
Update to boost 1.72
[lyx.git] / 3rdparty / boost / boost / parameter / aux_ / template_keyword.hpp
1 // Copyright Daniel Wallin 2006.
2 // Copyright Cromwell D. Enage 2017.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6
7 #ifndef BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP
8 #define BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP
9
10 namespace boost { namespace parameter { namespace aux {
11
12     struct template_keyword_base
13     {
14     };
15 }}} // namespace boost::parameter::aux
16
17 #include <boost/parameter/config.hpp>
18
19 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
20 #include <type_traits>
21
22 namespace boost { namespace parameter { namespace aux {
23
24     template <typename T>
25     using is_template_keyword = ::std::is_base_of<
26         ::boost::parameter::aux::template_keyword_base
27       , typename ::std::remove_const<
28             typename ::std::remove_reference<T>::type
29         >::type
30     >;
31 }}} // namespace boost::parameter::aux
32
33 #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
34 #include <boost/mpl/bool.hpp>
35 #include <boost/mpl/if.hpp>
36 #include <boost/type_traits/remove_const.hpp>
37
38 #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
39 #include <boost/type_traits/is_base_of.hpp>
40 #include <boost/type_traits/remove_reference.hpp>
41 #else
42 #include <boost/type_traits/is_convertible.hpp>
43 #include <boost/type_traits/is_lvalue_reference.hpp>
44 #endif
45
46 namespace boost { namespace parameter { namespace aux {
47
48 #if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
49     template <typename T>
50     struct is_template_keyword_aux
51       : ::boost::mpl::if_<
52             ::boost::is_convertible<
53                 T*
54               , ::boost::parameter::aux::template_keyword_base const*
55             >
56           , ::boost::mpl::true_
57           , ::boost::mpl::false_
58         >::type
59     {
60     };
61 #endif  // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
62
63     template <typename T>
64     struct is_template_keyword
65       : ::boost::mpl::if_<
66 #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
67             // Cannot use is_convertible<> to check if T is derived from
68             // template_keyword_base. -- Cromwell D. Enage
69             ::boost::is_base_of<
70                 ::boost::parameter::aux::template_keyword_base
71               , typename ::boost::remove_const<
72                     typename ::boost::remove_reference<T>::type
73                 >::type
74             >
75           , ::boost::mpl::true_
76           , ::boost::mpl::false_
77 #else
78             ::boost::is_lvalue_reference<T>
79           , ::boost::mpl::false_
80           , ::boost::parameter::aux::is_template_keyword_aux<T>
81 #endif  // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
82         >::type
83     {
84     };
85 }}} // namespace boost::parameter::aux
86
87 #endif  // BOOST_PARAMETER_CAN_USE_MP11
88 #endif  // include guard
89