Index: mojo/public/cpp/bindings/lib/serialization_util.h |
diff --git a/mojo/public/cpp/bindings/lib/serialization_util.h b/mojo/public/cpp/bindings/lib/serialization_util.h |
index 8e926cc5e832803781cf6b8e9a026e4be8ced18f..aa5806722c65fb5feeb304c63330da90d8e495ef 100644 |
--- a/mojo/public/cpp/bindings/lib/serialization_util.h |
+++ b/mojo/public/cpp/bindings/lib/serialization_util.h |
@@ -102,20 +102,6 @@ inline void InterfaceDataToPointer(Interface_Data* input, |
input->version)); |
} |
-// TODO(yzshen): Unify StructTraits::Read*() methods and remove |
-// HasReadFromDataViewMethod. |
-template <typename T> |
-struct HasReadFromDataViewMethod { |
- template <typename U> |
- static char Test(decltype(U::ReadFromDataView)*); |
- template <typename U> |
- static int Test(...); |
- static const bool value = sizeof(Test<T>(0)) == sizeof(char); |
- |
- private: |
- EnsureTypeIsComplete<T> check_t_; |
-}; |
- |
template <typename T> |
struct HasIsNullMethod { |
template <typename U> |
@@ -143,6 +129,37 @@ template < |
bool CallIsNullIfExists(const UserType& input) { |
return false; |
} |
+template <typename T> |
+struct HasSetToNullMethod { |
+ template <typename U> |
+ static char Test(decltype(U::SetToNull)*); |
+ template <typename U> |
+ static int Test(...); |
+ static const bool value = sizeof(Test<T>(0)) == sizeof(char); |
+ |
+ private: |
+ EnsureTypeIsComplete<T> check_t_; |
+}; |
+ |
+template < |
+ typename Traits, |
+ typename UserType, |
+ typename std::enable_if<HasSetToNullMethod<Traits>::value>::type* = nullptr> |
+bool CallSetToNullIfExists(UserType* output) { |
+ Traits::SetToNull(output); |
+ return true; |
+} |
+ |
+template <typename Traits, |
+ typename UserType, |
+ typename std::enable_if<!HasSetToNullMethod<Traits>::value>::type* = |
+ nullptr> |
+bool CallSetToNullIfExists(UserType* output) { |
+ LOG(ERROR) << "A null value is received. But the Struct/Array/StringTraits " |
+ << "class doesn't define a SetToNull() function and therefore is " |
+ << "unable to deserialize the value."; |
+ return false; |
+} |
template <typename T> |
struct HasSetUpContextMethod { |