| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_ |
| #define PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_ |
| |
| #include <string> |
| |
| #include "ppapi/c/pp_bool.h" |
| #include "ppapi/cpp/extensions/from_var_converter.h" |
| #include "ppapi/cpp/extensions/optional.h" |
| #include "ppapi/cpp/extensions/to_var_converter.h" |
| #include "ppapi/cpp/var.h" |
| #include "ppapi/cpp/var_dictionary.h" |
| |
| namespace pp { |
| namespace ext { |
| |
| template <class T> |
| class DictField { |
| public: |
| explicit DictField(const std::string& key) : key_(key), value_() { |
| } |
| |
| ~DictField() { |
| } |
| |
| const std::string& key() const { return key_; } |
| |
| // Returns the value. |
| T& operator()() { return value_; } |
| const T& operator()() const { return value_; } |
| |
| // Adds this field to the dictionary var. |
| bool AddTo(VarDictionary* dict) const { |
| if (!dict) |
| return false; |
| |
| internal::ToVarConverter<T> converter(value_); |
| return dict->Set(Var(key_), converter.var()); |
| } |
| |
| bool Populate(const VarDictionary& dict) { |
| Var value_var = dict.Get(Var(key_)); |
| if (value_var.is_undefined()) |
| return false; |
| |
| internal::FromVarConverter<T> converter(value_var.pp_var()); |
| value_ = converter.value(); |
| return true; |
| } |
| |
| private: |
| std::string key_; |
| T value_; |
| }; |
| |
| template <class T> |
| class OptionalDictField { |
| public: |
| explicit OptionalDictField(const std::string& key) : key_(key) { |
| } |
| |
| ~OptionalDictField() { |
| } |
| |
| const std::string& key() const { return key_; } |
| |
| // Returns the value. |
| Optional<T>& operator()() { return value_; } |
| const Optional<T>& operator()() const { return value_; } |
| |
| // Adds this field to the dictionary var, if |value| has been set. |
| bool MayAddTo(VarDictionary* dict) const { |
| if (!dict) |
| return false; |
| if (!value_.IsSet()) |
| return true; |
| |
| internal::ToVarConverter<T> converter(*value_); |
| return dict->Set(Var(key_), converter.var()); |
| } |
| |
| bool Populate(const VarDictionary& dict) { |
| Var value_var = dict.Get(Var(key_)); |
| internal::FromVarConverter<Optional<T> > converter(value_var.pp_var()); |
| value_.Swap(&converter.value()); |
| return true; |
| } |
| |
| private: |
| std::string key_; |
| Optional<T> value_; |
| }; |
| |
| } // namespace ext |
| } // namespace pp |
| |
| #endif // PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_ |