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..2e4f9c4425c4a4d3d8c50ee1a7aff95f8ef801a0 100644 |
| --- a/ipc/ipc_message_utils.h |
| +++ b/ipc/ipc_message_utils.h |
| @@ -724,149 +724,77 @@ 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)); |
| +template <int I, int MAX> |
| +struct ParamTraitsHelper { |
| + template <typename T> |
| + static void GetSize(base::PickleSizer* sizer, const T& p) { |
| + GetParamSize(sizer, std::get<I>(p)); |
| + ParamTraitsHelper<I + 1, MAX>::GetSize(sizer, p); |
| } |
| - static void Log(const param_type& p, std::string* l) { |
| - LogParam(std::get<0>(p), l); |
| - } |
| -}; |
| -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)); |
| + template <typename T> |
| + static void Write(base::Pickle* m, const T& p) { |
| + WriteParam(m, std::get<I>(p)); |
| + ParamTraitsHelper<I + 1, MAX>::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))); |
| - } |
| - 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 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))); |
| + template <typename T> |
| + static bool Read(const base::Pickle* m, base::PickleIterator* iter, T* r) { |
| + return ReadParam(m, iter, &std::get<I>(*r)) && |
| + ParamTraitsHelper<I + 1, MAX>::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); |
| + |
| + template <typename T> |
| + static void Log(const T& p, std::string* l) { |
| + LogParam(std::get<I>(p), l); |
| l->append(", "); |
| - LogParam(std::get<2>(p), l); |
| + ParamTraitsHelper<I + 1, MAX>::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)); |
| +template <int I> |
| +struct ParamTraitsHelper<I, I> { |
|
ossu-chromium
2017/06/14 17:28:24
Partial specialization for when I == MAX.
|
| + template <typename T> |
| + static void GetSize(base::PickleSizer* sizer, const T& p) { |
| + GetParamSize(sizer, std::get<I>(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)); |
| + |
| + template <typename T> |
| + static void Write(base::Pickle* m, const T& p) { |
| + WriteParam(m, std::get<I>(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))); |
| + |
| + template <typename T> |
| + static bool Read(const base::Pickle* m, base::PickleIterator* iter, T* r) { |
| + return ReadParam(m, iter, &std::get<I>(*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> |
| + static void Log(const T& p, std::string* l) { |
| + LogParam(std::get<I>(p), 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> |
| +struct ParamTraits<std::tuple<Args...>> { |
| + typedef std::tuple<Args...> param_type; |
| + typedef ParamTraitsHelper<0, std::tuple_size<param_type>::value - 1> Helper; |
| + |
| 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); } |
|
ossu-chromium
2017/06/14 17:28:24
clang-format put this on one line... I'm not sure
|
| }; |
| template <class P, size_t stack_capacity> |