Index: base/tuple.h |
diff --git a/base/tuple.h b/base/tuple.h |
index e82f2e5f06ad8860f722879b44bfef1e150c23f1..9f62339f0d5df10eb9b43631151343fd3d1d4d85 100644 |
--- a/base/tuple.h |
+++ b/base/tuple.h |
@@ -121,6 +121,10 @@ auto get(T& t) -> decltype(std::get<I>(t)) { |
template <size_t N> |
using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::Type; |
+template <typename T> |
+using MakeIndexSequenceForTuple = |
+ MakeIndexSequence<std::tuple_size<typename std::decay<T>::type>::value>; |
+ |
// Dispatchers ---------------------------------------------------------------- |
// |
// Helper functions that call the given method on an object, with the unpacked |
@@ -132,62 +136,63 @@ using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::Type; |
// Non-Static Dispatchers with no out params. |
-template <typename ObjT, typename Method, typename... Ts, size_t... Ns> |
+template <typename ObjT, typename Method, typename Tuple, size_t... Ns> |
inline void DispatchToMethodImpl(const ObjT& obj, |
Method method, |
- const std::tuple<Ts...>& arg, |
+ Tuple&& args, |
IndexSequence<Ns...>) { |
- (obj->*method)(internal::Unwrap(std::get<Ns>(arg))...); |
+ (obj->*method)(base::get<Ns>(std::forward<Tuple>(args))...); |
} |
-template <typename ObjT, typename Method, typename... Ts> |
+template <typename ObjT, typename Method, typename Tuple> |
inline void DispatchToMethod(const ObjT& obj, |
Method method, |
- const std::tuple<Ts...>& arg) { |
- DispatchToMethodImpl(obj, method, arg, MakeIndexSequence<sizeof...(Ts)>()); |
+ Tuple&& args) { |
+ DispatchToMethodImpl(obj, method, std::forward<Tuple>(args), |
+ MakeIndexSequenceForTuple<Tuple>()); |
} |
// Static Dispatchers with no out params. |
-template <typename Function, typename... Ts, size_t... Ns> |
+template <typename Function, typename Tuple, size_t... Ns> |
inline void DispatchToFunctionImpl(Function function, |
- const std::tuple<Ts...>& arg, |
+ Tuple&& args, |
IndexSequence<Ns...>) { |
- (*function)(internal::Unwrap(std::get<Ns>(arg))...); |
+ (*function)(base::get<Ns>(std::forward<Tuple>(args))...); |
} |
-template <typename Function, typename... Ts> |
-inline void DispatchToFunction(Function function, |
- const std::tuple<Ts...>& arg) { |
- DispatchToFunctionImpl(function, arg, MakeIndexSequence<sizeof...(Ts)>()); |
+template <typename Function, typename Tuple> |
+inline void DispatchToFunction(Function function, Tuple&& args) { |
+ DispatchToFunctionImpl(function, std::forward<Tuple>(args), |
+ MakeIndexSequenceForTuple<Tuple>()); |
} |
// Dispatchers with out parameters. |
template <typename ObjT, |
typename Method, |
- typename... InTs, |
- typename... OutTs, |
+ typename InTuple, |
+ typename OutTuple, |
size_t... InNs, |
size_t... OutNs> |
inline void DispatchToMethodImpl(const ObjT& obj, |
Method method, |
- const std::tuple<InTs...>& in, |
- std::tuple<OutTs...>* out, |
+ InTuple&& in, |
+ OutTuple* out, |
IndexSequence<InNs...>, |
IndexSequence<OutNs...>) { |
- (obj->*method)(internal::Unwrap(std::get<InNs>(in))..., |
+ (obj->*method)(base::get<InNs>(std::forward<InTuple>(in))..., |
&std::get<OutNs>(*out)...); |
} |
-template <typename ObjT, typename Method, typename... InTs, typename... OutTs> |
+template <typename ObjT, typename Method, typename InTuple, typename OutTuple> |
inline void DispatchToMethod(const ObjT& obj, |
Method method, |
- const std::tuple<InTs...>& in, |
- std::tuple<OutTs...>* out) { |
- DispatchToMethodImpl(obj, method, in, out, |
- MakeIndexSequence<sizeof...(InTs)>(), |
- MakeIndexSequence<sizeof...(OutTs)>()); |
+ InTuple&& in, |
+ OutTuple* out) { |
+ DispatchToMethodImpl(obj, method, std::forward<InTuple>(in), out, |
+ MakeIndexSequenceForTuple<InTuple>(), |
+ MakeIndexSequenceForTuple<OutTuple>()); |
} |
} // namespace base |