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

Side by Side Diff: mojo/public/cpp/bindings/array.h

Issue 209453003: Add support for mojo::TypeConverter to control how convenient conversion should be. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 MOJO_PUBLIC_CPP_BINDINGS_ARRAY_H_ 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_H_
7 7
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 13 matching lines...) Expand all
24 internal::TypeTraits<T>::kIsObject, 24 internal::TypeTraits<T>::kIsObject,
25 internal::TypeTraits<T>::kIsHandle> Traits_; 25 internal::TypeTraits<T>::kIsHandle> Traits_;
26 typedef typename Traits_::DataType Data; 26 typedef typename Traits_::DataType Data;
27 typedef typename Traits_::ConstRef ConstRef; 27 typedef typename Traits_::ConstRef ConstRef;
28 28
29 Array() : data_(NULL) { 29 Array() : data_(NULL) {
30 } 30 }
31 31
32 template <typename U> 32 template <typename U>
33 Array(const U& u, Buffer* buf = Buffer::current()) { 33 Array(const U& u, Buffer* buf = Buffer::current()) {
34 MOJO_INTERNAL_CHECK_ALLOW_IMPLICIT_TYPE_CONVERSION(Array<T>, U);
34 *this = TypeConverter<Array<T>,U>::ConvertFrom(u, buf); 35 *this = TypeConverter<Array<T>,U>::ConvertFrom(u, buf);
35 } 36 }
36 37
37 template <typename U> 38 template <typename U>
38 Array& operator=(const U& u) { 39 Array& operator=(const U& u) {
40 MOJO_INTERNAL_CHECK_ALLOW_IMPLICIT_TYPE_CONVERSION(Array<T>, U);
39 *this = TypeConverter<Array<T>,U>::ConvertFrom(u, Buffer::current()); 41 *this = TypeConverter<Array<T>,U>::ConvertFrom(u, Buffer::current());
40 return *this; 42 return *this;
41 } 43 }
42 44
43 template <typename U> 45 template <typename U>
44 operator U() const { 46 operator U() const {
47 MOJO_INTERNAL_CHECK_ALLOW_IMPLICIT_TYPE_CONVERSION(Array<T>, U);
45 return To<U>(); 48 return To<U>();
46 } 49 }
47 50
48 template <typename U> 51 template <typename U>
49 U To() const { 52 U To() const {
50 return TypeConverter<Array<T>,U>::ConvertTo(*this); 53 return TypeConverter<Array<T>,U>::ConvertTo(*this);
51 } 54 }
52 55
56 template <typename U>
57 static Array From(const U& u, Buffer* buf = Buffer::current()) {
58 return TypeConverter<Array<T>,U>::ConvertFrom(u, buf);
59 }
60
53 bool is_null() const { return !data_; } 61 bool is_null() const { return !data_; }
54 62
55 size_t size() const { return data_->size(); } 63 size_t size() const { return data_->size(); }
56 64
57 ConstRef at(size_t offset) const { 65 ConstRef at(size_t offset) const {
58 return Traits_::ToConstRef(data_->at(offset)); 66 return Traits_::ToConstRef(data_->at(offset));
59 } 67 }
60 ConstRef operator[](size_t offset) const { return at(offset); } 68 ConstRef operator[](size_t offset) const { return at(offset); }
61 69
62 // Provides a way to initialize an array element-by-element. 70 // Provides a way to initialize an array element-by-element.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 }; 106 };
99 107
100 // UTF-8 encoded 108 // UTF-8 encoded
101 typedef Array<char> String; 109 typedef Array<char> String;
102 110
103 template <> 111 template <>
104 class TypeConverter<String, std::string> { 112 class TypeConverter<String, std::string> {
105 public: 113 public:
106 static String ConvertFrom(const std::string& input, Buffer* buf); 114 static String ConvertFrom(const std::string& input, Buffer* buf);
107 static std::string ConvertTo(const String& input); 115 static std::string ConvertTo(const String& input);
116
117 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
108 }; 118 };
109 119
110 template <size_t N> 120 template <size_t N>
111 class TypeConverter<String, char[N]> { 121 class TypeConverter<String, char[N]> {
112 public: 122 public:
113 static String ConvertFrom(const char input[N], Buffer* buf) { 123 static String ConvertFrom(const char input[N], Buffer* buf) {
114 String::Builder result(N - 1, buf); 124 String::Builder result(N - 1, buf);
115 memcpy(&result[0], input, N - 1); 125 memcpy(&result[0], input, N - 1);
116 return result.Finish(); 126 return result.Finish();
117 } 127 }
128
129 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
118 }; 130 };
119 131
120 // Appease MSVC. 132 // Appease MSVC.
121 template <size_t N> 133 template <size_t N>
122 class TypeConverter<String, const char[N]> { 134 class TypeConverter<String, const char[N]> {
123 public: 135 public:
124 static String ConvertFrom(const char input[N], Buffer* buf) { 136 static String ConvertFrom(const char input[N], Buffer* buf) {
125 return TypeConverter<String, char[N]>::ConvertFrom(input, buf); 137 return TypeConverter<String, char[N]>::ConvertFrom(input, buf);
126 } 138 }
139
140 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
127 }; 141 };
128 142
129 template <> 143 template <>
130 class TypeConverter<String, const char*> { 144 class TypeConverter<String, const char*> {
131 public: 145 public:
132 static String ConvertFrom(const char* input, Buffer* buf); 146 static String ConvertFrom(const char* input, Buffer* buf);
133 // NOTE: |ConvertTo| explicitly not implemented since String is not null 147 // NOTE: |ConvertTo| explicitly not implemented since String is not null
134 // terminated (and may have embedded null bytes). 148 // terminated (and may have embedded null bytes).
149
150 MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
135 }; 151 };
136 152
137 template <typename T, typename E> 153 template <typename T, typename E>
138 class TypeConverter<Array<T>, std::vector<E> > { 154 class GenericArrayTypeConverter {
139 public: 155 public:
140 static Array<T> ConvertFrom(const std::vector<E>& input, Buffer* buf) { 156 static Array<T> ConvertFrom(const std::vector<E>& input, Buffer* buf) {
141 typename Array<T>::Builder result(input.size(), buf); 157 typename Array<T>::Builder result(input.size(), buf);
142 for (size_t i = 0; i < input.size(); ++i) 158 for (size_t i = 0; i < input.size(); ++i)
143 result[i] = TypeConverter<T, E>::ConvertFrom(input[i], buf); 159 result[i] = TypeConverter<T, E>::ConvertFrom(input[i], buf);
144 return result.Finish(); 160 return result.Finish();
145 } 161 }
146 static std::vector<E> ConvertTo(const Array<T>& input) { 162 static std::vector<E> ConvertTo(const Array<T>& input) {
147 std::vector<E> result; 163 std::vector<E> result;
148 if (!input.is_null()) { 164 if (!input.is_null()) {
149 result.resize(input.size()); 165 result.resize(input.size());
150 for (size_t i = 0; i < input.size(); ++i) 166 for (size_t i = 0; i < input.size(); ++i)
151 result[i] = TypeConverter<T, E>::ConvertTo(input[i]); 167 result[i] = TypeConverter<T, E>::ConvertTo(input[i]);
152 } 168 }
153 return result; 169 return result;
154 } 170 }
155 }; 171 };
156 172
173
174 // Implicit conversion is not enabled by default.
175 // If you would like to enable that for certain array types, you need to do
176 // specializations and specify MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION() yourself.
177 //
178 // EXAMPLE:
179 //
180 // namespace mojo {
181 // template <>
182 // class TypeConverter<Array<X>, std::vector<Y> >
183 // : public GenericArrayTypeConverter<X, Y> {
184 // public:
185 // MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION();
186 // };
187 // }
188 //
189 // Please see the comments of MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION() for more
190 // details.
191 template <typename T, typename E>
192 class TypeConverter<Array<T>, std::vector<E> >
193 : public GenericArrayTypeConverter<T, E> {
194 };
195
157 } // namespace mojo 196 } // namespace mojo
158 197
159 #endif // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_H_ 198 #endif // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_H_
OLDNEW
« no previous file with comments | « mojo/examples/pepper_container_app/type_converters.h ('k') | mojo/public/cpp/bindings/tests/sample_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698