OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 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 MOJO_COMMON_VALUES_STRUCT_TRAITS_H_ |
| 6 #define MOJO_COMMON_VALUES_STRUCT_TRAITS_H_ |
| 7 |
| 8 #include "base/values.h" |
| 9 #include "mojo/common/values.mojom.h" |
| 10 #include "mojo/public/cpp/bindings/array_traits.h" |
| 11 #include "mojo/public/cpp/bindings/map_traits.h" |
| 12 #include "mojo/public/cpp/bindings/struct_traits.h" |
| 13 #include "mojo/public/cpp/bindings/union_traits.h" |
| 14 |
| 15 namespace mojo { |
| 16 |
| 17 template <> |
| 18 struct ArrayTraits<base::ListValue> { |
| 19 using Element = std::unique_ptr<base::Value>; |
| 20 using ConstIterator = base::ListValue::const_iterator; |
| 21 |
| 22 static size_t GetSize(const base::ListValue& input) { |
| 23 return input.GetSize(); |
| 24 } |
| 25 |
| 26 static ConstIterator GetBegin(const base::ListValue& input) { |
| 27 return input.begin(); |
| 28 } |
| 29 |
| 30 static void AdvanceIterator(ConstIterator& iterator) { ++iterator; } |
| 31 |
| 32 static const Element& GetValue(ConstIterator& iterator) { return *iterator; } |
| 33 }; |
| 34 |
| 35 template <> |
| 36 struct StructTraits<common::mojom::ListValueDataView, base::ListValue> { |
| 37 static const base::ListValue& values(const base::ListValue& value) { |
| 38 return value; |
| 39 } |
| 40 }; |
| 41 |
| 42 template <> |
| 43 struct StructTraits<common::mojom::ListValueDataView, |
| 44 std::unique_ptr<base::ListValue>> { |
| 45 static bool IsNull(const std::unique_ptr<base::ListValue>& value) { |
| 46 return !value; |
| 47 } |
| 48 |
| 49 static void SetToNull(std::unique_ptr<base::ListValue>* value) { |
| 50 value->reset(); |
| 51 } |
| 52 |
| 53 static const base::ListValue& values( |
| 54 const std::unique_ptr<base::ListValue>& value) { |
| 55 return *value; |
| 56 } |
| 57 |
| 58 static bool Read(common::mojom::ListValueDataView data, |
| 59 std::unique_ptr<base::ListValue>* value); |
| 60 }; |
| 61 |
| 62 template <> |
| 63 struct MapTraits<base::DictionaryValue> { |
| 64 using Key = std::string; |
| 65 using Value = base::Value; |
| 66 using Iterator = base::DictionaryValue::Iterator; |
| 67 |
| 68 static size_t GetSize(const base::DictionaryValue& input) { |
| 69 return input.size(); |
| 70 } |
| 71 |
| 72 static Iterator GetBegin(const base::DictionaryValue& input) { |
| 73 return Iterator(input); |
| 74 } |
| 75 |
| 76 static void AdvanceIterator(Iterator& iterator) { iterator.Advance(); } |
| 77 |
| 78 static const Key& GetKey(Iterator& iterator) { return iterator.key(); } |
| 79 |
| 80 static const Value& GetValue(Iterator& iterator) { return iterator.value(); } |
| 81 }; |
| 82 |
| 83 template <> |
| 84 struct StructTraits<common::mojom::DictionaryValueDataView, |
| 85 base::DictionaryValue> { |
| 86 static const base::DictionaryValue& values( |
| 87 const base::DictionaryValue& value) { |
| 88 return value; |
| 89 } |
| 90 }; |
| 91 |
| 92 template <> |
| 93 struct StructTraits<common::mojom::DictionaryValueDataView, |
| 94 std::unique_ptr<base::DictionaryValue>> { |
| 95 static bool IsNull(const std::unique_ptr<base::DictionaryValue>& value) { |
| 96 return !value; |
| 97 } |
| 98 |
| 99 static void SetToNull(std::unique_ptr<base::DictionaryValue>* value) { |
| 100 value->reset(); |
| 101 } |
| 102 |
| 103 static const base::DictionaryValue& values( |
| 104 const std::unique_ptr<base::DictionaryValue>& value) { |
| 105 return *value; |
| 106 } |
| 107 static bool Read(common::mojom::DictionaryValueDataView data, |
| 108 std::unique_ptr<base::DictionaryValue>* value); |
| 109 }; |
| 110 |
| 111 template <> |
| 112 struct UnionTraits<common::mojom::ValueDataView, base::Value> { |
| 113 static common::mojom::ValueDataView::Tag GetTag(const base::Value& data) { |
| 114 switch (data.GetType()) { |
| 115 case base::Value::Type::NONE: |
| 116 return common::mojom::ValueDataView::Tag::NULL_VALUE; |
| 117 case base::Value::Type::BOOLEAN: |
| 118 return common::mojom::ValueDataView::Tag::BOOL_VALUE; |
| 119 case base::Value::Type::INTEGER: |
| 120 return common::mojom::ValueDataView::Tag::INT_VALUE; |
| 121 case base::Value::Type::DOUBLE: |
| 122 return common::mojom::ValueDataView::Tag::DOUBLE_VALUE; |
| 123 case base::Value::Type::STRING: |
| 124 return common::mojom::ValueDataView::Tag::STRING_VALUE; |
| 125 case base::Value::Type::BINARY: |
| 126 return common::mojom::ValueDataView::Tag::BINARY_VALUE; |
| 127 case base::Value::Type::DICTIONARY: |
| 128 return common::mojom::ValueDataView::Tag::DICTIONARY_VALUE; |
| 129 case base::Value::Type::LIST: |
| 130 return common::mojom::ValueDataView::Tag::LIST_VALUE; |
| 131 } |
| 132 NOTREACHED(); |
| 133 return common::mojom::ValueDataView::Tag::NULL_VALUE; |
| 134 } |
| 135 |
| 136 static common::mojom::NullValuePtr null_value(const base::Value& value) { |
| 137 return common::mojom::NullValuePtr(); |
| 138 } |
| 139 |
| 140 static bool bool_value(const base::Value& value) { |
| 141 bool bool_value{}; |
| 142 if (!value.GetAsBoolean(&bool_value)) |
| 143 NOTREACHED(); |
| 144 return bool_value; |
| 145 } |
| 146 |
| 147 static int32_t int_value(const base::Value& value) { |
| 148 int int_value{}; |
| 149 if (!value.GetAsInteger(&int_value)) |
| 150 NOTREACHED(); |
| 151 return int_value; |
| 152 } |
| 153 |
| 154 static double double_value(const base::Value& value) { |
| 155 double double_value{}; |
| 156 if (!value.GetAsDouble(&double_value)) |
| 157 NOTREACHED(); |
| 158 return double_value; |
| 159 } |
| 160 |
| 161 static base::StringPiece string_value(const base::Value& value) { |
| 162 base::StringPiece string_piece; |
| 163 if (!value.GetAsString(&string_piece)) |
| 164 NOTREACHED(); |
| 165 return string_piece; |
| 166 } |
| 167 |
| 168 static mojo::ConstCArray<uint8_t> binary_value(const base::Value& value) { |
| 169 const base::BinaryValue* binary_value = nullptr; |
| 170 if (!value.GetAsBinary(&binary_value)) |
| 171 NOTREACHED(); |
| 172 return mojo::ConstCArray<uint8_t>( |
| 173 binary_value->GetSize(), |
| 174 reinterpret_cast<const uint8_t*>(binary_value->GetBuffer())); |
| 175 } |
| 176 |
| 177 static const base::ListValue& list_value(const base::Value& value) { |
| 178 const base::ListValue* list_value = nullptr; |
| 179 if (!value.GetAsList(&list_value)) |
| 180 NOTREACHED(); |
| 181 return *list_value; |
| 182 } |
| 183 static const base::DictionaryValue& dictionary_value( |
| 184 const base::Value& value) { |
| 185 const base::DictionaryValue* dictionary_value = nullptr; |
| 186 if (!value.GetAsDictionary(&dictionary_value)) |
| 187 NOTREACHED(); |
| 188 return *dictionary_value; |
| 189 } |
| 190 }; |
| 191 |
| 192 template <> |
| 193 struct UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>> { |
| 194 static bool IsNull(const std::unique_ptr<base::Value>& value) { |
| 195 return !value; |
| 196 } |
| 197 |
| 198 static void SetToNull(std::unique_ptr<base::Value>* value) { value->reset(); } |
| 199 |
| 200 static common::mojom::ValueDataView::Tag GetTag( |
| 201 const std::unique_ptr<base::Value>& value) { |
| 202 return UnionTraits<common::mojom::ValueDataView, base::Value>::GetTag( |
| 203 *value); |
| 204 } |
| 205 |
| 206 static common::mojom::NullValuePtr null_value( |
| 207 const std::unique_ptr<base::Value>& value) { |
| 208 return UnionTraits<common::mojom::ValueDataView, base::Value>::null_value( |
| 209 *value); |
| 210 } |
| 211 static bool bool_value(const std::unique_ptr<base::Value>& value) { |
| 212 return UnionTraits<common::mojom::ValueDataView, base::Value>::bool_value( |
| 213 *value); |
| 214 } |
| 215 static int32_t int_value(const std::unique_ptr<base::Value>& value) { |
| 216 return UnionTraits<common::mojom::ValueDataView, base::Value>::int_value( |
| 217 *value); |
| 218 } |
| 219 static double double_value(const std::unique_ptr<base::Value>& value) { |
| 220 return UnionTraits<common::mojom::ValueDataView, base::Value>::double_value( |
| 221 *value); |
| 222 } |
| 223 static base::StringPiece string_value( |
| 224 const std::unique_ptr<base::Value>& value) { |
| 225 return UnionTraits<common::mojom::ValueDataView, base::Value>::string_value( |
| 226 *value); |
| 227 } |
| 228 static mojo::ConstCArray<uint8_t> binary_value( |
| 229 const std::unique_ptr<base::Value>& value) { |
| 230 return UnionTraits<common::mojom::ValueDataView, base::Value>::binary_value( |
| 231 *value); |
| 232 } |
| 233 static const base::ListValue& list_value( |
| 234 const std::unique_ptr<base::Value>& value) { |
| 235 return UnionTraits<common::mojom::ValueDataView, base::Value>::list_value( |
| 236 *value); |
| 237 } |
| 238 static const base::DictionaryValue& dictionary_value( |
| 239 const std::unique_ptr<base::Value>& value) { |
| 240 return UnionTraits<common::mojom::ValueDataView, |
| 241 base::Value>::dictionary_value(*value); |
| 242 } |
| 243 |
| 244 static bool Read(common::mojom::ValueDataView data, |
| 245 std::unique_ptr<base::Value>* value); |
| 246 }; |
| 247 |
| 248 } // namespace mojo |
| 249 |
| 250 #endif // MOJO_COMMON_VALUES_STRUCT_TRAITS_H_ |
OLD | NEW |