libzypp 17.37.17
type_traits.h
Go to the documentation of this file.
1#ifndef ZYPPNG_META_TYPE_TRAITS_INCLUDED
2#define ZYPPNG_META_TYPE_TRAITS_INCLUDED
3
4#include <type_traits>
5#include <memory>
6
7#if !defined ( __cpp_lib_void_t )
8
9namespace std {
10 //define void_t since it is only available starting with C++17 in some compilers
11 template<typename... Ts> struct make_void { typedef void type;};
12 template<typename... Ts> using void_t = typename make_void<Ts...>::type;
13}
14
15#endif
16
17namespace std {
18
19
20//implementation of the detector idiom, used to help with SFINAE
21//from https://en.cppreference.com/w/cpp/experimental/is_detected
22
23namespace detail {
24template <class Default, class AlwaysVoid,
25 template<class...> class Op, class... Args>
26struct detector {
27 using value_t = std::false_type;
28 using type = Default;
29};
30
31template <class Default, template<class...> class Op, class... Args>
32struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> {
33 using value_t = std::true_type;
34 using type = Op<Args...>;
35};
36
37struct nonesuch{
38 ~nonesuch( ) = delete;
39 nonesuch( nonesuch const& ) = delete;
40 void operator = ( nonesuch const& ) = delete;
41};
42
43} // namespace detail
44
45template <bool B> using bool_constant = integral_constant<bool, B>;
46
47template <template<class...> class Op, class... Args>
48using is_detected = typename detail::detector<detail::nonesuch, void, Op, Args...>::value_t;
49
50template <template<class...> class Op, class... Args>
51using detected_t = typename detail::detector<detail::nonesuch, void, Op, Args...>::type;
52
53template <class Default, template<class...> class Op, class... Args>
54using detected_or = detail::detector<Default, void, Op, Args...>;
55
56template< template<class...> class Op, class... Args >
57constexpr bool is_detected_v = is_detected<Op, Args...>::value;
58
59template< class Default, template<class...> class Op, class... Args >
60using detected_or_t = typename detected_or<Default, Op, Args...>::type;
61
62template <class Expected, template<class...> class Op, class... Args>
63using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
64
65template <class Expected, template<class...> class Op, class... Args>
66constexpr bool is_detected_exact_v = is_detected_exact<Expected, Op, Args...>::value;
67
68template <class To, template<class...> class Op, class... Args>
69using is_detected_convertible = std::is_convertible<detected_t<Op, Args...>, To>;
70
71template <class To, template<class...> class Op, class... Args>
72constexpr bool is_detected_convertible_v = is_detected_convertible<To, Op, Args...>::value_t::value;
73
74
75#if __cplusplus < 202002L
76
77template< class T >
79 using type = std::remove_cv_t<std::remove_reference_t<T>>;
80};
81
82template< class T >
84
85#endif
86
87#if __cplusplus < 201703L
88
89//https://en.cppreference.com/w/cpp/types/conjunction)
90template<class...> struct conjunction : std::true_type { };
91template<class B1> struct conjunction<B1> : B1 { };
92template<class B1, class... Bn>
93struct conjunction<B1, Bn...>
94 : std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
95
96//https://en.cppreference.com/w/cpp/types/disjunction
97template<class...> struct disjunction : std::false_type { };
98template<class B1> struct disjunction<B1> : B1 { };
99template<class B1, class... Bn>
100struct disjunction<B1, Bn...>
101 : std::conditional_t<bool(B1::value), B1, disjunction<Bn...>> { };
102
103//https://en.cppreference.com/w/cpp/types/negation
104template<class B>
105struct negation : std::bool_constant< !bool(B::value)> { };
106
107#endif
108}
109
110
111namespace zyppng {
112 //check wether something is a instance of a template type
113 template < template< class ... > class Templ, class Type >
114 struct is_instance_of : std::false_type{};
115
116 template < template< typename ... > class Templ, typename... Args >
117 struct is_instance_of<Templ, Templ<Args...>> : std::true_type{};
118
119 template < template< class ... > class Templ, class Type >
121
122 //Provides the member typedef type which is the type pointed to by T, or, if T is not a pointer, then type is the same as T.
123 template< typename T>
124 struct remove_smart_ptr{ using type = std::remove_cv_t<T>; };
125
126 template< typename T>
127 struct remove_smart_ptr<std::shared_ptr<T>>{ using type = std::remove_cv_t<T>; };
128
129 template< typename T>
130 struct remove_smart_ptr<std::unique_ptr<T>>{ using type = std::remove_cv_t<T>; };
131
132 template< typename T>
134
135 //helper template to print type parameters
136 template <typename ...T>
138}
139
140#endif
Definition Arch.h:364
detail::detector< Default, void, Op, Args... > detected_or
Definition type_traits.h:54
typename detail::detector< detail::nonesuch, void, Op, Args... >::value_t is_detected
Definition type_traits.h:48
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
Definition type_traits.h:63
typename detail::detector< detail::nonesuch, void, Op, Args... >::type detected_t
Definition type_traits.h:51
constexpr bool is_detected_exact_v
Definition type_traits.h:66
std::is_convertible< detected_t< Op, Args... >, To > is_detected_convertible
Definition type_traits.h:69
constexpr bool is_detected_convertible_v
Definition type_traits.h:72
integral_constant< bool, B > bool_constant
Definition type_traits.h:45
typename make_void< Ts... >::type void_t
Definition type_traits.h:12
typename conditional< B, T, F >::type conditional_t
Definition TypeTraits.h:39
constexpr bool is_detected_v
Definition type_traits.h:57
typename remove_cvref< T >::type remove_cvref_t
Definition type_traits.h:83
typename detected_or< Default, Op, Args... >::type detected_or_t
Definition type_traits.h:60
constexpr bool is_instance_of_v
typename remove_smart_ptr< T >::type remove_smart_ptr_t
std::false_type value_t
Definition type_traits.h:27
nonesuch(nonesuch const &)=delete
void operator=(nonesuch const &)=delete
std::remove_cv_t< std::remove_reference_t< T > > type
Definition type_traits.h:79
std::remove_cv_t< T > type