| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_ |
| #define MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_ |
| |
| #include <stddef.h> |
| #include <string.h> |
| |
| #include "mojo/public/cpp/bindings/lib/array_internal.h" |
| #include "mojo/public/cpp/bindings/lib/serialization_forward.h" |
| #include "mojo/public/cpp/bindings/lib/serialization_util.h" |
| #include "mojo/public/cpp/bindings/string_data_view.h" |
| #include "mojo/public/cpp/bindings/string_traits.h" |
| |
| namespace mojo { |
| namespace internal { |
| |
| template <typename MaybeConstUserType> |
| struct Serializer<StringDataView, MaybeConstUserType> { |
| using UserType = typename std::remove_const<MaybeConstUserType>::type; |
| using Traits = StringTraits<UserType>; |
| |
| static void Serialize(MaybeConstUserType& input, |
| Buffer* buffer, |
| String_Data::BufferWriter* writer, |
| SerializationContext* context) { |
| if (CallIsNullIfExists<Traits>(input)) |
| return; |
| |
| void* custom_context = CustomContextHelper<Traits>::SetUp(input, context); |
| const size_t size = CallWithContext(Traits::GetSize, input, custom_context); |
| writer->Allocate(size, buffer); |
| memcpy((*writer)->storage(), |
| CallWithContext(Traits::GetData, input, custom_context), size); |
| CustomContextHelper<Traits>::TearDown(input, custom_context); |
| } |
| |
| static bool Deserialize(String_Data* input, |
| UserType* output, |
| SerializationContext* context) { |
| if (!input) |
| return CallSetToNullIfExists<Traits>(output); |
| return Traits::Read(StringDataView(input, context), output); |
| } |
| }; |
| |
| } // namespace internal |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_ |