• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_
6 #define PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_
7 
8 #include <string>
9 
10 #include "ppapi/c/pp_bool.h"
11 #include "ppapi/cpp/extensions/from_var_converter.h"
12 #include "ppapi/cpp/extensions/optional.h"
13 #include "ppapi/cpp/extensions/to_var_converter.h"
14 #include "ppapi/cpp/var.h"
15 #include "ppapi/cpp/var_dictionary.h"
16 
17 namespace pp {
18 namespace ext {
19 
20 template <class T>
21 class DictField {
22  public:
DictField(const std::string & key)23   explicit DictField(const std::string& key) : key_(key), value_() {
24   }
25 
~DictField()26   ~DictField() {
27   }
28 
key()29   const std::string& key() const { return key_; }
30 
31   // Returns the value.
operator()32   T& operator()() { return value_; }
operator()33   const T& operator()() const { return value_; }
34 
35   // Adds this field to the dictionary var.
AddTo(VarDictionary * dict)36   bool AddTo(VarDictionary* dict) const {
37     if (!dict)
38       return false;
39 
40     internal::ToVarConverter<T> converter(value_);
41     return dict->Set(Var(key_), converter.var());
42   }
43 
Populate(const VarDictionary & dict)44   bool Populate(const VarDictionary& dict) {
45     Var value_var = dict.Get(Var(key_));
46     if (value_var.is_undefined())
47       return false;
48 
49     internal::FromVarConverter<T> converter(value_var.pp_var());
50     value_ = converter.value();
51     return true;
52   }
53 
54  private:
55   std::string key_;
56   T value_;
57 };
58 
59 template <class T>
60 class OptionalDictField {
61  public:
OptionalDictField(const std::string & key)62   explicit OptionalDictField(const std::string& key) : key_(key) {
63   }
64 
~OptionalDictField()65   ~OptionalDictField() {
66   }
67 
key()68   const std::string& key() const { return key_; }
69 
70   // Returns the value.
operator()71   Optional<T>& operator()() { return value_; }
operator()72   const Optional<T>& operator()() const { return value_; }
73 
74   // Adds this field to the dictionary var, if |value| has been set.
MayAddTo(VarDictionary * dict)75   bool MayAddTo(VarDictionary* dict) const {
76     if (!dict)
77       return false;
78     if (!value_.IsSet())
79       return true;
80 
81     internal::ToVarConverter<T> converter(*value_);
82     return dict->Set(Var(key_), converter.var());
83   }
84 
Populate(const VarDictionary & dict)85   bool Populate(const VarDictionary& dict) {
86     Var value_var = dict.Get(Var(key_));
87     internal::FromVarConverter<Optional<T> > converter(value_var.pp_var());
88     value_.Swap(&converter.value());
89     return true;
90   }
91 
92  private:
93   std::string key_;
94   Optional<T> value_;
95 };
96 
97 }  // namespace ext
98 }  // namespace pp
99 
100 #endif  // PPAPI_CPP_EXTENSIONS_DICT_FIELD_H_
101