Index: mojo/public/cpp/bindings/type_converter.h |
diff --git a/mojo/public/cpp/bindings/type_converter.h b/mojo/public/cpp/bindings/type_converter.h |
index 350fcf0be2bd38d59ce6305357e1503e45166b91..24c518c177fe24e9555cac936013fb7cf7ea88a7 100644 |
--- a/mojo/public/cpp/bindings/type_converter.h |
+++ b/mojo/public/cpp/bindings/type_converter.h |
@@ -44,25 +44,67 @@ namespace mojo { |
// |
// With the above TypeConverter defined, it is possible to write code like this: |
// |
-// void SomeFunction(const gfx::Point& pt); |
-// |
// void AcceptPoint(const geometry::Point& input) { |
// // With an explicit cast using the .To<> method. |
// gfx::Point pt = input.To<gfx::Point>(); |
// |
-// // With an implicit copy conversion: |
+// mojo::AllocationScope scope; |
+// // With an explicit cast using the static From() method. |
+// geometry::Point output = geometry::Point::From(pt); |
+// } |
+// |
+// More "direct" conversions can be enabled by adding the following macro to the |
+// TypeConverter specialization: |
+// MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION(); |
+// |
+// To be exact, this amcro enables: |
+// - converting constructor: |
+// T(const U& u, mojo::Buffer* buf = mojo::Buffer::current()); |
+// - assignment operator: |
+// T& operator=(const U& u); |
+// - conversion operator: |
+// operator U() const; |
+// |
+// If the macro is added to TypeConverter<geometry::Point, gfx::Point>, for |
+// example, it is possible to write code like this: |
+// |
+// void SomeFunction(const gfx::Point& pt); |
+// |
+// void AcceptPoint(const geometry::Point& input) { |
+// // Using the conversion operator. |
// SomeFunction(input); |
// |
// mojo::AllocationScope scope; |
-// // With an implicit copy conversion: |
-// geometry::Point output = pt; |
+// // Using the converting constructor. |
+// geometry::Point output_1(pt); |
+// |
+// geometry::Point output_2; |
+// // Using the assignment operator. |
+// output_2 = pt; |
// } |
// |
+// Although this macro is convenient, it makes conversions less obvious. Users |
+// may do conversions excessively without paying attention to the cost. So |
+// please use it wisely. |
template <typename T, typename U> class TypeConverter { |
// static T ConvertFrom(const U& input, Buffer* buf); |
// static U ConvertTo(const T& input); |
+ |
+ // Maybe: |
+ // MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION(); |
}; |
} // namespace mojo |
+#define MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION() \ |
+ typedef void AllowImplicitTypeConversion |
+ |
+// Fails compilation if MOJO_ALLOW_IMPLICIT_TYPE_CONVERSION() is not specified |
+// in TypeConverter<T, U>. |
+#define MOJO_INTERNAL_CHECK_ALLOW_IMPLICIT_TYPE_CONVERSION(T, U) \ |
+ do { \ |
+ typedef typename mojo::TypeConverter<T, U>::AllowImplicitTypeConversion \ |
+ FailedIfNotAllowed; \ |
+ } while (false) |
+ |
#endif // MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_ |