Index: ipc/ipc_message_utils.h |
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h |
index 84324ebaf417f5aee89cdfb33b60d513ac19c7c5..3f429b66539d0a0ae9e6782d11426b27e45ef55a 100644 |
--- a/ipc/ipc_message_utils.h |
+++ b/ipc/ipc_message_utils.h |
@@ -724,149 +724,63 @@ struct ParamTraits<std::tuple<>> { |
} |
}; |
-template <class A> |
-struct ParamTraits<std::tuple<A>> { |
- typedef std::tuple<A> param_type; |
- static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
- GetParamSize(sizer, std::get<0>(p)); |
- } |
- static void Write(base::Pickle* m, const param_type& p) { |
- WriteParam(m, std::get<0>(p)); |
- } |
- static bool Read(const base::Pickle* m, |
- base::PickleIterator* iter, |
- param_type* r) { |
- return ReadParam(m, iter, &std::get<0>(*r)); |
- } |
- static void Log(const param_type& p, std::string* l) { |
- LogParam(std::get<0>(p), l); |
- } |
-}; |
+template <typename T, int index, int count> |
+struct TupleParamTraitsHelper { |
+ using Next = TupleParamTraitsHelper<T, index + 1, count>; |
-template <class A, class B> |
-struct ParamTraits<std::tuple<A, B>> { |
- typedef std::tuple<A, B> param_type; |
- static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
- GetParamSize(sizer, std::get<0>(p)); |
- GetParamSize(sizer, std::get<1>(p)); |
- } |
- static void Write(base::Pickle* m, const param_type& p) { |
- WriteParam(m, std::get<0>(p)); |
- WriteParam(m, std::get<1>(p)); |
+ static void GetSize(base::PickleSizer* sizer, const T& p) { |
+ GetParamSize(sizer, std::get<index>(p)); |
+ Next::GetSize(sizer, p); |
} |
- static bool Read(const base::Pickle* m, |
- base::PickleIterator* iter, |
- param_type* r) { |
- return (ReadParam(m, iter, &std::get<0>(*r)) && |
- ReadParam(m, iter, &std::get<1>(*r))); |
- } |
- static void Log(const param_type& p, std::string* l) { |
- LogParam(std::get<0>(p), l); |
- l->append(", "); |
- LogParam(std::get<1>(p), l); |
- } |
-}; |
-template <class A, class B, class C> |
-struct ParamTraits<std::tuple<A, B, C>> { |
- typedef std::tuple<A, B, C> param_type; |
- static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
- GetParamSize(sizer, std::get<0>(p)); |
- GetParamSize(sizer, std::get<1>(p)); |
- GetParamSize(sizer, std::get<2>(p)); |
- } |
- static void Write(base::Pickle* m, const param_type& p) { |
- WriteParam(m, std::get<0>(p)); |
- WriteParam(m, std::get<1>(p)); |
- WriteParam(m, std::get<2>(p)); |
+ static void Write(base::Pickle* m, const T& p) { |
+ WriteParam(m, std::get<index>(p)); |
+ Next::Write(m, p); |
} |
- static bool Read(const base::Pickle* m, |
- base::PickleIterator* iter, |
- param_type* r) { |
- return (ReadParam(m, iter, &std::get<0>(*r)) && |
- ReadParam(m, iter, &std::get<1>(*r)) && |
- ReadParam(m, iter, &std::get<2>(*r))); |
+ |
+ static bool Read(const base::Pickle* m, base::PickleIterator* iter, T* r) { |
+ return ReadParam(m, iter, &std::get<index>(*r)) && Next::Read(m, iter, r); |
} |
- static void Log(const param_type& p, std::string* l) { |
- LogParam(std::get<0>(p), l); |
- l->append(", "); |
- LogParam(std::get<1>(p), l); |
- l->append(", "); |
- LogParam(std::get<2>(p), l); |
+ |
+ static void Log(const T& p, std::string* l) { |
+ LogParam(std::get<index>(p), l); |
+ if (index < count - 1) |
+ l->append(", "); |
+ Next::Log(p, l); |
} |
}; |
-template <class A, class B, class C, class D> |
-struct ParamTraits<std::tuple<A, B, C, D>> { |
- typedef std::tuple<A, B, C, D> param_type; |
- static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
- GetParamSize(sizer, std::get<0>(p)); |
- GetParamSize(sizer, std::get<1>(p)); |
- GetParamSize(sizer, std::get<2>(p)); |
- GetParamSize(sizer, std::get<3>(p)); |
- } |
- static void Write(base::Pickle* m, const param_type& p) { |
- WriteParam(m, std::get<0>(p)); |
- WriteParam(m, std::get<1>(p)); |
- WriteParam(m, std::get<2>(p)); |
- WriteParam(m, std::get<3>(p)); |
- } |
- static bool Read(const base::Pickle* m, |
- base::PickleIterator* iter, |
- param_type* r) { |
- return (ReadParam(m, iter, &std::get<0>(*r)) && |
- ReadParam(m, iter, &std::get<1>(*r)) && |
- ReadParam(m, iter, &std::get<2>(*r)) && |
- ReadParam(m, iter, &std::get<3>(*r))); |
- } |
- static void Log(const param_type& p, std::string* l) { |
- LogParam(std::get<0>(p), l); |
- l->append(", "); |
- LogParam(std::get<1>(p), l); |
- l->append(", "); |
- LogParam(std::get<2>(p), l); |
- l->append(", "); |
- LogParam(std::get<3>(p), l); |
+template <typename T, int index> |
+struct TupleParamTraitsHelper<T, index, index> { |
+ static void GetSize(base::PickleSizer* sizer, const T& p) {} |
+ static void Write(base::Pickle* m, const T& p) {} |
+ static bool Read(const base::Pickle* m, base::PickleIterator* iter, T* r) { |
+ return true; |
} |
+ static void Log(const T& p, std::string* l) {} |
}; |
-template <class A, class B, class C, class D, class E> |
-struct ParamTraits<std::tuple<A, B, C, D, E>> { |
- typedef std::tuple<A, B, C, D, E> param_type; |
+template <typename... Args> |
+struct ParamTraits<std::tuple<Args...>> { |
+ using param_type = std::tuple<Args...>; |
+ using Helper = |
+ TupleParamTraitsHelper<param_type, 0, std::tuple_size<param_type>::value>; |
+ |
static void GetSize(base::PickleSizer* sizer, const param_type& p) { |
- GetParamSize(sizer, std::get<0>(p)); |
- GetParamSize(sizer, std::get<1>(p)); |
- GetParamSize(sizer, std::get<2>(p)); |
- GetParamSize(sizer, std::get<3>(p)); |
- GetParamSize(sizer, std::get<4>(p)); |
+ Helper::GetSize(sizer, p); |
} |
+ |
static void Write(base::Pickle* m, const param_type& p) { |
- WriteParam(m, std::get<0>(p)); |
- WriteParam(m, std::get<1>(p)); |
- WriteParam(m, std::get<2>(p)); |
- WriteParam(m, std::get<3>(p)); |
- WriteParam(m, std::get<4>(p)); |
+ Helper::Write(m, p); |
} |
+ |
static bool Read(const base::Pickle* m, |
base::PickleIterator* iter, |
param_type* r) { |
- return (ReadParam(m, iter, &std::get<0>(*r)) && |
- ReadParam(m, iter, &std::get<1>(*r)) && |
- ReadParam(m, iter, &std::get<2>(*r)) && |
- ReadParam(m, iter, &std::get<3>(*r)) && |
- ReadParam(m, iter, &std::get<4>(*r))); |
- } |
- static void Log(const param_type& p, std::string* l) { |
- LogParam(std::get<0>(p), l); |
- l->append(", "); |
- LogParam(std::get<1>(p), l); |
- l->append(", "); |
- LogParam(std::get<2>(p), l); |
- l->append(", "); |
- LogParam(std::get<3>(p), l); |
- l->append(", "); |
- LogParam(std::get<4>(p), l); |
+ return Helper::Read(m, iter, r); |
} |
+ |
+ static void Log(const param_type& p, std::string* l) { Helper::Log(p, l); } |
}; |
template <class P, size_t stack_capacity> |