proxsuite 0.7.2
The Advanced Proximal Optimization Toolbox
 
Loading...
Searching...
No Matches
core.hpp
Go to the documentation of this file.
1#ifndef VEG_CORE_HPP_GJCBNFLAS
2#define VEG_CORE_HPP_GJCBNFLAS
3
7
8#if defined(VEG_WITH_CXX20_SUPPORT) && \
9 !VEG_HAS_BUILTIN(__builtin_is_constant_evaluated)
10#include <type_traits>
11#define VEG_HAS_CONSTEVAL 1
12#define VEG_IS_CONSTEVAL() ::std::is_constant_evaluated()
13#elif VEG_HAS_BUILTIN(__builtin_is_constant_evaluated)
14#define VEG_HAS_CONSTEVAL 1
15#define VEG_IS_CONSTEVAL() __builtin_is_constant_evaluated()
16#else
17#define VEG_HAS_CONSTEVAL 0
18#endif
19
20namespace proxsuite {
21namespace linalg {
22namespace veg {
23namespace meta {
24namespace nb {
26{
27 constexpr auto operator()() const noexcept -> bool
28 {
29#if VEG_HAS_CONSTEVAL
30 return VEG_IS_CONSTEVAL();
31#else
32 return true;
33#endif
34 }
35};
36} // namespace nb
37VEG_NIEBLOID(is_consteval);
38} // namespace meta
39
40namespace _detail {
41namespace _meta {
42template<bool B>
44template<>
45struct conditional_<true>
46{
47 template<typename T, typename F>
48 using type = T;
49};
50template<>
51struct conditional_<false>
52{
53 template<typename T, typename F>
54 using type = F;
55};
56struct none
57{};
58} // namespace _meta
59} // namespace _detail
60
61namespace meta {
62
63template<template<typename...> class F, typename... Ts>
65{
66 using type = F<Ts...>;
67};
68template<template<typename...> class F>
70{
71 template<typename... Ts>
72 using type = F<Ts...>;
73};
74template<typename T>
76{
77 using type = T;
78};
79template<typename T>
81
82template<bool B, typename T, typename F>
84
85template<typename...>
86using void_t = void;
87
88template<typename... Preds>
90template<typename... Preds>
92
93template<>
95{};
96template<>
98{};
99
100template<typename First, typename... Preds>
101struct disjunction<First, Preds...>
102 : if_t<First::value, First, disjunction<Preds...>>
103{};
104
105template<typename First, typename... Preds>
106struct conjunction<First, Preds...>
107 : if_t<First::value, conjunction<Preds...>, First>
108{};
109} // namespace meta
110
111namespace _detail {
112namespace _meta {
113
114template<typename T>
117template<typename Ret, typename... Args>
118struct decay_helper<Ret(Args...)> : meta::type_identity<Ret (*)(Args...)>
119{};
120#if defined(VEG_WITH_CXX17_SUPPORT)
121template<typename Ret, typename... Args>
122struct decay_helper<Ret(Args...) noexcept>
123 : meta::type_identity<Ret (*)(Args...) noexcept>
124{};
125#endif
126template<typename T, usize N>
128{};
129
130using namespace meta;
131
132#if defined(VEG_WITH_CXX14_SUPPORT)
133
134template<typename Enable, template<typename...> class Ftor, typename... Args>
135constexpr bool _is_detected_v = false;
136template<template<typename...> class Ftor, typename... Args>
137constexpr bool _is_detected_v<meta::void_t<Ftor<Args...>>, Ftor, Args...> =
138 true;
139
140template<template<typename...> class Op, typename... Args>
141constexpr bool is_detected_v = _is_detected_v<void, Op, Args...>;
142
143#else
144
145template<typename Enable, template<typename...> class Ftor, typename... Args>
147{
149};
150template<template<typename...> class Ftor, typename... Args>
151struct _detector<meta::void_t<Ftor<Args...>>, Ftor, Args...>
152{
154};
155
156template<typename Default, template<typename...> class Ftor, typename... Args>
157struct detector : _detector<void, Ftor, Args...>
158{};
159
160template<template<typename...> class Op, typename... Args>
161using is_detected = typename detector<_meta::none, Op, Args...>::value_type;
162
163#endif
164
165template<typename T>
167 : false_type
168 , type_identity<T>
169{};
170template<typename T>
171struct is_pointer<T*>
172 : true_type
174{};
175
176template<typename Base>
178{
179 using wrapper_base::test;
180 static auto test(Base const volatile*) -> true_type;
181};
182
183template<typename Base, typename Derived>
185 decltype(baseof_wrapper<Base>::test(static_cast<Derived>(nullptr)));
186
187template<typename T>
190template<typename T>
192{};
193template<typename T>
196template<typename T>
198{};
199
200template<typename T>
202{};
203template<typename T>
204struct is_const<T const> : true_type
205{};
206
207template<typename T, typename = true_type>
209{};
210template<typename T>
211struct is_complete<T, bool_constant<sizeof(T) == sizeof(T)> /* NOLINT */>
212 : true_type
213{};
214
215} // namespace _meta
216} // namespace _detail
217
218namespace concepts {
221
222#if defined(VEG_WITH_CXX20_SUPPORT)
223VEG_DEF_CONCEPT((template<typename...> class Op, typename... Args),
224 detected,
225 requires { typename Op<Args...>; });
226#elif defined(VEG_WITH_CXX14_SUPPORT)
227VEG_DEF_CONCEPT((template<typename...> class Op, typename... Args),
228 detected,
229 _detail::_meta::is_detected_v<Op, Args...>);
230#else
231VEG_DEF_CONCEPT((template<typename...> class Op, typename... Args),
232 detected,
234#endif
235
236VEG_DEF_CONCEPT_BUILTIN_OR_INTERNAL((typename T, typename U), base_of, T, U);
237
239 const_type,
240 VEG_HAS_BUILTIN_OR(__is_const,
241 __is_const(T),
244 void_type,
245 VEG_CONCEPT(same<void const volatile, T const volatile>));
246
247// can't use __is_pointer because of <bits/cpp_type_traits.h> header
249
250VEG_DEF_CONCEPT_BUILTIN_OR_INTERNAL(typename T, lvalue_reference, T);
251VEG_DEF_CONCEPT_BUILTIN_OR_INTERNAL(typename T, rvalue_reference, T);
253 reference,
254 (VEG_CONCEPT(lvalue_reference<T>) ||
255 VEG_CONCEPT(rvalue_reference<T>)));
256
257#if VEG_HAS_BUILTIN(__is_complete_type)
258VEG_DEF_CONCEPT(typename T, complete, __is_complete_type(T));
259#else
261#endif
262
263} // namespace concepts
264
265namespace meta {
266
267template<typename T>
269template<typename T>
271
272template<typename Default, template<typename...> class Op, typename... Args>
273using detected_or_t = typename meta::if_t<VEG_CONCEPT(detected<Op, Args...>),
274 meta::meta_apply<Op, Args...>,
276
277template<template<typename...> class Op, typename... Args>
279
280#ifdef __clang__
281template<template<typename...> class Op, typename... Args>
282using detected_return_t = Op<Args...>;
283#else
284template<template<typename...> class Op, typename... Args>
286#endif
287
288template<typename T>
290} // namespace meta
291template<typename T>
293} // namespace veg
294} // namespace linalg
295} // namespace proxsuite
296
298#endif /* end of include guard VEG_CORE_HPP_GJCBNFLAS */
#define VEG_DEF_CONCEPT_BUILTIN_OR_INTERNAL(Tpl, Name,...)
Definition macros.hpp:786
#define VEG_CONCEPT(...)
Definition macros.hpp:1241
#define VEG_NIEBLOID(Name)
Definition macros.hpp:545
#define VEG_DEF_CONCEPT(Tpl, Name,...)
Definition macros.hpp:321
decltype(baseof_wrapper< Base >::test(static_cast< Derived >(nullptr))) is_base_of
Definition core.hpp:184
typename detector< _meta::none, Op, Args... >::value_type is_detected
Definition core.hpp:161
detected_or_t< _detail::_meta::none, Op, Args... > detected_return_t
Definition core.hpp:285
detected_or_t< _detail::_meta::none, Op, Args... > detected_t
Definition core.hpp:278
typename meta::if_t< VEG_CONCEPT(detected< Op, Args... >), meta::meta_apply< Op, Args... >, meta::type_identity< Default > >::type detected_or_t
Definition core.hpp:273
typename _detail::_meta::is_pointer< T >::type unptr_t
Definition core.hpp:270
typename type_identity< T >::type type_identity_t
Definition core.hpp:80
typename _detail::_meta::unref< T & >::type unref_t
Definition core.hpp:268
typename _detail::_meta::conditional_< B >::template type< T, F > if_t
Definition core.hpp:83
typename _detail::_meta::decay_helper< uncvref_t< T > >::type decay_t
Definition core.hpp:289
constant< bool, B > bool_constant
Definition macros.hpp:900
bool_constant< false > false_type
Definition macros.hpp:903
bool_constant< true > true_type
Definition macros.hpp:902
meta::type_identity_t< T > DoNotDeduce
Definition core.hpp:292
#define VEG_HAS_BUILTIN_OR(Builtin, True, False)
Definition prologue.hpp:38
static auto test(Base const volatile *) -> true_type
static auto test(...) -> meta::false_type
constexpr auto operator()() const noexcept -> bool
Definition core.hpp:27