Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Unified Diff: mojo/common/values_struct_traits.h

Issue 2577563002: Add struct traits for base::Value. (Closed)
Patch Set: rebase Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/common/values.typemap ('k') | mojo/common/values_struct_traits.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/common/values_struct_traits.h
diff --git a/mojo/common/values_struct_traits.h b/mojo/common/values_struct_traits.h
new file mode 100644
index 0000000000000000000000000000000000000000..82d5696bee63e249f55d95320fd6684f0edf19a7
--- /dev/null
+++ b/mojo/common/values_struct_traits.h
@@ -0,0 +1,250 @@
+// Copyright 2016 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 MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
+#define MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
+
+#include "base/values.h"
+#include "mojo/common/values.mojom.h"
+#include "mojo/public/cpp/bindings/array_traits.h"
+#include "mojo/public/cpp/bindings/map_traits.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "mojo/public/cpp/bindings/union_traits.h"
+
+namespace mojo {
+
+template <>
+struct ArrayTraits<base::ListValue> {
+ using Element = std::unique_ptr<base::Value>;
+ using ConstIterator = base::ListValue::const_iterator;
+
+ static size_t GetSize(const base::ListValue& input) {
+ return input.GetSize();
+ }
+
+ static ConstIterator GetBegin(const base::ListValue& input) {
+ return input.begin();
+ }
+
+ static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
+
+ static const Element& GetValue(ConstIterator& iterator) { return *iterator; }
+};
+
+template <>
+struct StructTraits<common::mojom::ListValueDataView, base::ListValue> {
+ static const base::ListValue& values(const base::ListValue& value) {
+ return value;
+ }
+};
+
+template <>
+struct StructTraits<common::mojom::ListValueDataView,
+ std::unique_ptr<base::ListValue>> {
+ static bool IsNull(const std::unique_ptr<base::ListValue>& value) {
+ return !value;
+ }
+
+ static void SetToNull(std::unique_ptr<base::ListValue>* value) {
+ value->reset();
+ }
+
+ static const base::ListValue& values(
+ const std::unique_ptr<base::ListValue>& value) {
+ return *value;
+ }
+
+ static bool Read(common::mojom::ListValueDataView data,
+ std::unique_ptr<base::ListValue>* value);
+};
+
+template <>
+struct MapTraits<base::DictionaryValue> {
+ using Key = std::string;
+ using Value = base::Value;
+ using Iterator = base::DictionaryValue::Iterator;
+
+ static size_t GetSize(const base::DictionaryValue& input) {
+ return input.size();
+ }
+
+ static Iterator GetBegin(const base::DictionaryValue& input) {
+ return Iterator(input);
+ }
+
+ static void AdvanceIterator(Iterator& iterator) { iterator.Advance(); }
+
+ static const Key& GetKey(Iterator& iterator) { return iterator.key(); }
+
+ static const Value& GetValue(Iterator& iterator) { return iterator.value(); }
+};
+
+template <>
+struct StructTraits<common::mojom::DictionaryValueDataView,
+ base::DictionaryValue> {
+ static const base::DictionaryValue& values(
+ const base::DictionaryValue& value) {
+ return value;
+ }
+};
+
+template <>
+struct StructTraits<common::mojom::DictionaryValueDataView,
+ std::unique_ptr<base::DictionaryValue>> {
+ static bool IsNull(const std::unique_ptr<base::DictionaryValue>& value) {
+ return !value;
+ }
+
+ static void SetToNull(std::unique_ptr<base::DictionaryValue>* value) {
+ value->reset();
+ }
+
+ static const base::DictionaryValue& values(
+ const std::unique_ptr<base::DictionaryValue>& value) {
+ return *value;
+ }
+ static bool Read(common::mojom::DictionaryValueDataView data,
+ std::unique_ptr<base::DictionaryValue>* value);
+};
+
+template <>
+struct UnionTraits<common::mojom::ValueDataView, base::Value> {
+ static common::mojom::ValueDataView::Tag GetTag(const base::Value& data) {
+ switch (data.GetType()) {
+ case base::Value::Type::NONE:
+ return common::mojom::ValueDataView::Tag::NULL_VALUE;
+ case base::Value::Type::BOOLEAN:
+ return common::mojom::ValueDataView::Tag::BOOL_VALUE;
+ case base::Value::Type::INTEGER:
+ return common::mojom::ValueDataView::Tag::INT_VALUE;
+ case base::Value::Type::DOUBLE:
+ return common::mojom::ValueDataView::Tag::DOUBLE_VALUE;
+ case base::Value::Type::STRING:
+ return common::mojom::ValueDataView::Tag::STRING_VALUE;
+ case base::Value::Type::BINARY:
+ return common::mojom::ValueDataView::Tag::BINARY_VALUE;
+ case base::Value::Type::DICTIONARY:
+ return common::mojom::ValueDataView::Tag::DICTIONARY_VALUE;
+ case base::Value::Type::LIST:
+ return common::mojom::ValueDataView::Tag::LIST_VALUE;
+ }
+ NOTREACHED();
+ return common::mojom::ValueDataView::Tag::NULL_VALUE;
+ }
+
+ static common::mojom::NullValuePtr null_value(const base::Value& value) {
+ return common::mojom::NullValuePtr();
+ }
+
+ static bool bool_value(const base::Value& value) {
+ bool bool_value{};
+ if (!value.GetAsBoolean(&bool_value))
+ NOTREACHED();
+ return bool_value;
+ }
+
+ static int32_t int_value(const base::Value& value) {
+ int int_value{};
+ if (!value.GetAsInteger(&int_value))
+ NOTREACHED();
+ return int_value;
+ }
+
+ static double double_value(const base::Value& value) {
+ double double_value{};
+ if (!value.GetAsDouble(&double_value))
+ NOTREACHED();
+ return double_value;
+ }
+
+ static base::StringPiece string_value(const base::Value& value) {
+ base::StringPiece string_piece;
+ if (!value.GetAsString(&string_piece))
+ NOTREACHED();
+ return string_piece;
+ }
+
+ static mojo::ConstCArray<uint8_t> binary_value(const base::Value& value) {
+ const base::BinaryValue* binary_value = nullptr;
+ if (!value.GetAsBinary(&binary_value))
+ NOTREACHED();
+ return mojo::ConstCArray<uint8_t>(
+ binary_value->GetSize(),
+ reinterpret_cast<const uint8_t*>(binary_value->GetBuffer()));
+ }
+
+ static const base::ListValue& list_value(const base::Value& value) {
+ const base::ListValue* list_value = nullptr;
+ if (!value.GetAsList(&list_value))
+ NOTREACHED();
+ return *list_value;
+ }
+ static const base::DictionaryValue& dictionary_value(
+ const base::Value& value) {
+ const base::DictionaryValue* dictionary_value = nullptr;
+ if (!value.GetAsDictionary(&dictionary_value))
+ NOTREACHED();
+ return *dictionary_value;
+ }
+};
+
+template <>
+struct UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>> {
+ static bool IsNull(const std::unique_ptr<base::Value>& value) {
+ return !value;
+ }
+
+ static void SetToNull(std::unique_ptr<base::Value>* value) { value->reset(); }
+
+ static common::mojom::ValueDataView::Tag GetTag(
+ const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::GetTag(
+ *value);
+ }
+
+ static common::mojom::NullValuePtr null_value(
+ const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::null_value(
+ *value);
+ }
+ static bool bool_value(const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::bool_value(
+ *value);
+ }
+ static int32_t int_value(const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::int_value(
+ *value);
+ }
+ static double double_value(const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::double_value(
+ *value);
+ }
+ static base::StringPiece string_value(
+ const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::string_value(
+ *value);
+ }
+ static mojo::ConstCArray<uint8_t> binary_value(
+ const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::binary_value(
+ *value);
+ }
+ static const base::ListValue& list_value(
+ const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView, base::Value>::list_value(
+ *value);
+ }
+ static const base::DictionaryValue& dictionary_value(
+ const std::unique_ptr<base::Value>& value) {
+ return UnionTraits<common::mojom::ValueDataView,
+ base::Value>::dictionary_value(*value);
+ }
+
+ static bool Read(common::mojom::ValueDataView data,
+ std::unique_ptr<base::Value>* value);
+};
+
+} // namespace mojo
+
+#endif // MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
« no previous file with comments | « mojo/common/values.typemap ('k') | mojo/common/values_struct_traits.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698