Chromium Code Reviews| Index: ipc/ipc_message_utils.h |
| diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h |
| index 84324ebaf417f5aee89cdfb33b60d513ac19c7c5..ce36ba5418cdc27cb26cd3e715aec90b8920865b 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 I, int COUNT> |
|
Ken Rockot(use gerrit already)
2017/06/20 16:35:53
super nitty nit: The style guide seems to be silen
|
| +struct TupleParamTraitsHelper { |
| + using Next = TupleParamTraitsHelper<T, I + 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<I>(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<I>(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<I>(*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<I>(p), l); |
| + if (I < 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 I> |
| +struct TupleParamTraitsHelper<T, I, I> { |
| + 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 <class... Args> |
|
Ken Rockot(use gerrit already)
2017/06/20 16:35:53
nit: for consistency with most new code please con
|
| +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> |