]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/type_traits/include/boost/type_traits/detail/common_type_impl.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / type_traits / include / boost / type_traits / detail / common_type_impl.hpp
1 #ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMPL_HPP_INCLUDED
2 #define BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMPL_HPP_INCLUDED
3
4 //
5 // Copyright 2015 Peter Dimov
6 //
7 // Distributed under the Boost Software License, Version 1.0.
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
10 //
11
12 #include <boost/type_traits/detail/common_arithmetic_type.hpp>
13 #include <boost/type_traits/detail/composite_pointer_type.hpp>
14 #include <boost/type_traits/detail/composite_member_pointer_type.hpp>
15 #include <boost/type_traits/type_identity.hpp>
16 #include <boost/type_traits/is_class.hpp>
17 #include <boost/type_traits/is_union.hpp>
18 #include <boost/type_traits/is_convertible.hpp>
19 #include <boost/type_traits/is_pointer.hpp>
20 #include <boost/type_traits/is_member_pointer.hpp>
21 #include <boost/type_traits/conditional.hpp>
22
23 namespace boost
24 {
25
26 namespace type_traits_detail
27 {
28
29 // the arguments to common_type_impl have already been passed through decay<>
30
31 template<class T, class U> struct common_type_impl;
32
33 // same type
34
35 template<class T> struct common_type_impl<T, T>
36 {
37 typedef T type;
38 };
39
40 // one of the operands is a class type, try conversions in both directions
41
42 template<class T, class U> struct ct_class
43 {
44 BOOST_STATIC_CONSTANT( bool, ct = boost::is_class<T>::value || boost::is_union<T>::value );
45 BOOST_STATIC_CONSTANT( bool, cu = boost::is_class<U>::value || boost::is_union<U>::value );
46
47 BOOST_STATIC_CONSTANT( bool, value = ct || cu );
48 };
49
50 template<class T, class U> struct common_type_impl3;
51
52 template<class T, class U> struct common_type_class: public boost::conditional<
53
54 boost::is_convertible<T, U>::value && !boost::is_convertible<U, T>::value,
55 boost::type_identity<U>,
56
57 typename boost::conditional<
58
59 boost::is_convertible<U, T>::value && !boost::is_convertible<T, U>::value,
60 boost::type_identity<T>,
61
62 common_type_impl3<T, U>
63 >::type
64 >::type
65 {
66 };
67
68 template<class T, class U> struct common_type_impl: public boost::conditional<
69 ct_class<T, U>::value,
70 common_type_class<T, U>,
71 common_type_impl3<T, U> >::type
72 {
73 };
74
75 // pointers
76
77 template<class T, class U> struct common_type_impl4;
78
79 template<class T, class U> struct common_type_impl3: public boost::conditional<
80 boost::is_pointer<T>::value || boost::is_pointer<U>::value,
81 composite_pointer_type<T, U>,
82 common_type_impl4<T, U> >::type
83 {
84 };
85
86 // pointers to members
87
88 template<class T, class U> struct common_type_impl5;
89
90 template<class T, class U> struct common_type_impl4: public boost::conditional<
91 boost::is_member_pointer<T>::value || boost::is_member_pointer<U>::value,
92 composite_member_pointer_type<T, U>,
93 common_type_impl5<T, U> >::type
94 {
95 };
96
97 // arithmetic types (including class types w/ conversions to arithmetic and enums)
98
99 template<class T, class U> struct common_type_impl5: public common_arithmetic_type<T, U>
100 {
101 };
102
103 } // namespace type_traits_detail
104
105 } // namespace boost
106
107 #endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMPL_HPP_INCLUDED