Lely core libraries  2.2.5
invoker.hpp
Go to the documentation of this file.
1 
22 #ifndef LELY_UTIL_INVOKER_HPP_
23 #define LELY_UTIL_INVOKER_HPP_
24 
25 #include <lely/libc/functional.hpp>
26 #include <lely/libc/utility.hpp>
27 
28 #include <tuple>
29 #include <utility>
30 
31 namespace lely {
32 namespace util {
33 
34 namespace detail {
35 
36 template <class Tuple>
37 class invoker {
38  Tuple tuple_;
39 
40  template <::std::size_t... I>
41  auto
42  invoke_(compat::index_sequence<I...>) noexcept(
43  noexcept(compat::invoke(::std::get<I>(::std::move(tuple_))...)))
44  -> decltype(compat::invoke(::std::get<I>(::std::move(tuple_))...)) {
45  return compat::invoke(::std::get<I>(::std::move(tuple_))...);
46  }
47 
48  using sequence_ =
50 
51  public:
52  template <class F, class... Args,
53  class = typename ::std::enable_if<!::std::is_same<
54  typename ::std::decay<F>::type, invoker>::value>::type>
55  explicit invoker(F&& f, Args&&... args)
56  : tuple_{::std::forward<F>(f), ::std::forward<Args>(args)...} {}
57 
58  auto
59  operator()() noexcept(
60  noexcept(::std::declval<invoker&>().invoke_(sequence_{})))
61  -> decltype(::std::declval<invoker&>().invoke_(sequence_{})) {
62  return invoke_(sequence_{});
63  }
64 };
65 
66 } // namespace detail
67 
72 template <class F, class... Args>
73 using invoker_t =
75  typename ::std::decay<Args>::type...>>;
76 
81 template <class F, class... Args>
82 inline invoker_t<F, Args...>
83 make_invoker(F&& f, Args&&... args) {
84  return invoker_t<F, Args...>{::std::forward<F>(f),
85  ::std::forward<Args>(args)...};
86 }
87 
88 } // namespace util
89 } // namespace lely
90 
91 #endif // !LELY_UTIL_INVOKER_HPP_
A compile-time sequence of integers.
Definition: utility.hpp:44
invoker_t< F, Args... > make_invoker(F &&f, Args &&... args)
Creates a function object containing a Callable and its arguments.
Definition: invoker.hpp:83
make_integer_sequence<::std::size_t, N > make_index_sequence
A helper alias template for make_integer_sequence for the common case where T is std::size_t.
Definition: utility.hpp:113
This header file is part of the compatibility library; it includes <utility> and defines any missing ...
Definition: buf.hpp:32
This header file is part of the compatibility library; it includes <functional> and defines any missi...