]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/type_traits/include/boost/type_traits/detail/composite_member_pointer_type.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / type_traits / include / boost / type_traits / detail / composite_member_pointer_type.hpp
CommitLineData
7c673cae
FG
1#ifndef BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_MEMBER_POINTER_TYPE_HPP_INCLUDED
2#define BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_MEMBER_POINTER_TYPE_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/composite_pointer_type.hpp>
13#include <boost/type_traits/remove_pointer.hpp>
14#include <boost/type_traits/is_base_of.hpp>
15#include <boost/type_traits/conditional.hpp>
16#include <boost/config.hpp>
17#include <cstddef>
18
19namespace boost
20{
21
22namespace type_traits_detail
23{
24
25template<class T, class U> struct composite_member_pointer_type;
26
27// nullptr_t
28
29#if !defined( BOOST_NO_CXX11_NULLPTR )
30
31#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
32
33template<class C, class T> struct composite_member_pointer_type<T C::*, decltype(nullptr)>
34{
35 typedef T C::* type;
36};
37
38template<class C, class T> struct composite_member_pointer_type<decltype(nullptr), T C::*>
39{
40 typedef T C::* type;
41};
42
43template<> struct composite_member_pointer_type<decltype(nullptr), decltype(nullptr)>
44{
45 typedef decltype(nullptr) type;
46};
47
48#else
49
50template<class C, class T> struct composite_member_pointer_type<T C::*, std::nullptr_t>
51{
52 typedef T C::* type;
53};
54
55template<class C, class T> struct composite_member_pointer_type<std::nullptr_t, T C::*>
56{
57 typedef T C::* type;
58};
59
60template<> struct composite_member_pointer_type<std::nullptr_t, std::nullptr_t>
61{
62 typedef std::nullptr_t type;
63};
64
65#endif
66
67#endif // !defined( BOOST_NO_CXX11_NULLPTR )
68
69template<class C1, class C2> struct common_member_class;
70
71template<class C> struct common_member_class<C, C>
72{
73 typedef C type;
74};
75
76template<class C1, class C2> struct common_member_class
77{
78 typedef typename boost::conditional<
79
80 boost::is_base_of<C1, C2>::value,
81 C2,
82 typename boost::conditional<boost::is_base_of<C2, C1>::value, C1, void>::type
83
84 >::type type;
85};
86
87//This indirection avoids compilation errors on some older
88//compilers like MSVC 7.1
89template<class CT, class CB>
90struct common_member_class_pointer_to_member
91{
92 typedef CT CB::* type;
93};
94
95template<class C1, class T1, class C2, class T2> struct composite_member_pointer_type<T1 C1::*, T2 C2::*>
96{
97private:
98
99 typedef typename composite_pointer_type<T1*, T2*>::type CPT;
100 typedef typename boost::remove_pointer<CPT>::type CT;
101
102 typedef typename common_member_class<C1, C2>::type CB;
103
104public:
105
106 typedef typename common_member_class_pointer_to_member<CT, CB>::type type;
107};
108
109} // namespace type_traits_detail
110
111} // namespace boost
112
113#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_MEMBER_POINTER_TYPE_HPP_INCLUDED