15 #ifndef ROOT7_Impl_Tuple_Apply 
   16 #define ROOT7_Impl_Tuple_Apply 
   18 #include "RConfigure.h" 
   25 #ifndef R__HAS_STD_INVOKE 
   28 template <
class F, 
class... Args>
 
   29 inline auto INVOKE(F&& f, Args&&... args) ->
 
   30 decltype(std::forward<F>(f)(std::forward<Args>(args)...)) {
 
   31   return std::forward<F>(f)(std::forward<Args>(args)...);
 
   34 template <
class Base, 
class T, 
class Derived>
 
   35 inline auto INVOKE(T Base::*pmd, Derived&& ref) ->
 
   36 decltype(std::forward<Derived>(ref).*pmd) {
 
   37   return std::forward<Derived>(ref).*pmd;
 
   40 template <
class PMD, 
class Po
inter>
 
   41 inline auto INVOKE(PMD pmd, Pointer&& ptr) ->
 
   42 decltype((*std::forward<Pointer>(ptr)).*pmd) {
 
   43   return (*std::forward<Pointer>(ptr)).*pmd;
 
   46 template <
class Base, 
class T, 
class Derived, 
class... Args>
 
   47 inline auto INVOKE(T Base::*pmf, Derived&& ref, Args&&... args) ->
 
   48 decltype((std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...)) {
 
   49   return (std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...);
 
   52 template <
class PMF, 
class Pointer, 
class... Args>
 
   53 inline auto INVOKE(PMF pmf, Pointer&& ptr, Args&&... args) ->
 
   54 decltype(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...)) {
 
   55   return ((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...);
 
   61 inline namespace __ROOT {
 
   63 template< 
class F, 
class... ArgTypes>
 
   64 decltype(
auto) invoke(F&& f, ArgTypes&&... args) {
 
   65   return ROOT::Detail::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...);
 
   70 #endif // ndef R__HAS_STD_INVOKE 
   72 #ifndef R__HAS_STD_APPLY 
   76 template<
class F, 
class Tuple, std::size_t... I>
 
   77 constexpr decltype(
auto) apply_impl(F &&f, Tuple &&t,
 
   78                                     std::index_sequence<I...>) {
 
   79   return std::invoke(std::forward<F>(f),
 
   80                      std::get<I>(std::forward<Tuple>(t))...);
 
   87 inline namespace __ROOT {
 
   88 template<
class F, 
class Tuple>
 
   89 constexpr decltype(
auto) apply(F &&f, Tuple &&t) {
 
   90   return ROOT::Detail::apply_impl(std::forward<F>(f), std::forward<Tuple>(t),
 
   91                             std::make_index_sequence < std::tuple_size <
 
   92                             std::decay_t < Tuple >> {} > {});
 
   96 #endif // ndef R__HAS_STD_APPLY 
   98 #endif //ROOT7_TUPLE_APPLY_H