Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Unified Diff: ipc/ipc_message_utils.h

Issue 2938613002: Add a variadic version of ParamTraits, to allow for >5 IPC parameters. (Closed)
Patch Set: Fixed GetSize implementation. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698