17 #ifndef OPENKALMAN_COMPATIBILITY_COMMON_REFERENCE_HPP 18 #define OPENKALMAN_COMPATIBILITY_COMMON_REFERENCE_HPP 20 #if __cplusplus < 202002L 26 template<
typename From,
typename To>
27 using copy_cv = std::conditional_t<
28 std::is_const_v<From>,
29 std::conditional_t<std::is_volatile_v<From>,
const volatile To,
const To>,
30 std::conditional_t<std::is_volatile_v<From>,
volatile To, To>
33 template<
typename A,
typename B>
34 using cond_res = decltype(
false ? std::declval<A(&)()>()() : std::declval<B(&)()>()());
36 template<
typename A,
typename B>
37 using cond_res_cvref = cond_res<copy_cv<A, B>&, copy_cv<B, A>&>;
40 template<
typename,
typename,
typename =
void>
43 template<
typename A,
typename B>
46 template<
typename A,
typename B>
47 struct common_ref<A&, B&, std::void_t<cond_res_cvref<A, B>>> : std::enable_if<
48 std::is_reference_v<cond_res_cvref<A, B>>, cond_res_cvref<A, B>> {};
50 template<
typename A,
typename B>
51 using common_ref_C = std::remove_reference_t<common_ref_t<A&, B&>>&&;
53 template<
typename A,
typename B>
54 struct common_ref<A&&, B&&, std::enable_if_t<std::is_convertible_v<A&&, common_ref_C<A, B>> and std::is_convertible_v<B&&, common_ref_C<A, B>>>>
55 {
using type = common_ref_C<A, B>; };
57 template<
typename A,
typename B>
58 using common_ref_D = common_ref_t<const A&, B&>;
60 template<
typename A,
typename B>
61 struct common_ref<A&&, B&, std::enable_if_t<std::is_convertible_v<A&&, common_ref_D<A, B>>>>
62 {
using type = common_ref_D<A, B>; };
64 template<
typename A,
typename B>
68 template<
typename T1,
typename T2,
int b = 1,
typename =
void>
71 template<
typename T1,
typename T2>
72 struct common_reference_impl<T1&, T2&, 1, std::void_t<common_ref_t<T1&, T2&>>> {
using type = common_ref_t<T1&, T2&>; };
74 template<
typename T1,
typename T2>
75 struct common_reference_impl<T1&&, T2&&, 1, std::void_t<common_ref_t<T1&&, T2&&>>> {
using type = common_ref_t<T1&&, T2&&>; };
77 template<
typename T1,
typename T2>
78 struct common_reference_impl<T1&, T2&&, 1, std::void_t<common_ref_t<T1&, T2&&>>> {
using type = common_ref_t<T1&, T2&&>; };
80 template<
typename T1,
typename T2>
81 struct common_reference_impl<T1&&, T2&, 1, std::void_t<common_ref_t<T1&&, T2&>>> {
using type = common_ref_t<T1&&, T2&>; };
83 template<
typename T1,
typename T2>
86 template<
typename T1,
typename T2>
89 template<
typename T1,
typename T2>
95 template<
typename...T>
104 template<
typename T1,
typename T2,
typename...Ts>
108 template<
typename...T>
115 #endif //OPENKALMAN_COMPATIBILITY_COMMON_REFERENCE_HPP Definition: common_reference.hpp:96
Definition: tuple_reverse.hpp:103
Definition: common_reference.hpp:69
The root namespace for OpenKalman.
Definition: basics.hpp:34
Definition: common_reference.hpp:41