invoke.hpp
Go to the documentation of this file.
1 /*******************************************************************************
2  * This file is part of the "https://github.com/blackmatov/invoke.hpp"
3  * For conditions of distribution and use, see copyright notice in LICENSE.md
4  * Copyright (C) 2018-2020, by Matvey Cherevko (blackmatov@gmail.com)
5  ******************************************************************************/
6 
7 #pragma once
8 
9 #include <tuple>
10 #include <utility>
11 #include <functional>
12 #include <type_traits>
13 
14 #define INVOKE_HPP_NOEXCEPT_DECLTYPE_RETURN(...) \
15  noexcept(noexcept(__VA_ARGS__)) -> decltype (__VA_ARGS__) { return __VA_ARGS__; }
16 
17 //
18 // void_t
19 //
20 
21 namespace invoke_hpp
22 {
23  namespace impl
24  {
25  template < typename... Args >
26  struct make_void {
27  using type = void;
28  };
29  }
30 
31  template < typename... Args >
32  using void_t = typename impl::make_void<Args...>::type;
33 }
34 
35 //
36 // integer_sequence
37 //
38 
39 namespace invoke_hpp
40 {
41  template < typename T, T... Ints >
43  using value_type = T;
44  static constexpr std::size_t size() noexcept { return sizeof...(Ints); }
45  };
46 
47  template < std::size_t... Ints >
48  using index_sequence = integer_sequence<std::size_t, Ints...>;
49 
50  namespace impl
51  {
52  template < typename T, std::size_t N, T... Ints >
54  : make_integer_sequence_impl<T, N - 1, N - 1, Ints...> {};
55 
56  template < typename T, T... Ints >
57  struct make_integer_sequence_impl<T, 0, Ints...>
58  : integer_sequence<T, Ints...> {};
59  }
60 
61  template < typename T, std::size_t N >
63 
64  template < std::size_t N >
66 
67  template < typename... Ts >
68  using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
69 }
70 
71 //
72 // is_reference_wrapper
73 //
74 
75 namespace invoke_hpp
76 {
77  namespace impl
78  {
79  template < typename T >
81  : std::false_type {};
82 
83  template < typename U >
84  struct is_reference_wrapper_impl<std::reference_wrapper<U>>
85  : std::true_type {};
86  }
87 
88  template < typename T >
90  : impl::is_reference_wrapper_impl<typename std::remove_cv<T>::type> {};
91 }
92 
93 //
94 // invoke
95 //
96 
97 namespace invoke_hpp
98 {
99  namespace impl
100  {
101  //
102  // invoke_member_object_impl
103  //
104 
105  template
106  <
107  typename Base, typename F, typename Derived,
109  >
110  constexpr auto invoke_member_object_impl(F Base::* f, Derived&& ref)
112  std::forward<Derived>(ref).*f)
113 
114  template
115  <
116  typename Base, typename F, typename RefWrap,
118  >
119  constexpr auto invoke_member_object_impl(F Base::* f, RefWrap&& ref)
121  ref.get().*f)
122 
123  template
124  <
125  typename Base, typename F, typename Pointer,
126  typename std::enable_if<
129  , int>::type = 0
130  >
131  constexpr auto invoke_member_object_impl(F Base::* f, Pointer&& ptr)
133  (*std::forward<Pointer>(ptr)).*f)
134 
135  //
136  // invoke_member_function_impl
137  //
138 
139  template
140  <
141  typename Base, typename F, typename Derived, typename... Args,
143  >
144  constexpr auto invoke_member_function_impl(F Base::* f, Derived&& ref, Args&&... args)
146  (std::forward<Derived>(ref).*f)(std::forward<Args>(args)...))
147 
148  template
149  <
150  typename Base, typename F, typename RefWrap, typename... Args,
152  >
153  constexpr auto invoke_member_function_impl(F Base::* f, RefWrap&& ref, Args&&... args)
155  (ref.get().*f)(std::forward<Args>(args)...))
156 
157  template
158  <
159  typename Base, typename F, typename Pointer, typename... Args,
160  typename std::enable_if<
163  , int>::type = 0
164  >
165  constexpr auto invoke_member_function_impl(F Base::* f, Pointer&& ptr, Args&&... args)
167  ((*std::forward<Pointer>(ptr)).*f)(std::forward<Args>(args)...))
168  }
169 
170  template
171  <
172  typename F, typename... Args,
174  >
175  constexpr auto invoke(F&& f, Args&&... args)
177  std::forward<F>(f)(std::forward<Args>(args)...))
178 
179  template
180  <
181  typename F, typename T,
183  >
184  constexpr auto invoke(F&& f, T&& t)
186  impl::invoke_member_object_impl(std::forward<F>(f), std::forward<T>(t)))
187 
188  template
189  <
190  typename F, typename... Args,
192  >
193  constexpr auto invoke(F&& f, Args&&... args)
195  impl::invoke_member_function_impl(std::forward<F>(f), std::forward<Args>(args)...))
196 }
197 
198 //
199 // invoke_result
200 //
201 
202 namespace invoke_hpp
203 {
204  namespace impl
205  {
207 
208  template < typename Void, typename F, typename... Args >
210 
211  template < typename F, typename... Args >
212  struct invoke_result_impl<void_t<invoke_result_impl_tag, decltype(invoke_hpp::invoke(std::declval<F>(), std::declval<Args>()...))>, F, Args...> {
213  using type = decltype(invoke_hpp::invoke(std::declval<F>(), std::declval<Args>()...));
214  };
215  }
216 
217  template < typename F, typename... Args >
219  : impl::invoke_result_impl<void, F, Args...> {};
220 
221  template < typename F, typename... Args >
222  using invoke_result_t = typename invoke_result<F, Args...>::type;
223 }
224 
225 //
226 // is_invocable
227 //
228 
229 namespace invoke_hpp
230 {
231  namespace impl
232  {
234 
235  template < typename Void, typename R, typename F, typename... Args >
237  : std::false_type {};
238 
239  template < typename R, typename F, typename... Args >
241  : std::conditional<
242  std::is_void<R>::value,
243  std::true_type,
244  std::is_convertible<invoke_result_t<F, Args...>, R>>::type {};
245  }
246 
247  template < typename R, typename F, typename... Args >
249  : impl::is_invocable_r_impl<void, R, F, Args...> {};
250 
251  template < typename F, typename... Args >
252  using is_invocable = is_invocable_r<void, F, Args...>;
253 }
254 
255 //
256 // apply
257 //
258 
259 namespace invoke_hpp
260 {
261  namespace impl
262  {
263  template < typename F, typename Tuple, std::size_t... I >
264  constexpr auto apply_impl(F&& f, Tuple&& args, index_sequence<I...>)
267  std::forward<F>(f),
268  std::get<I>(std::forward<Tuple>(args))...))
269  }
270 
271  template < typename F, typename Tuple >
272  constexpr auto apply(F&& f, Tuple&& args)
274  impl::apply_impl(
275  std::forward<F>(f),
276  std::forward<Tuple>(args),
277  make_index_sequence<std::tuple_size<typename std::decay<Tuple>::type>::value>()))
278 }
279 
280 #undef INVOKE_HPP_NOEXCEPT_DECLTYPE_RETURN
invoke_hpp::invoke_result_t
typename invoke_result< F, Args... >::type invoke_result_t
Definition: invoke.hpp:222
invoke_hpp::is_invocable_r
Definition: invoke.hpp:248
invoke_hpp::integer_sequence
Definition: invoke.hpp:42
invoke_hpp::integer_sequence::size
static constexpr std::size_t size() noexcept
Definition: invoke.hpp:44
invoke_hpp::impl::make_integer_sequence_impl
Definition: invoke.hpp:53
invoke_hpp::void_t
typename impl::make_void< Args... >::type void_t
Definition: invoke.hpp:32
invoke_hpp::impl::invoke_result_impl< void_t< invoke_result_impl_tag, decltype(invoke_hpp::invoke(std::declval< F >(), std::declval< Args >()...))>, F, Args... >::type
decltype(invoke_hpp::invoke(std::declval< F >(), std::declval< Args >()...)) type
Definition: invoke.hpp:213
invoke_hpp::impl::make_void
Definition: invoke.hpp:26
invoke_hpp::impl::is_invocable_r_impl_tag
Definition: invoke.hpp:233
INVOKE_HPP_NOEXCEPT_DECLTYPE_RETURN
#define INVOKE_HPP_NOEXCEPT_DECLTYPE_RETURN(...)
Definition: invoke.hpp:14
invoke_hpp::impl::is_reference_wrapper_impl
Definition: invoke.hpp:80
invoke_hpp::is_reference_wrapper
Definition: invoke.hpp:89
invoke_hpp::impl::is_invocable_r_impl
Definition: invoke.hpp:236
invoke_hpp::impl::make_void::type
void type
Definition: invoke.hpp:27
nanorpc::core::detail::pack::meta::type
type
Definition: pack_meta.h:26
invoke_hpp::invoke_result
Definition: invoke.hpp:218
invoke_hpp::impl::invoke_result_impl
Definition: invoke.hpp:209
invoke_hpp::make_index_sequence
make_integer_sequence< std::size_t, N > make_index_sequence
Definition: invoke.hpp:65
std
Definition: Node.hpp:366
invoke_hpp::impl::invoke_result_impl_tag
Definition: invoke.hpp:206
tl::detail::invoke
constexpr auto invoke(Fn &&f, Args &&... args) noexcept(noexcept(std::mem_fn(f)(std::forward< Args >(args)...))) -> decltype(std::mem_fn(f)(std::forward< Args >(args)...))
Definition: 3rdparty/tl/optional.hpp:178
invoke_hpp::integer_sequence< T, Ints... >::value_type
T value_type
Definition: invoke.hpp:43
invoke_hpp
Definition: invoke.hpp:21


depthai
Author(s): Martin Peterlin
autogenerated on Sat Mar 22 2025 02:58:19