1 #ifndef GAUDIKERNEL_INVOKE_H 2 #define GAUDIKERNEL_INVOKE_H 21 template <
class Base,
class T,
class Derived,
class... Args>
23 noexcept( ( std::forward<Derived>(
ref ).*pmf )( std::forward<Args>(
args )... ) ) )
24 -> std::enable_if_t<std::is_function<T>::value && std::is_base_of<Base, std::decay_t<Derived>>::value,
25 decltype( ( std::forward<Derived>(
ref ).*pmf )( std::forward<Args>(
args )... ) )>
27 return ( std::forward<Derived>(
ref ).*pmf )( std::forward<Args>(
args )... );
30 template <
class Base,
class T,
class RefWrap,
class... Args>
32 Args&&...
args ) noexcept( noexcept( (
ref.
get().*pmf )( std::forward<Args>(
args )... ) ) )
33 -> std::enable_if_t<std::is_function<T>::value &&
is_reference_wrapper<std::decay_t<RefWrap>>::value,
34 decltype( (
ref.
get().*pmf )( std::forward<Args>(
args )... ) )>
37 return (
ref.get().*pmf )( std::forward<Args>( args )... );
40 template <
class Base,
class T,
class Pointer,
class... Args>
41 auto INVOKE( T Base::*pmf, Pointer&& ptr, Args&&...
args ) noexcept(
42 noexcept( ( ( *std::forward<Pointer>( ptr ) ).*pmf )( std::forward<Args>(
args )... ) ) )
43 -> std::enable_if_t<std::is_function<T>::value && !
is_reference_wrapper<std::decay_t<Pointer>>::value &&
44 !std::is_base_of<Base, std::decay_t<Pointer>>::value,
45 decltype( ( ( *std::forward<Pointer>( ptr ) ).*pmf )( std::forward<Args>(
args )... ) )>
47 return ( ( *std::forward<Pointer>( ptr ) ).*pmf )( std::forward<Args>(
args )... );
50 template <
class Base,
class T,
class Derived>
51 auto INVOKE( T Base::*pmd, Derived&&
ref ) noexcept( noexcept( std::forward<Derived>(
ref ).*pmd ) )
52 -> std::enable_if_t<!std::is_function<T>::value && std::is_base_of<Base, std::decay_t<Derived>>::value,
53 decltype( std::forward<Derived>(
ref ).*pmd )>
55 return std::forward<Derived>(
ref ).*pmd;
58 template <
class Base,
class T,
class RefWrap>
60 -> std::enable_if_t<!std::is_function<T>::value &&
is_reference_wrapper<std::decay_t<RefWrap>>::value,
61 decltype(
ref.
get().*pmd )>
63 return ref.get().*pmd;
66 template <
class Base,
class T,
class Po
inter>
67 auto INVOKE( T Base::*pmd, Pointer&& ptr ) noexcept( noexcept( ( *std::forward<Pointer>( ptr ) ).*pmd ) )
68 -> std::enable_if_t<!std::is_function<T>::value && !
is_reference_wrapper<std::decay_t<Pointer>>::value &&
69 !std::is_base_of<Base, std::decay_t<Pointer>>::value,
70 decltype( ( *std::forward<Pointer>( ptr ) ).*pmd )>
72 return ( *std::forward<Pointer>( ptr ) ).*pmd;
75 template <
class F,
class... Args>
76 auto INVOKE( F&& f, Args&&...
args ) noexcept( noexcept( std::forward<F>( f )( std::forward<Args>(
args )... ) ) )
77 -> std::enable_if_t<!std::is_member_pointer<std::decay_t<F>>::value,
78 decltype( std::forward<F>( f )( std::forward<Args>(
args )... ) )>
80 return std::forward<F>( f )( std::forward<Args>( args )... );
84 template <
class F,
class... ArgTypes>
87 noexcept( noexcept( detail2::
INVOKE(
std::forward<F>( f ),
std::forward<ArgTypes>(
args )... ) ) )
88 -> decltype( detail2::
INVOKE(
std::forward<F>( f ),
std::forward<ArgTypes>(
args )... ) )
90 return detail2::INVOKE( std::forward<F>( f ), std::forward<ArgTypes>( args )... );
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)...))>
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)...))
Helper functions to set/get the application return code.