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 4407de850d676ec73d9d76286846141968a71750..af37d9c914dc5d5f1eeefe6c555062376ddf8150 100644 |
--- a/mojo/public/cpp/bindings/lib/array_serialization.h |
+++ b/mojo/public/cpp/bindings/lib/array_serialization.h |
@@ -118,10 +118,20 @@ template <typename H> struct ArraySerializer<ScopedHandleBase<H>, H, true> { |
} |
}; |
-template <typename S> struct ArraySerializer<S, typename S::Data_*, true> { |
+template <typename S> |
+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; |
@@ -129,9 +139,9 @@ template <typename S> 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; |
@@ -143,7 +153,7 @@ template <typename S> struct ArraySerializer<S, typename S::Data_*, true> { |
} |
} |
static void DeserializeElements( |
- Array_Data<typename S::Data_*>* input, Array<S>* output) { |
+ Array_Data<S_Data*>* input, Array<S>* output) { |
Array<S> result(input->size()); |
for (size_t i = 0; i < input->size(); ++i) { |
S element; |
@@ -156,7 +166,10 @@ template <typename S> 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) { |
MOJO_COMPILE_ASSERT((IsSame<Params, NoValidateParams>::value), |
Struct_type_should_not_have_array_validate_params); |