summaryrefslogtreecommitdiffstats
path: root/mojo/public
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-02 13:55:36 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-02 13:55:36 +0000
commitc2a52bf823cd88df5b8e46f89ad7a4e7bc2e20ca (patch)
tree8dde85ad2cea3529a5f5baa30dfa0f3516c6688c /mojo/public
parent3620b73d2649e0974e810c05dc3d41d45ebe098f (diff)
downloadchromium_src-c2a52bf823cd88df5b8e46f89ad7a4e7bc2e20ca.zip
chromium_src-c2a52bf823cd88df5b8e46f89ad7a4e7bc2e20ca.tar.gz
chromium_src-c2a52bf823cd88df5b8e46f89ad7a4e7bc2e20ca.tar.bz2
Mojo: Add support for converting between mojo::String and base::StringPiece.
This CL also adds an implicit conversion operator to type U that works just like an explicit call to To<U>. This is to go along with the implicit conversion constructors on mojo::Array and generated class types. While discouraged by the style guide, I think this kind of implicit conversion will be very helpful at reducing code verbosity. It shouldn't be too dangerous either. Finally, I took this opportunity to de-inline specializations of SimilarityTraits where possible. BUG=324594 Review URL: https://codereview.chromium.org/98313002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238085 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo/public')
-rw-r--r--mojo/public/bindings/generators/cpp_templates/wrapper_class_declaration5
-rw-r--r--mojo/public/bindings/lib/bindings.cc31
-rw-r--r--mojo/public/bindings/lib/bindings.h32
-rw-r--r--mojo/public/tests/bindings_type_conversion_unittest.cc16
4 files changed, 65 insertions, 19 deletions
diff --git a/mojo/public/bindings/generators/cpp_templates/wrapper_class_declaration b/mojo/public/bindings/generators/cpp_templates/wrapper_class_declaration
index f399ddf..402039c 100644
--- a/mojo/public/bindings/generators/cpp_templates/wrapper_class_declaration
+++ b/mojo/public/bindings/generators/cpp_templates/wrapper_class_declaration
@@ -18,6 +18,11 @@ class $CLASS {
}
template <typename U>
+ operator U() const {
+ return To<U>();
+ }
+
+ template <typename U>
U To() const {
return mojo::SimilarityTraits<$CLASS,U>::CopyTo(*this);
}
diff --git a/mojo/public/bindings/lib/bindings.cc b/mojo/public/bindings/lib/bindings.cc
new file mode 100644
index 0000000..9f4d6fd
--- /dev/null
+++ b/mojo/public/bindings/lib/bindings.cc
@@ -0,0 +1,31 @@
+// Copyright 2013 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.
+
+#include "mojo/public/bindings/lib/bindings.h"
+
+namespace mojo {
+
+// static
+String SimilarityTraits<String, std::string>::CopyFrom(const std::string& input,
+ Buffer* buf) {
+ String::Builder result(input.size(), buf);
+ memcpy(&result[0], input.data(), input.size());
+ return result.Finish();
+}
+// static
+std::string SimilarityTraits<String, std::string>::CopyTo(const String& input) {
+ return input.is_null() ? std::string() :
+ std::string(&input[0], &input[0] + input.size());
+}
+
+// static
+String SimilarityTraits<String, const char*>::CopyFrom(const char* input,
+ Buffer* buf) {
+ size_t size = strlen(input);
+ String::Builder result(size, buf);
+ memcpy(&result[0], input, size);
+ return result.Finish();
+}
+
+} // namespace mojo
diff --git a/mojo/public/bindings/lib/bindings.h b/mojo/public/bindings/lib/bindings.h
index 3992ccf..db1c092 100644
--- a/mojo/public/bindings/lib/bindings.h
+++ b/mojo/public/bindings/lib/bindings.h
@@ -39,6 +39,11 @@ class Array {
}
template <typename U>
+ operator U() const {
+ return To<U>();
+ }
+
+ template <typename U>
U To() const {
return SimilarityTraits<Array<T>,U>::CopyTo(*this);
}
@@ -95,14 +100,8 @@ typedef Array<char> String;
template <>
class SimilarityTraits<String, std::string> {
public:
- static String CopyFrom(const std::string& input, Buffer* buf) {
- String::Builder result(input.size(), buf);
- memcpy(&result[0], input.data(), input.size());
- return result.Finish();
- }
- static std::string CopyTo(const String& input) {
- return std::string(&input[0], &input[0] + input.size());
- }
+ static String CopyFrom(const std::string& input, Buffer* buf);
+ static std::string CopyTo(const String& input);
};
template <size_t N>
@@ -127,12 +126,7 @@ class SimilarityTraits<String, const char[N]> {
template <>
class SimilarityTraits<String, const char*> {
public:
- static String CopyFrom(const char* input, Buffer* buf) {
- size_t size = strlen(input);
- String::Builder result(size, buf);
- memcpy(&result[0], input, size);
- return result.Finish();
- }
+ static String CopyFrom(const char* input, Buffer* buf);
// NOTE: |CopyTo| explicitly not implemented since String is not null
// terminated (and may have embedded null bytes).
};
@@ -147,14 +141,16 @@ class SimilarityTraits<Array<T>, std::vector<E> > {
return result.Finish();
}
static std::vector<E> CopyTo(const Array<T>& input) {
- std::vector<E> result(input.size());
- for (size_t i = 0; i < input.size(); ++i)
- result[i] = SimilarityTraits<T, E>::CopyTo(input[i]);
+ std::vector<E> result;
+ if (!input.is_null()) {
+ result.resize(input.size());
+ for (size_t i = 0; i < input.size(); ++i)
+ result[i] = SimilarityTraits<T, E>::CopyTo(input[i]);
+ }
return result;
}
};
-
} // namespace mojo
#endif // MOJO_PUBLIC_BINDINGS_LIB_BINDINGS_H_
diff --git a/mojo/public/tests/bindings_type_conversion_unittest.cc b/mojo/public/tests/bindings_type_conversion_unittest.cc
index 0c4a870..01050fa 100644
--- a/mojo/public/tests/bindings_type_conversion_unittest.cc
+++ b/mojo/public/tests/bindings_type_conversion_unittest.cc
@@ -83,6 +83,11 @@ TEST_F(BindingsTypeConversionTest, String) {
EXPECT_EQ(std::string(kText), c.To<std::string>());
}
+TEST_F(BindingsTypeConversionTest, String_Null) {
+ String a;
+ EXPECT_EQ(std::string(), a.To<std::string>());
+}
+
TEST_F(BindingsTypeConversionTest, String_ShallowCopy) {
AllocationScope scope;
@@ -129,6 +134,15 @@ TEST_F(BindingsTypeConversionTest, CustomSimilarityTraits) {
EXPECT_EQ(rect.height(), rect2.height());
}
+TEST_F(BindingsTypeConversionTest, CustomSimilarityTraits_Array_Null) {
+ Array<test_structs::Rect> rects;
+
+ std::vector<RedmondRect> redmond_rects =
+ rects.To<std::vector<RedmondRect> >();
+
+ EXPECT_TRUE(redmond_rects.empty());
+}
+
TEST_F(BindingsTypeConversionTest, CustomSimilarityTraits_Array) {
AllocationScope scope;
@@ -171,7 +185,7 @@ TEST_F(BindingsTypeConversionTest, CustomSimilarityTraits_Array) {
}
}
-TEST_F(BindingsTypeConversionTest, CustomSimilarityTraits_Array2) {
+TEST_F(BindingsTypeConversionTest, CustomSimilarityTraits_Nested) {
AllocationScope scope;
RedmondNamedRegion redmond_region;