5 #ifndef VCCC_TYPE_TRAITS_COMMON_REFERENCE_HPP_
6 #define VCCC_TYPE_TRAITS_COMMON_REFERENCE_HPP_
30 struct no_common_reference {};
32 template<
typename T,
typename U,
33 template<
typename>
class TQual,
template<
typename>
class UQual,
34 bool = conjunction<tuple_like<T>, tuple_like<U>>
::value >
35 struct basic_common_reference_tuple_like : no_common_reference {};
53 template<
typename... T>
56 template<
typename T,
typename U,
template<
typename>
class TQual,
template<
typename>
class UQual>
70 template<
typename T1,
typename T2>
73 template<
typename T1,
typename T2>
76 basic_common_reference<
79 basic_common_reference_qual_gen<T1>::template qual,
80 basic_common_reference_qual_gen<T2>::template qual
86 template<
typename T1,
typename T2,
typename =
void>
89 template<
typename T1,
typename T2>
94 > : std::true_type {};
96 template<
typename T1,
typename T2,
typename =
void>
99 template<
typename T1,
typename T2>
102 template<
typename T1,
typename T2>
104 : std::conditional_t<
105 common_reference_tag_1<T1, T2>::value, std::integral_constant<int, 1>,
107 common_reference_tag_2<T1, T2>::value, std::integral_constant<int, 2>,
109 common_reference_tag_3<T1, T2>::value, std::integral_constant<int, 3>,
111 common_reference_tag_4<T1, T2>::value, std::integral_constant<int, 4>,
112 std::integral_constant<int, 0>
119 template<
typename T1,
typename T2>
122 template<
typename T1,
typename T2>
127 template<
typename T1,
typename T2>
136 template<
typename T1,
typename T2>
138 using type = decltype(
false ? common_reference_val<T1>() : common_reference_val<T2>() );
141 template<
typename T1,
typename T2>
143 using type = std::common_type_t<T1, T2>;
146 template<
bool ,
typename T1,
typename T2,
typename... R>
149 template<
typename T1,
typename T2,
typename... R>
162 template<
typename T1,
typename T2>
165 template<
typename T1,
typename T2,
typename... R>
168 has_typename_type<common_reference<T1, T2>>::value,
178 template<
typename TTuple,
typename UTuple,
template<
typename>
class TQual,
template<
typename>
class UQual,
typename Index>
179 struct basic_common_reference_tuple_like_impl_2;
182 typename TTuple,
typename UTuple,
183 template<
typename>
class TQual,
template<
typename>
class UQual,
186 struct basic_common_reference_tuple_like_impl_2<TTuple, UTuple, TQual, UQual,
std::index_sequence<I...>> {
187 using type = std::tuple<
189 TQual< std::tuple_element_t<I, TTuple> >,
190 UQual< std::tuple_element_t<I, UTuple> >
196 typename TTuple,
typename UTuple,
197 template<
typename>
class TQual,
template<
typename>
class UQual,
200 struct basic_common_reference_tuple_like_impl_1;
203 typename TTuple,
typename UTuple,
204 template<
typename>
class TQual,
template<
typename>
class UQual,
207 struct basic_common_reference_tuple_like_impl_1<TTuple, UTuple, TQual, UQual,
std::index_sequence<I...>>
208 : std::conditional_t<
210 has_typename_type< common_reference<TQual<std::tuple_element_t<I, TTuple>>,
211 UQual<std::tuple_element_t<I, UTuple>>> >...
213 basic_common_reference_tuple_like_impl_2<TTuple, UTuple, TQual, UQual, std::index_sequence<I...>>,
218 template<
typename TTuple,
typename UTuple,
template<
typename>
class TQual,
template<
typename>
class UQual>
219 struct basic_common_reference_tuple_like<TTuple, UTuple, TQual, UQual, true>
220 : std::conditional_t<
222 disjunction< is_specialization<TTuple, std::tuple>, is_specialization<UTuple, std::tuple> >,
223 std::is_same<TTuple, std::decay_t<TTuple>>,
224 std::is_same<UTuple, std::decay_t<UTuple>>,
225 bool_constant<(std::tuple_size<remove_cvref_t<TTuple>>::value == std::tuple_size<remove_cvref_t<UTuple>>::value)>
227 basic_common_reference_tuple_like_impl_1<TTuple, UTuple, TQual, UQual, std::make_index_sequence<std::tuple_size<remove_cvref_t<TTuple>>::value>>,
231 template<
typename T,
typename U,
232 template<
typename>
class TQual,
template<
typename>
class UQual,
234 struct basic_common_reference_pair {};
236 template<
typename T1,
typename T2,
typename U1,
typename U2,
237 template<
typename>
class TQual,
template<
typename>
class UQual>
238 struct basic_common_reference_pair<
std::pair<T1, T2>, std::pair<U1, U2>, TQual, UQual, true> {
239 using type = std::pair< common_reference_t<TQual<T1>, UQual<U1>>,
240 common_reference_t<TQual<T2>, UQual<U2>> >;
244 typename R,
typename T,
typename RQ,
typename TQ,
247 negation< is_specialization<T, std::reference_wrapper> >,
248 has_typename_type< common_reference<R&, TQ> >
251 struct basic_common_reference_ref_wrap {};
254 typename R,
typename T,
typename RQ,
typename TQ
256 struct basic_common_reference_ref_wrap<R, T, RQ, TQ, true>
257 : std::conditional_t<
258 convertible_to<RQ, common_reference_t<R&, TQ>>::value,
259 type_identity<common_reference_t<R&, TQ>>,
265 template<
typename T1,
typename T2,
typename U1,
typename U2,
266 template<
typename>
class TQual,
template<
typename>
class UQual>
268 : detail::basic_common_reference_pair<
269 std::pair<T1, T2>, std::pair<U1, U2>,
272 has_typename_type< common_reference< TQual<T1>, UQual<U1> > >,
273 has_typename_type< common_reference< TQual<T2>, UQual<U2> > >
277 template<
typename R,
typename T,
template<
typename>
class RQual,
template<
typename>
class TQual>
279 : detail::basic_common_reference_ref_wrap<R, T, RQual<R>, TQual<T>> {};
281 template<
typename R,
typename T,
template<
typename>
class RQual,
template<
typename>
class TQual>
283 : detail::basic_common_reference_ref_wrap<R, T, RQual<R>, TQual<T>> {};
typename copy_cvref< From, To >::type copy_cvref_t
Definition: copy_cvref.hpp:99
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: common_reference.hpp:57
T type
Definition: common_reference.hpp:159
Definition: common_reference.hpp:51
Definition: has_typename_type.hpp:18
Definition: common_reference.hpp:65
copy_cvref_t< T, U > qual
Definition: common_reference.hpp:67
Definition: common_reference.hpp:71
Definition: common_reference.hpp:82
Definition: common_reference.hpp:87
Definition: common_reference.hpp:97
Definition: common_reference.hpp:113
Definition: common_reference.hpp:147
typename simple_common_reference< T1, T2 >::type type
Definition: common_reference.hpp:124
typename basic_common_reference< remove_cvref_t< T1 >, remove_cvref_t< T2 >, basic_common_reference_qual_gen< T1 >::template qual, basic_common_reference_qual_gen< T2 >::template qual >::type type
Definition: common_reference.hpp:133
decltype(false ? common_reference_val< T1 >() :common_reference_val< T2 >()) type
Definition: common_reference.hpp:138
std::common_type_t< T1, T2 > type
Definition: common_reference.hpp:143
Definition: common_reference.hpp:117
Definition: simple_common_reference.hpp:94