The Gaudi Framework  v28r3 (cc1cf868)
invoke.h
Go to the documentation of this file.
1 #include <type_traits>
2 #include <utility>
3 #include <functional>
4 
5 namespace Gaudi {
6  namespace detail2 {
7 
8  // An implemention of std::invoke based on
9  // http://en.cppreference.com/w/cpp/utility/functional/invoke
10  template <class T>
12  template <class U>
13  struct is_reference_wrapper<std::reference_wrapper<U>> : std::true_type {};
14 
15  template <class Base, class T, class Derived, class... Args>
16  auto INVOKE(T Base::*pmf, Derived&& ref, Args&&... args)
17  noexcept(noexcept((std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...)))
18  -> std::enable_if_t<std::is_function<T>::value &&
19  std::is_base_of<Base, std::decay_t<Derived>>::value,
20  decltype((std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...))>
21  {
22  return (std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...);
23  }
24 
25  template <class Base, class T, class RefWrap, class... Args>
26  auto INVOKE(T Base::*pmf, RefWrap&& ref, Args&&... args)
27  noexcept(noexcept((ref.get().*pmf)(std::forward<Args>(args)...)))
28  -> std::enable_if_t<std::is_function<T>::value &&
29  is_reference_wrapper<std::decay_t<RefWrap>>::value,
30  decltype((ref.get().*pmf)(std::forward<Args>(args)...))>
31 
32  {
33  return (ref.get().*pmf)(std::forward<Args>(args)...);
34  }
35 
36  template <class Base, class T, class Pointer, class... Args>
37  auto INVOKE(T Base::*pmf, Pointer&& ptr, Args&&... args)
38  noexcept(noexcept(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...)))
39  -> std::enable_if_t<std::is_function<T>::value &&
40  !is_reference_wrapper<std::decay_t<Pointer>>::value &&
41  !std::is_base_of<Base, std::decay_t<Pointer>>::value,
42  decltype(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...))>
43  {
44  return ((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...);
45  }
46 
47  template <class Base, class T, class Derived>
48  auto INVOKE(T Base::*pmd, Derived&& ref)
49  noexcept(noexcept(std::forward<Derived>(ref).*pmd))
50  -> std::enable_if_t<!std::is_function<T>::value &&
51  std::is_base_of<Base, std::decay_t<Derived>>::value,
52  decltype(std::forward<Derived>(ref).*pmd)>
53  {
54  return std::forward<Derived>(ref).*pmd;
55  }
56 
57  template <class Base, class T, class RefWrap>
58  auto INVOKE(T Base::*pmd, RefWrap&& ref)
59  noexcept(noexcept(ref.get().*pmd))
60  -> std::enable_if_t<!std::is_function<T>::value &&
61  is_reference_wrapper<std::decay_t<RefWrap>>::value,
62  decltype(ref.get().*pmd)>
63  {
64  return ref.get().*pmd;
65  }
66 
67  template <class Base, class T, class Pointer>
68  auto INVOKE(T Base::*pmd, Pointer&& ptr)
69  noexcept(noexcept((*std::forward<Pointer>(ptr)).*pmd))
70  -> std::enable_if_t<!std::is_function<T>::value &&
71  !is_reference_wrapper<std::decay_t<Pointer>>::value &&
72  !std::is_base_of<Base, std::decay_t<Pointer>>::value,
73  decltype((*std::forward<Pointer>(ptr)).*pmd)>
74  {
75  return (*std::forward<Pointer>(ptr)).*pmd;
76  }
77 
78  template <class F, class... Args>
79  auto INVOKE(F&& f, Args&&... args)
80  noexcept(noexcept(std::forward<F>(f)(std::forward<Args>(args)...)))
81  -> std::enable_if_t<!std::is_member_pointer<std::decay_t<F>>::value,
82  decltype(std::forward<F>(f)(std::forward<Args>(args)...))>
83  {
84  return std::forward<F>(f)(std::forward<Args>(args)...);
85  }
86  } // namespace detail2
87 
88  template< class F, class... ArgTypes >
89  auto invoke(F&& f, ArgTypes&&... args)
90  // exception specification for QoI
91  noexcept(noexcept(detail2::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...)))
92  -> decltype(detail2::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...))
93  {
94  return detail2::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...);
95  }
96 }
STL namespace.
auto INVOKE(T Base::*pmf, Derived &&ref, Args &&...args) noexcept(noexcept((std::forward< Derived >(ref).*pmf)(std::forward< Args >(args)...))) -> std::enable_if_t< std::is_function< T >::value && std::is_base_of< Base, std::decay_t< Derived >>::value, decltype((std::forward< Derived >(ref).*pmf)(std::forward< Args >(args)...))>
Definition: invoke.h:16
auto invoke(F &&f, ArgTypes &&...args) noexcept(noexcept(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))) -> decltype(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))
Definition: invoke.h:89
Helper functions to set/get the application return code.
Definition: __init__.py:1