Index: mojo/public/cpp/bindings/lib/array_serialization.h |
diff --git a/mojo/public/cpp/bindings/lib/array_serialization.h b/mojo/public/cpp/bindings/lib/array_serialization.h |
index 41532388ac212a531c0a840eb6a544dcf3eb3fa8..e73553d89b39a6f2ba4142cd6e83ffec769a3acb 100644 |
--- a/mojo/public/cpp/bindings/lib/array_serialization.h |
+++ b/mojo/public/cpp/bindings/lib/array_serialization.h |
@@ -132,12 +132,20 @@ struct ArraySerializer<ScopedHandleBase<H>, H, true> { |
} |
}; |
+// This template must only apply to pointer mojo entity (structs and arrays). |
+// This is done by ensuring that WrapperTraits<S>::DataType is a pointer. |
template <typename S> |
-struct ArraySerializer<S, typename S::Data_*, true> { |
+struct ArraySerializer<S, |
+ typename internal::EnableIf< |
+ internal::IsPointer<typename internal::WrapperTraits< |
+ S>::DataType>::value, |
+ typename internal::WrapperTraits<S>::DataType>::type, |
+ true> { |
+ typedef typename internal::RemovePointer< |
+ typename internal::WrapperTraits<S>::DataType>::type S_Data; |
static size_t GetSerializedSize(const Array<S>& input) { |
- size_t size = |
- sizeof(Array_Data<typename S::Data_*>) + |
- input.size() * sizeof(internal::StructPointer<typename S::Data_>); |
+ size_t size = sizeof(Array_Data<S_Data*>) + |
+ input.size() * sizeof(internal::StructPointer<S_Data>); |
for (size_t i = 0; i < input.size(); ++i) |
size += GetSerializedSize_(input[i]); |
return size; |
@@ -145,9 +153,9 @@ struct ArraySerializer<S, typename S::Data_*, true> { |
template <bool element_is_nullable, typename ElementValidateParams> |
static void SerializeElements(Array<S> input, |
Buffer* buf, |
- Array_Data<typename S::Data_*>* output) { |
+ Array_Data<S_Data*>* output) { |
for (size_t i = 0; i < input.size(); ++i) { |
- typename S::Data_* element; |
+ S_Data* element; |
SerializeCaller<S, ElementValidateParams>::Run( |
input[i].Pass(), buf, &element); |
output->at(i) = element; |
@@ -158,7 +166,7 @@ struct ArraySerializer<S, typename S::Data_*, true> { |
"null in array expecting valid pointers", input.size(), i)); |
} |
} |
- static void DeserializeElements(Array_Data<typename S::Data_*>* input, |
+ static void DeserializeElements(Array_Data<S_Data*>* input, |
Array<S>* output) { |
Array<S> result(input->size()); |
for (size_t i = 0; i < input->size(); ++i) { |
@@ -172,7 +180,9 @@ struct ArraySerializer<S, typename S::Data_*, true> { |
private: |
template <typename T, typename Params> |
struct SerializeCaller { |
- static void Run(T input, Buffer* buf, typename T::Data_** output) { |
+ static void Run(T input, |
+ Buffer* buf, |
+ typename internal::WrapperTraits<T>::DataType* output) { |
static_assert((IsSame<Params, NoValidateParams>::value), |
"Struct type should not have array validate params"); |