VCCC  2024.05
VisualCamp Common C++ library
simple_common_reference.hpp
Go to the documentation of this file.
1 //
2 // Created by cosge on 2023-12-03.
3 //
4 
5 #ifndef VCCC_TYPE_TRAITS_SIMPLE_COMMON_REFERENCE_HPP_
6 #define VCCC_TYPE_TRAITS_SIMPLE_COMMON_REFERENCE_HPP_
7 
8 #include <type_traits>
9 
14 
15 namespace vccc {
16 namespace impl {
17 
19 
20 
21 // simple_common_reference_lref
22 
23 template<
24  typename CV12XR,
25  typename CV12YR,
28 
29 template<typename T1, typename T2>
30 struct simple_common_reference_lref<T1, T2, true>
31  : std::conditional_t<
32  std::is_reference< detail::test_ternary_t<T1, T2> >::value,
33  type_identity<detail::test_ternary_t<T1, T2>>,
34  no_simple_common_reference
35  > {};
36 
37 template<typename T1, typename T2>
38 struct simple_common_reference_lref<T1, T2, false> {};
39 
40 
41 // simple_common_reference_rref
42 
43 template<typename T1, typename T2, typename C>
45  : std::conditional_t<
46  conjunction< std::is_convertible<T1, C>, std::is_convertible<T2, C> >::value,
47  type_identity<C>,
48  no_simple_common_reference> {};
49 
50 template<
51  typename T1,
52  typename T2,
53  typename CWrap,
56 
57 template<typename T1, typename T2, typename CWrap>
58 struct simple_common_reference_rref<T1, T2, CWrap, true>
60  T1,
61  T2,
62  std::add_rvalue_reference_t< std::remove_reference_t<typename CWrap::type> >
63  > {};
64 
65 template<typename T1, typename T2, typename CWrap>
66 struct simple_common_reference_rref<T1, T2, CWrap, false> {};
67 
68 
69 // simple_common_reference_mixed_ref
70 
71 template<
72  typename B,
73  typename DWrap,
76 
77 template<typename B, typename DWrap>
78 struct simple_common_reference_mixed_ref<B, DWrap, true>
79  : std::conditional_t<
80  std::is_convertible< B, typename DWrap::type >::value,
81  type_identity<typename DWrap::type>,
82  no_simple_common_reference
83  >{};
84 
85 template<typename B, typename DWrap>
86 struct simple_common_reference_mixed_ref<B, DWrap, false> {};
87 
88 } // namespace impl
89 
92 
93 template<typename T1, typename T2>
94 struct simple_common_reference {}; // no simple common reference type
95 
96 template<typename T1, typename T2>
97 struct simple_common_reference<T1&, T2&>
99 
100 template<typename T1, typename T2>
101 struct simple_common_reference<T1&&, T2&&>
103 
104 template<typename A, typename B>
105 struct simple_common_reference<A&, B&&>
107 
108 template<typename B, typename A>
110 
112 
113 } // namespace vccc
114 
115 #endif // VCCC_TYPE_TRAITS_SIMPLE_COMMON_REFERENCE_HPP_
typename copy_cv< From, To >::type copy_cv_t
Definition: copy_cvref.hpp:63
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: has_typename_type.hpp:18
Definition: simple_common_reference.hpp:18
Definition: simple_common_reference.hpp:27
Definition: simple_common_reference.hpp:75
Definition: simple_common_reference.hpp:48
Definition: simple_common_reference.hpp:55
Definition: simple_common_reference.hpp:106
Definition: simple_common_reference.hpp:98
Definition: simple_common_reference.hpp:94