#ifndef BASE_TUPLE_H_
#define BASE_TUPLE_H_
#include <stddef.h>
#include <tuple>
#include <utility>
#include "build/build_config.h"
namespace base {
template <typename ObjT, typename Method, typename Tuple, size_t... Ns>
inline void DispatchToMethodImpl(const ObjT& obj,
Method method,
Tuple&& args,
std::index_sequence<Ns...>) {
(obj->*method)(std::get<Ns>(std::forward<Tuple>(args))...);
}
template <typename ObjT, typename Method, typename Tuple>
inline void DispatchToMethod(const ObjT& obj,
Method method,
Tuple&& args) {
constexpr size_t size = std::tuple_size<std::decay_t<Tuple>>::value;
DispatchToMethodImpl(obj, method, std::forward<Tuple>(args),
std::make_index_sequence<size>());
}
template <typename Function, typename Tuple, size_t... Ns>
inline void DispatchToFunctionImpl(Function function,
Tuple&& args,
std::index_sequence<Ns...>) {
(*function)(std::get<Ns>(std::forward<Tuple>(args))...);
}
template <typename Function, typename Tuple>
inline void DispatchToFunction(Function function, Tuple&& args) {
constexpr size_t size = std::tuple_size<std::decay_t<Tuple>>::value;
DispatchToFunctionImpl(function, std::forward<Tuple>(args),
std::make_index_sequence<size>());
}
template <typename ObjT,
typename Method,
typename InTuple,
typename OutTuple,
size_t... InNs,
size_t... OutNs>
inline void DispatchToMethodImpl(const ObjT& obj,
Method method,
InTuple&& in,
OutTuple* out,
std::index_sequence<InNs...>,
std::index_sequence<OutNs...>) {
(obj->*method)(std::get<InNs>(std::forward<InTuple>(in))...,
&std::get<OutNs>(*out)...);
}
#if BUILDFLAG(IS_OHOS)
template <typename ObjT,
typename Method,
typename InTuple,
typename OutTuple,
typename P,
size_t... InNs,
size_t... OutNs>
inline void DispatchToMethodImpl_Param(const ObjT& obj,
Method method,
InTuple&& in,
OutTuple* out,
P* parameter,
std::index_sequence<InNs...>,
std::index_sequence<OutNs...>) {
(obj->*method)(parameter, std::get<InNs>(std::forward<InTuple>(in))...,
&std::get<OutNs>(*out)...);
}
#endif
template <typename ObjT, typename Method, typename InTuple, typename OutTuple>
inline void DispatchToMethod(const ObjT& obj,
Method method,
InTuple&& in,
OutTuple* out) {
constexpr size_t in_size = std::tuple_size<std::decay_t<InTuple>>::value;
constexpr size_t out_size = std::tuple_size<OutTuple>::value;
DispatchToMethodImpl(obj, method, std::forward<InTuple>(in), out,
std::make_index_sequence<in_size>(),
std::make_index_sequence<out_size>());
}
#if BUILDFLAG(IS_OHOS)
template <typename ObjT, typename Method, typename InTuple, typename P, typename OutTuple>
inline void DispatchToMethod_Param(const ObjT& obj,
Method method,
InTuple&& in,
P* parameter,
OutTuple* out) {
constexpr size_t in_size = std::tuple_size<std::decay_t<InTuple>>::value;
constexpr size_t out_size = std::tuple_size<OutTuple>::value;
DispatchToMethodImpl_Param(obj, method, std::forward<InTuple>(in), out, parameter,
std::make_index_sequence<in_size>(),
std::make_index_sequence<out_size>());
}
#endif
}
#endif