| Index: chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
|
| diff --git a/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc b/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
|
| index 39eeb0ae60c75b5c11505314d6e5b6d590f5f6ab..490c258a96cc87e1e0f0ebeb4de3300ff96c6ddb 100644
|
| --- a/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
|
| +++ b/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
|
| @@ -9,21 +9,21 @@
|
|
|
| namespace {
|
|
|
| -bool GetValue(const base::ListValue& list, int pos, std::string& value) {
|
| - return list.GetString(pos, &value);
|
| +bool GetValue(const base::Value* value, std::string* result) {
|
| + return value->GetAsString(result);
|
| }
|
|
|
| -bool GetValue(const base::ListValue& list, int pos, int& value) {
|
| - return list.GetInteger(pos, &value);
|
| +bool GetValue(const base::Value* value, int* result) {
|
| + return value->GetAsInteger(result);
|
| }
|
|
|
| -bool GetValue(const base::ListValue& list, int pos, bool& value) {
|
| - return list.GetBoolean(pos, &value);
|
| +bool GetValue(const base::Value* value, bool* result) {
|
| + return value->GetAsBoolean(result);
|
| }
|
|
|
| -bool GetValue(const base::ListValue& list, int pos, gfx::Rect& rect) {
|
| +bool GetValue(const base::Value* value, gfx::Rect* rect) {
|
| const base::DictionaryValue* dict;
|
| - if (!list.GetDictionary(pos, &dict))
|
| + if (!value->GetAsDictionary(&dict))
|
| return false;
|
| int x = 0;
|
| int y = 0;
|
| @@ -34,108 +34,60 @@ bool GetValue(const base::ListValue& list, int pos, gfx::Rect& rect) {
|
| !dict->GetInteger("width", &width) ||
|
| !dict->GetInteger("height", &height))
|
| return false;
|
| - rect.SetRect(x, y, width, height);
|
| + rect->SetRect(x, y, width, height);
|
| return true;
|
| }
|
|
|
| template <typename T>
|
| struct StorageTraits {
|
| - typedef T StorageType;
|
| + using StorageType = T;
|
| };
|
|
|
| template <typename T>
|
| struct StorageTraits<const T&> {
|
| - typedef T StorageType;
|
| + using StorageType = T;
|
| };
|
|
|
| -template <class A>
|
| -class Argument {
|
| - public:
|
| - typedef typename StorageTraits<A>::StorageType ValueType;
|
| -
|
| - Argument(const base::ListValue& list, int pos) {
|
| - valid_ = GetValue(list, pos, value_);
|
| +template <typename... Ts>
|
| +struct ParamTuple {
|
| + bool Parse(const base::ListValue& list,
|
| + const base::ListValue::const_iterator& it) {
|
| + return it == list.end();
|
| }
|
|
|
| - ValueType value() const { return value_; }
|
| - bool valid() const { return valid_; }
|
| -
|
| - private:
|
| - ValueType value_;
|
| - bool valid_;
|
| + template <typename H, typename... As>
|
| + void Apply(const H& handler, As... args) {
|
| + handler.Run(args...);
|
| + }
|
| };
|
|
|
| -bool ParseAndHandle0(const base::Callback<void(void)>& handler,
|
| - const base::ListValue& list) {
|
| - if (list.GetSize() != 0)
|
| +template <typename T, typename... Ts>
|
| +struct ParamTuple<T, Ts...> {
|
| + bool Parse(const base::ListValue& list,
|
| + const base::ListValue::const_iterator& it) {
|
| + if (it == list.end())
|
| return false;
|
| - handler.Run();
|
| - return true;
|
| -}
|
| -
|
| -template <class A1>
|
| -bool ParseAndHandle1(const base::Callback<void(A1)>& handler,
|
| - const base::ListValue& list) {
|
| - if (list.GetSize() != 1)
|
| - return false;
|
| - Argument<A1> arg1(list, 0);
|
| - if (!arg1.valid())
|
| - return false;
|
| - handler.Run(arg1.value());
|
| - return true;
|
| -}
|
| + if (!GetValue(*it, &head))
|
| + return false;
|
| + return tail.Parse(list, it + 1);
|
| + }
|
|
|
| -template <class A1, class A2>
|
| -bool ParseAndHandle2(const base::Callback<void(A1, A2)>& handler,
|
| - const base::ListValue& list) {
|
| - if (list.GetSize() != 2)
|
| - return false;
|
| - Argument<A1> arg1(list, 0);
|
| - if (!arg1.valid())
|
| - return false;
|
| - Argument<A2> arg2(list, 1);
|
| - if (!arg2.valid())
|
| - return false;
|
| - handler.Run(arg1.value(), arg2.value());
|
| - return true;
|
| -}
|
| + template <typename H, typename... As>
|
| + void Apply(const H& handler, As... args) {
|
| + tail.template Apply<H, As..., T>(handler, args..., head);
|
| + }
|
|
|
| -template <class A1, class A2, class A3>
|
| -bool ParseAndHandle3(const base::Callback<void(A1, A2, A3)>& handler,
|
| - const base::ListValue& list) {
|
| - if (list.GetSize() != 3)
|
| - return false;
|
| - Argument<A1> arg1(list, 0);
|
| - if (!arg1.valid())
|
| - return false;
|
| - Argument<A2> arg2(list, 1);
|
| - if (!arg2.valid())
|
| - return false;
|
| - Argument<A3> arg3(list, 2);
|
| - if (!arg3.valid())
|
| - return false;
|
| - handler.Run(arg1.value(), arg2.value(), arg3.value());
|
| - return true;
|
| -}
|
| + typename StorageTraits<T>::StorageType head;
|
| + ParamTuple<Ts...> tail;
|
| +};
|
|
|
| -template <class A1, class A2, class A3, class A4>
|
| -bool ParseAndHandle4(const base::Callback<void(A1, A2, A3, A4)>& handler,
|
| - const base::ListValue& list) {
|
| - if (list.GetSize() != 4)
|
| - return false;
|
| - Argument<A1> arg1(list, 0);
|
| - if (!arg1.valid())
|
| - return false;
|
| - Argument<A2> arg2(list, 1);
|
| - if (!arg2.valid())
|
| - return false;
|
| - Argument<A3> arg3(list, 2);
|
| - if (!arg3.valid())
|
| +template<typename... As>
|
| +bool ParseAndHandle(const base::Callback<void(As...)>& handler,
|
| + const base::ListValue& list) {
|
| + ParamTuple<As...> tuple;
|
| + if (!tuple.Parse(list, list.begin()))
|
| return false;
|
| - Argument<A4> arg4(list, 3);
|
| - if (!arg4.valid())
|
| - return false;
|
| - handler.Run(arg1.value(), arg2.value(), arg3.value(), arg4.value());
|
| + tuple.Apply(handler);
|
| return true;
|
| }
|
|
|
| @@ -173,42 +125,10 @@ class DispatcherImpl : public DevToolsEmbedderMessageDispatcher {
|
| handlers_[method] = handler;
|
| }
|
|
|
| - template<class T>
|
| - void RegisterHandler(const std::string& method,
|
| - void (T::*handler)(), T* delegate) {
|
| - handlers_[method] = base::Bind(&ParseAndHandle0,
|
| - base::Bind(handler,
|
| - base::Unretained(delegate)));
|
| - }
|
| -
|
| - template<class T, class A1>
|
| - void RegisterHandler(const std::string& method,
|
| - void (T::*handler)(A1), T* delegate) {
|
| - handlers_[method] = base::Bind(ParseAndHandle1<A1>,
|
| - base::Bind(handler,
|
| - base::Unretained(delegate)));
|
| - }
|
| -
|
| - template<class T, class A1, class A2>
|
| - void RegisterHandler(const std::string& method,
|
| - void (T::*handler)(A1, A2), T* delegate) {
|
| - handlers_[method] = base::Bind(ParseAndHandle2<A1, A2>,
|
| - base::Bind(handler,
|
| - base::Unretained(delegate)));
|
| - }
|
| -
|
| - template<class T, class A1, class A2, class A3>
|
| - void RegisterHandler(const std::string& method,
|
| - void (T::*handler)(A1, A2, A3), T* delegate) {
|
| - handlers_[method] = base::Bind(ParseAndHandle3<A1, A2, A3>,
|
| - base::Bind(handler,
|
| - base::Unretained(delegate)));
|
| - }
|
| -
|
| - template<class T, class A1, class A2, class A3, class A4>
|
| + template<typename T, typename... As>
|
| void RegisterHandler(const std::string& method,
|
| - void (T::*handler)(A1, A2, A3, A4), T* delegate) {
|
| - handlers_[method] = base::Bind(ParseAndHandle4<A1, A2, A3, A4>,
|
| + void (T::*handler)(As...), T* delegate) {
|
| + handlers_[method] = base::Bind(&ParseAndHandle<As...>,
|
| base::Bind(handler,
|
| base::Unretained(delegate)));
|
| }
|
|
|