Chromium Code Reviews| Index: tools/json_schema_compiler/util.h |
| diff --git a/tools/json_schema_compiler/util.h b/tools/json_schema_compiler/util.h |
| index e94b518cd1232f4a1e8808febbc71198385f1584..1729ae7e27f27d8b303d6675e4225bfa0c24bbb9 100644 |
| --- a/tools/json_schema_compiler/util.h |
| +++ b/tools/json_schema_compiler/util.h |
| @@ -9,43 +9,169 @@ |
| #include <string> |
| #include <vector> |
| +#include "base/memory/linked_ptr.h" |
| #include "base/memory/scoped_ptr.h" |
| - |
| -namespace base { |
| -class DictionaryValue; |
| -} |
| +#include "base/values.h" |
| namespace json_schema_compiler { |
| namespace util { |
| -// Creates a new vector containing the strings |from|.|name| at |out|. Returns |
| +// Creates a new item at |out| from |from|[|index|]. These are used by template |
| +// specializations of |Get(Optional)ArrayFromList|. |
| +bool GetItemFromList(const ListValue& from, int index, int* out); |
| +bool GetItemFromList(const ListValue& from, int index, bool* out); |
| +bool GetItemFromList(const ListValue& from, int index, double* out); |
| +bool GetItemFromList(const ListValue& from, int index, std::string* out); |
| +bool GetItemFromList(const ListValue& from, int index, |
| + linked_ptr<base::DictionaryValue>* out); |
| + |
| +// This template is used for types generated by tools/json_schema_compiler. |
| +template<class T> |
| +bool GetItemFromList(const ListValue& from, int index, linked_ptr<T>* out) { |
| + DictionaryValue* dict; |
| + if (!from.GetDictionary(index, &dict)) |
| + return false; |
| + T* obj(new T()); |
| + if (!T::Populate(*dict, obj)) |
| + return false; |
| + *out = linked_ptr<T>(obj); |
| + return true; |
| +} |
| +// Creates a new vector containing Llist| at |out|. Returns |
| +// false if there is no list at the specified key or if the list has anything |
| +// other than |T|. |
| +template <class T> |
| +bool GetArrayFromList( |
| + const base::ListValue& list, std::vector<T>* out) { |
| + T value; |
| + for (size_t i = 0; i < list.GetSize(); ++i) { |
| + if (!GetItemFromList(list, i, &value)) |
| + return false; |
| + out->push_back(value); |
| + } |
| + |
| + return true; |
| +} |
| + |
| +// Creates a new vector containing |from|.|name| at |out|. Returns |
| // false if there is no list at the specified key or if the list has anything |
| -// other than strings. |
| -bool GetStrings( |
| +// other than |T|. |
| +template <class T> |
| +bool GetArrayFromDictionary( |
| const base::DictionaryValue& from, |
| const std::string& name, |
| - std::vector<std::string>* out); |
| + std::vector<T>* out) { |
| + base::ListValue* list = NULL; |
| + if (!from.GetListWithoutPathExpansion(name, &list)) |
| + return false; |
| + |
| + return GetArrayFromList(*list, out); |
| +} |
| + |
| +// Creates a new vector containing |list| at |out|. Returns |
| +// true on success or if there is nothing at the specified key. Returns false |
| +// if anything other than a list of |T| is at the specified key. |
| +template <class T> |
| +bool GetOptionalArrayFromList( |
| + const base::ListValue& list, |
| + scoped_ptr<std::vector<T> >* out) { |
| + out->reset(new std::vector<T>()); |
| + T value; |
| + for (size_t i = 0; i < list.GetSize(); ++i) { |
| + if (!GetItemFromList(list, i, &value)) { |
| + out->reset(); |
| + return false; |
| + } |
| + (*out)->push_back(value); |
| + } |
| + |
| + return true; |
| +} |
| -// Creates a new vector containing the strings |from|.|name| at |out|. Returns |
| +// Creates a new vector containing |from|.|name| at |out|. Returns |
| // true on success or if there is nothing at the specified key. Returns false |
| -// if anything other than a list of strings is at the specified key. |
| -bool GetOptionalStrings( |
| +// if anything other than a list of |T| is at the specified key. |
| +template <class T> |
| +bool GetOptionalArrayFromDictionary( |
| const base::DictionaryValue& from, |
| const std::string& name, |
| - scoped_ptr<std::vector<std::string> >* out); |
| + scoped_ptr<std::vector<T> >* out) { |
| + base::ListValue* list = NULL; |
| + { |
| + base::Value* maybe_list = NULL; |
| + // Since |name| is optional, its absence is acceptable. However, anything |
| + // other than a ListValue is not. |
| + if (!from.GetWithoutPathExpansion(name, &maybe_list)) |
| + return true; |
| + if (!maybe_list->IsType(base::Value::TYPE_LIST)) |
| + return false; |
| + list = static_cast<base::ListValue*>(maybe_list); |
| + } |
| -// Puts the each string in |from| into a new ListValue at |out|.|name|. |
| -void SetStrings( |
| - const std::vector<std::string>& from, |
| + return GetOptionalArrayFromList(*list, out); |
| +} |
| + |
| +// Appends a Value newly created from |from| to |out|. These used by template |
| +// specializations of |Set(Optional)ArrayToList|. |
| +void AddItemToList(const int from, base::ListValue* out); |
| +void AddItemToList(const bool from, base::ListValue* out); |
| +void AddItemToList(const double from, base::ListValue* out); |
| +void AddItemToList(const std::string& from, base::ListValue* out); |
| +void AddItemToList(const linked_ptr<base::DictionaryValue>& from, |
| + base::ListValue* out); |
| + |
| +// This template is used for types generated by tools/json_schema_compiler. |
| +template<class T> |
| +void AddItemToList(const linked_ptr<T>& from, ListValue* out) { |
| + out->Append(from->ToValue()); |
| +} |
| + |
| +// Set |out| to the the contents of |from|. Requires GetItemFromList to be |
| +// implemented for |T|. |
| +template <class T> |
| +void SetArrayToList( |
| + const std::vector<T>& from, |
| + base::ListValue* out) { |
| + for (typename std::vector<T>::const_iterator it = from.begin(); |
| + it != from.end(); ++it) { |
| + AddItemToList(*it, out); |
| + } |
| +} |
| + |
| +// Set |out| to the the contents of |from| if |from| is non-NULL. Requires |
| +// GetItemFromList to be implemented for |T|. |
| +template <class T> |
| +void SetOptionalArrayToList( |
| + const scoped_ptr<std::vector<T> >& from, |
| + base::ListValue* out) { |
| + if (from.get()) |
| + SetArrayToList(*from, out); |
| + |
|
not at google - send to devlin
2012/02/09 02:49:36
hm?
|
| +} |
| + |
| +// Sets |out|.|name| to a newly created ListValue containing |from|. Requires |
| +// GetItemFromList to be implemented for |T|. |
| +template <class T> |
| +void SetArrayToDictionary( |
| + const std::vector<T>& from, |
| const std::string& name, |
| - base::DictionaryValue* out); |
| + base::DictionaryValue* out) { |
| + base::ListValue* list = new base::ListValue(); |
| + out->SetWithoutPathExpansion(name, list); |
| + SetArrayToList(from, list); |
| +} |
| -// If from is non-NULL, puts each string in |from| into a new ListValue at |
| -// |out|.|name|. |
| -void SetOptionalStrings( |
| - const scoped_ptr<std::vector<std::string> >& from, |
| +// If |from| is non-NULL, sets |out|.|name| to a newly created ListValue |
| +// containing |from|. Requires GetItemFromList to be implemented for |T|. |
| +template <class T> |
| +void SetOptionalArrayToDictionary( |
| + const scoped_ptr<std::vector<T> >& from, |
| const std::string& name, |
| - base::DictionaryValue* out); |
| + base::DictionaryValue* out) { |
| + if (from.get()) |
| + SetArrayToDictionary(*from, name, out); |
| +} |
| + |
| } // namespace api_util |
| } // namespace extensions |