diff options
author | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-02 13:55:36 +0000 |
---|---|---|
committer | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-02 13:55:36 +0000 |
commit | c2a52bf823cd88df5b8e46f89ad7a4e7bc2e20ca (patch) | |
tree | 8dde85ad2cea3529a5f5baa30dfa0f3516c6688c /mojo/public | |
parent | 3620b73d2649e0974e810c05dc3d41d45ebe098f (diff) | |
download | chromium_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_declaration | 5 | ||||
-rw-r--r-- | mojo/public/bindings/lib/bindings.cc | 31 | ||||
-rw-r--r-- | mojo/public/bindings/lib/bindings.h | 32 | ||||
-rw-r--r-- | mojo/public/tests/bindings_type_conversion_unittest.cc | 16 |
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; |