OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef TOOLS_JSON_SCHEMA_COMPILER_UTIL_H__ | 5 #ifndef TOOLS_JSON_SCHEMA_COMPILER_UTIL_H__ |
6 #define TOOLS_JSON_SCHEMA_COMPILER_UTIL_H__ | 6 #define TOOLS_JSON_SCHEMA_COMPILER_UTIL_H__ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/memory/linked_ptr.h" | 11 #include "base/memory/linked_ptr.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/values.h" | 13 #include "base/values.h" |
14 | 14 |
15 namespace json_schema_compiler { | 15 namespace json_schema_compiler { |
16 | 16 |
17 namespace util { | 17 namespace util { |
18 | 18 |
19 struct ITEMS_ARE_BINARY {}; | |
20 struct ITEMS_ARE_NOT_BINARY {}; | |
not at google - send to devlin
2015/01/13 18:15:13
Mhm ok I'm going to add Jeffrey here to advise on
Jeffrey Yasskin
2015/01/13 18:57:08
Function pointers are generally slow to call, alth
not at google - send to devlin
2015/01/13 19:39:56
I'm fairly certain a lot more is going on than cal
Jeffrey Yasskin
2015/01/13 21:17:21
Nope. :)
| |
21 | |
19 // Creates a new item at |out| from |from|[|index|]. These are used by template | 22 // Creates a new item at |out| from |from|[|index|]. These are used by template |
20 // specializations of |Get(Optional)ArrayFromList|. | 23 // specializations of |Get(Optional)ArrayFromList|. |
21 bool GetItemFromList(const base::ListValue& from, int index, int* out); | |
22 bool GetItemFromList(const base::ListValue& from, int index, bool* out); | |
23 bool GetItemFromList(const base::ListValue& from, int index, double* out); | |
24 bool GetItemFromList(const base::ListValue& from, int index, std::string* out); | |
25 bool GetItemFromList(const base::ListValue& from, | 24 bool GetItemFromList(const base::ListValue& from, |
26 int index, | 25 int index, |
26 ITEMS_ARE_NOT_BINARY binary_tag, | |
27 int* out); | |
28 bool GetItemFromList(const base::ListValue& from, | |
29 int index, | |
30 ITEMS_ARE_NOT_BINARY binary_tag, | |
31 bool* out); | |
32 bool GetItemFromList(const base::ListValue& from, | |
33 int index, | |
34 ITEMS_ARE_NOT_BINARY binary_tag, | |
35 double* out); | |
36 bool GetItemFromList(const base::ListValue& from, | |
37 int index, | |
38 ITEMS_ARE_NOT_BINARY binary_tag, | |
39 std::string* out); | |
40 bool GetItemFromList(const base::ListValue& from, | |
41 int index, | |
42 ITEMS_ARE_BINARY, | |
43 std::string* out); | |
44 bool GetItemFromList(const base::ListValue& from, | |
45 int index, | |
46 ITEMS_ARE_NOT_BINARY binary_tag, | |
27 linked_ptr<base::Value>* out); | 47 linked_ptr<base::Value>* out); |
28 bool GetItemFromList(const base::ListValue& from, | 48 bool GetItemFromList(const base::ListValue& from, |
29 int index, | 49 int index, |
50 ITEMS_ARE_NOT_BINARY binary_tag, | |
30 linked_ptr<base::DictionaryValue>* out); | 51 linked_ptr<base::DictionaryValue>* out); |
31 | 52 |
32 // This template is used for types generated by tools/json_schema_compiler. | 53 // This template is used for types generated by tools/json_schema_compiler. |
33 template<class T> | 54 template <class T> |
34 bool GetItemFromList(const base::ListValue& from, | 55 bool GetItemFromList(const base::ListValue& from, |
35 int index, | 56 int index, |
57 ITEMS_ARE_NOT_BINARY /* binary_tag */, | |
36 linked_ptr<T>* out) { | 58 linked_ptr<T>* out) { |
37 const base::DictionaryValue* dict; | 59 const base::DictionaryValue* dict; |
38 if (!from.GetDictionary(index, &dict)) | 60 if (!from.GetDictionary(index, &dict)) |
39 return false; | 61 return false; |
40 scoped_ptr<T> obj(new T()); | 62 scoped_ptr<T> obj(new T()); |
41 if (!T::Populate(*dict, obj.get())) | 63 if (!T::Populate(*dict, obj.get())) |
42 return false; | 64 return false; |
43 *out = linked_ptr<T>(obj.release()); | 65 *out = linked_ptr<T>(obj.release()); |
44 return true; | 66 return true; |
45 } | 67 } |
46 | 68 |
47 // Populates |out| with |list|. Returns false if there is no list at the | 69 // Populates |out| with |list|. Returns false if there is no list at the |
48 // specified key or if the list has anything other than |T|. | 70 // specified key or if the list has anything other than |T|. |
49 template <class T> | 71 template <class T, class BINARY_TAG> |
50 bool PopulateArrayFromList( | 72 bool PopulateArrayFromList( |
51 const base::ListValue& list, std::vector<T>* out) { | 73 const base::ListValue& list, BINARY_TAG binary_tag, std::vector<T>* out) { |
52 out->clear(); | 74 out->clear(); |
53 T value; | 75 T value; |
54 for (size_t i = 0; i < list.GetSize(); ++i) { | 76 for (size_t i = 0; i < list.GetSize(); ++i) { |
55 if (!GetItemFromList(list, i, &value)) | 77 if (!GetItemFromList(list, i, binary_tag, &value)) |
56 return false; | 78 return false; |
57 out->push_back(value); | 79 out->push_back(value); |
58 } | 80 } |
59 | 81 |
60 return true; | 82 return true; |
61 } | 83 } |
62 | 84 |
63 // Populates |out| with |from|.|name|. Returns false if there is no list at | 85 // Populates |out| with |from|.|name|. Returns false if there is no list at |
64 // the specified key or if the list has anything other than |T|. | 86 // the specified key or if the list has anything other than |T|. |
65 template <class T> | 87 template <class T> |
66 bool PopulateArrayFromDictionary( | 88 bool PopulateArrayFromDictionary( |
67 const base::DictionaryValue& from, | 89 const base::DictionaryValue& from, |
68 const std::string& name, | 90 const std::string& name, |
69 std::vector<T>* out) { | 91 std::vector<T>* out) { |
70 const base::ListValue* list = NULL; | 92 const base::ListValue* list = NULL; |
71 if (!from.GetListWithoutPathExpansion(name, &list)) | 93 if (!from.GetListWithoutPathExpansion(name, &list)) |
72 return false; | 94 return false; |
73 | 95 |
74 return PopulateArrayFromList(*list, out); | 96 return PopulateArrayFromList(*list, ITEMS_ARE_NOT_BINARY(), out); |
75 } | 97 } |
76 | 98 |
77 // Creates a new vector containing |list| at |out|. Returns | 99 // Creates a new vector containing |list| at |out|. Returns |
78 // true on success or if there is nothing at the specified key. Returns false | 100 // true on success or if there is nothing at the specified key. Returns false |
79 // if anything other than a list of |T| is at the specified key. | 101 // if anything other than a list of |T| is at the specified key. |
80 template <class T> | 102 template <class T, class BINARY_TAG> |
81 bool PopulateOptionalArrayFromList( | 103 bool PopulateOptionalArrayFromList(const base::ListValue& list, |
82 const base::ListValue& list, | 104 BINARY_TAG binary_tag, |
83 scoped_ptr<std::vector<T> >* out) { | 105 scoped_ptr<std::vector<T>>* out) { |
84 out->reset(new std::vector<T>()); | 106 out->reset(new std::vector<T>()); |
85 T value; | 107 T value; |
86 for (size_t i = 0; i < list.GetSize(); ++i) { | 108 for (size_t i = 0; i < list.GetSize(); ++i) { |
87 if (!GetItemFromList(list, i, &value)) { | 109 if (!GetItemFromList(list, i, binary_tag, &value)) { |
88 out->reset(); | 110 out->reset(); |
89 return false; | 111 return false; |
90 } | 112 } |
91 (*out)->push_back(value); | 113 (*out)->push_back(value); |
92 } | 114 } |
93 | 115 |
94 return true; | 116 return true; |
95 } | 117 } |
96 | 118 |
97 // Creates a new vector containing |from|.|name| at |out|. Returns | 119 // Creates a new vector containing |from|.|name| at |out|. Returns |
98 // true on success or if there is nothing at the specified key. Returns false | 120 // true on success or if there is nothing at the specified key. Returns false |
99 // if anything other than a list of |T| is at the specified key. | 121 // if anything other than a list of |T| is at the specified key. |
100 template <class T> | 122 template <class T> |
101 bool PopulateOptionalArrayFromDictionary( | 123 bool PopulateOptionalArrayFromDictionary( |
102 const base::DictionaryValue& from, | 124 const base::DictionaryValue& from, |
103 const std::string& name, | 125 const std::string& name, |
104 scoped_ptr<std::vector<T> >* out) { | 126 scoped_ptr<std::vector<T> >* out) { |
105 const base::ListValue* list = NULL; | 127 const base::ListValue* list = NULL; |
106 { | 128 { |
107 const base::Value* maybe_list = NULL; | 129 const base::Value* maybe_list = NULL; |
108 // Since |name| is optional, its absence is acceptable. However, anything | 130 // Since |name| is optional, its absence is acceptable. However, anything |
109 // other than a ListValue is not. | 131 // other than a ListValue is not. |
110 if (!from.GetWithoutPathExpansion(name, &maybe_list)) | 132 if (!from.GetWithoutPathExpansion(name, &maybe_list)) |
111 return true; | 133 return true; |
112 if (!maybe_list->IsType(base::Value::TYPE_LIST)) | 134 if (!maybe_list->IsType(base::Value::TYPE_LIST)) |
113 return false; | 135 return false; |
114 list = static_cast<const base::ListValue*>(maybe_list); | 136 list = static_cast<const base::ListValue*>(maybe_list); |
115 } | 137 } |
116 | 138 |
117 return PopulateOptionalArrayFromList(*list, out); | 139 return PopulateOptionalArrayFromList(*list, ITEMS_ARE_NOT_BINARY(), out); |
118 } | 140 } |
119 | 141 |
120 // Appends a Value newly created from |from| to |out|. These used by template | 142 // Appends a Value newly created from |from| to |out|. These used by template |
121 // specializations of |Set(Optional)ArrayToList|. | 143 // specializations of |Set(Optional)ArrayToList|. |
122 void AddItemToList(const int from, base::ListValue* out); | 144 void AddItemToList(const int from, base::ListValue* out); |
123 void AddItemToList(const bool from, base::ListValue* out); | 145 void AddItemToList(const bool from, base::ListValue* out); |
124 void AddItemToList(const double from, base::ListValue* out); | 146 void AddItemToList(const double from, base::ListValue* out); |
125 void AddItemToList(const std::string& from, base::ListValue* out); | 147 void AddItemToList(const std::string& from, base::ListValue* out); |
126 void AddItemToList(const linked_ptr<base::Value>& from, | 148 void AddItemToList(const linked_ptr<base::Value>& from, |
127 base::ListValue* out); | 149 base::ListValue* out); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
172 return CreateValueFromArray(*from); | 194 return CreateValueFromArray(*from); |
173 return scoped_ptr<base::Value>(); | 195 return scoped_ptr<base::Value>(); |
174 } | 196 } |
175 | 197 |
176 std::string ValueTypeToString(base::Value::Type type); | 198 std::string ValueTypeToString(base::Value::Type type); |
177 | 199 |
178 } // namespace util | 200 } // namespace util |
179 } // namespace json_schema_compiler | 201 } // namespace json_schema_compiler |
180 | 202 |
181 #endif // TOOLS_JSON_SCHEMA_COMPILER_UTIL_H__ | 203 #endif // TOOLS_JSON_SCHEMA_COMPILER_UTIL_H__ |
OLD | NEW |