// WARNING: This file is machine generated by fidlgen.

#include <fidl/test.nullable/cpp/type_conversions.h>

namespace fidl {
namespace internal {

::test_nullable::StructWithNullableVector
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableVector,
                            ::test_nullable::StructWithNullableVector>::
    ToNatural(::test_nullable::wire::StructWithNullableVector src) {
  return ::test_nullable::StructWithNullableVector(
      WireNaturalConversionTraits<::fidl::VectorView<int32_t>,
                                  ::std::optional<::std::vector<int32_t>>>::
          ToNatural(std::move(src.val)));
}
::test_nullable::wire::StructWithNullableVector
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableVector,
                            ::test_nullable::StructWithNullableVector>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableVector src) {
  return ::test_nullable::wire::StructWithNullableVector{
      .val = WireNaturalConversionTraits<
          ::fidl::VectorView<int32_t>,
          ::std::optional<::std::vector<int32_t>>>::ToWire(arena,
                                                           std::move(
                                                               src.val())),
  };
}

::test_nullable::StructWithNullableUnion
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableUnion,
                            ::test_nullable::StructWithNullableUnion>::
    ToNatural(::test_nullable::wire::StructWithNullableUnion src) {
  return ::test_nullable::StructWithNullableUnion(
      WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleUnion,
          ::std::unique_ptr<::test_nullable::SimpleUnion>>::
          ToNatural(std::move(src.val)));
}
::test_nullable::wire::StructWithNullableUnion
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableUnion,
                            ::test_nullable::StructWithNullableUnion>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableUnion src) {
  return ::test_nullable::wire::StructWithNullableUnion{
      .val = WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleUnion,
          ::std::unique_ptr<::test_nullable::SimpleUnion>>::
          ToWire(arena, std::move(src.val())),
  };
}

::test_nullable::StructWithNullableStruct
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableStruct,
                            ::test_nullable::StructWithNullableStruct>::
    ToNatural(::test_nullable::wire::StructWithNullableStruct src) {
  return ::test_nullable::StructWithNullableStruct(
      WireNaturalConversionTraits<
          ::fidl::ObjectView<::test_nullable::wire::Int32Wrapper>,
          ::std::unique_ptr<::test_nullable::Int32Wrapper>>::
          ToNatural(std::move(src.val)));
}
::test_nullable::wire::StructWithNullableStruct
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableStruct,
                            ::test_nullable::StructWithNullableStruct>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableStruct src) {
  return ::test_nullable::wire::StructWithNullableStruct{
      .val = WireNaturalConversionTraits<
          ::fidl::ObjectView<::test_nullable::wire::Int32Wrapper>,
          ::std::unique_ptr<::test_nullable::Int32Wrapper>>::
          ToWire(arena, std::move(src.val())),
  };
}

::test_nullable::StructWithNullableString
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableString,
                            ::test_nullable::StructWithNullableString>::
    ToNatural(::test_nullable::wire::StructWithNullableString src) {
  return ::test_nullable::StructWithNullableString(
      WireNaturalConversionTraits<
          ::fidl::StringView,
          ::std::optional<::std::string>>::ToNatural(std::move(src.val)));
}
::test_nullable::wire::StructWithNullableString
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableString,
                            ::test_nullable::StructWithNullableString>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableString src) {
  return ::test_nullable::wire::StructWithNullableString{
      .val = WireNaturalConversionTraits<
          ::fidl::StringView,
          ::std::optional<::std::string>>::ToWire(arena, std::move(src.val())),
  };
}

#ifdef __Fuchsia__

::test_nullable::StructWithNullableRequest
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableRequest,
                            ::test_nullable::StructWithNullableRequest>::
    ToNatural(::test_nullable::wire::StructWithNullableRequest src) {
  return ::test_nullable::StructWithNullableRequest(
      WireNaturalConversionTraits<
          ::fidl::ServerEnd<::test_nullable::SimpleProtocol>,
          ::fidl::ServerEnd<::test_nullable::SimpleProtocol>>::
          ToNatural(std::move(src.val)));
}
::test_nullable::wire::StructWithNullableRequest
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableRequest,
                            ::test_nullable::StructWithNullableRequest>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableRequest src) {
  return ::test_nullable::wire::StructWithNullableRequest{
      .val = WireNaturalConversionTraits<
          ::fidl::ServerEnd<::test_nullable::SimpleProtocol>,
          ::fidl::ServerEnd<::test_nullable::SimpleProtocol>>::
          ToWire(arena, std::move(src.val())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

::test_nullable::StructWithNullableProtocol
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableProtocol,
                            ::test_nullable::StructWithNullableProtocol>::
    ToNatural(::test_nullable::wire::StructWithNullableProtocol src) {
  return ::test_nullable::StructWithNullableProtocol(
      WireNaturalConversionTraits<
          ::fidl::ClientEnd<::test_nullable::SimpleProtocol>,
          ::fidl::ClientEnd<::test_nullable::SimpleProtocol>>::
          ToNatural(std::move(src.val)));
}
::test_nullable::wire::StructWithNullableProtocol
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableProtocol,
                            ::test_nullable::StructWithNullableProtocol>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableProtocol src) {
  return ::test_nullable::wire::StructWithNullableProtocol{
      .val = WireNaturalConversionTraits<
          ::fidl::ClientEnd<::test_nullable::SimpleProtocol>,
          ::fidl::ClientEnd<::test_nullable::SimpleProtocol>>::
          ToWire(arena, std::move(src.val())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

::test_nullable::StructWithNullableHandle
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableHandle,
                            ::test_nullable::StructWithNullableHandle>::
    ToNatural(::test_nullable::wire::StructWithNullableHandle src) {
  return ::test_nullable::StructWithNullableHandle(
      WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(
          std::move(src.val)));
}
::test_nullable::wire::StructWithNullableHandle
WireNaturalConversionTraits<::test_nullable::wire::StructWithNullableHandle,
                            ::test_nullable::StructWithNullableHandle>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::StructWithNullableHandle src) {
  return ::test_nullable::wire::StructWithNullableHandle{
      .val = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(
          arena, std::move(src.val())),
  };
}

#endif  // __Fuchsia__

::test_nullable::SimpleProtocolAddTopResponse
WireNaturalConversionTraits<::test_nullable::wire::SimpleProtocolAddTopResponse,
                            ::test_nullable::SimpleProtocolAddTopResponse>::
    ToNatural(::test_nullable::wire::SimpleProtocolAddTopResponse src) {
  return ::test_nullable::SimpleProtocolAddTopResponse(
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(
          std::move(src.sum)));
}
::test_nullable::wire::SimpleProtocolAddTopResponse
WireNaturalConversionTraits<::test_nullable::wire::SimpleProtocolAddTopResponse,
                            ::test_nullable::SimpleProtocolAddTopResponse>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::SimpleProtocolAddTopResponse src) {
  return ::test_nullable::wire::SimpleProtocolAddTopResponse{
      .sum = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(
          arena, std::move(src.sum())),
  };
}

::test_nullable::SimpleProtocolAddRequest
WireNaturalConversionTraits<::test_nullable::wire::SimpleProtocolAddRequest,
                            ::test_nullable::SimpleProtocolAddRequest>::
    ToNatural(::test_nullable::wire::SimpleProtocolAddRequest src) {
  return ::test_nullable::SimpleProtocolAddRequest({
      .a = WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(
          std::move(src.a)),
      .b = WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(
          std::move(src.b)),
  });
}
::test_nullable::wire::SimpleProtocolAddRequest
WireNaturalConversionTraits<::test_nullable::wire::SimpleProtocolAddRequest,
                            ::test_nullable::SimpleProtocolAddRequest>::
    ToWire(fidl::AnyArena& arena,
           ::test_nullable::SimpleProtocolAddRequest src) {
  return ::test_nullable::wire::SimpleProtocolAddRequest{
      .a = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(
          arena, std::move(src.a())),
      .b = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(
          arena, std::move(src.b())),
  };
}

::test_nullable::Int32Wrapper WireNaturalConversionTraits<
    ::test_nullable::wire::Int32Wrapper, ::test_nullable::Int32Wrapper>::
    ToNatural(::test_nullable::wire::Int32Wrapper src) {
  return ::test_nullable::Int32Wrapper(
      WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(
          std::move(src.val)));
}
::test_nullable::wire::Int32Wrapper WireNaturalConversionTraits<
    ::test_nullable::wire::Int32Wrapper,
    ::test_nullable::Int32Wrapper>::ToWire(fidl::AnyArena& arena,
                                           ::test_nullable::Int32Wrapper src) {
  return ::test_nullable::wire::Int32Wrapper{
      .val = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(
          arena, std::move(src.val())),
  };
}

::test_nullable::SimpleUnion WireNaturalConversionTraits<
    ::test_nullable::wire::SimpleUnion,
    ::test_nullable::SimpleUnion>::ToNatural(::test_nullable::wire::SimpleUnion
                                                 src) {
  switch (src.Which()) {
    case ::test_nullable::wire::SimpleUnion::Tag::kA:
      return ::test_nullable::SimpleUnion::WithA(
          WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(
              std::move(src.a())));
    case ::test_nullable::wire::SimpleUnion::Tag::kB:
      return ::test_nullable::SimpleUnion::WithB(
          WireNaturalConversionTraits<float, float>::ToNatural(
              std::move(src.b())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_nullable::wire::SimpleUnion WireNaturalConversionTraits<
    ::test_nullable::wire::SimpleUnion,
    ::test_nullable::SimpleUnion>::ToWire(fidl::AnyArena& arena,
                                          ::test_nullable::SimpleUnion src) {
  switch (src.Which()) {
    case ::test_nullable::SimpleUnion::Tag::kA:
      return ::test_nullable::wire::SimpleUnion::WithA(
          WireNaturalConversionTraits<int32_t, int32_t>::ToWire(
              arena, std::move(src.a().value())));
    case ::test_nullable::SimpleUnion::Tag::kB:
      return ::test_nullable::wire::SimpleUnion::WithB(
          WireNaturalConversionTraits<float, float>::ToWire(
              arena, std::move(src.b().value())));
  }
}

std::unique_ptr<::test_nullable::SimpleUnion>
WireNaturalConversionTraits<::test_nullable::wire::SimpleUnion,
                            std::unique_ptr<::test_nullable::SimpleUnion>>::
    ToNatural(::test_nullable::wire::SimpleUnion src) {
  if (src.has_invalid_tag()) {
    return nullptr;
  }
  return std::make_unique<::test_nullable::SimpleUnion>(
      WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleUnion,
          ::test_nullable::SimpleUnion>::ToNatural(std::move(src)));
}
::test_nullable::wire::SimpleUnion
WireNaturalConversionTraits<::test_nullable::wire::SimpleUnion,
                            std::unique_ptr<::test_nullable::SimpleUnion>>::
    ToWire(fidl::AnyArena& arena,
           std::unique_ptr<::test_nullable::SimpleUnion> src) {
  if (!src) {
    return ::test_nullable::wire::SimpleUnion();
  }
  return WireNaturalConversionTraits<
      ::test_nullable::wire::SimpleUnion,
      ::test_nullable::SimpleUnion>::ToWire(arena, std::move(*src));
}

#ifdef __Fuchsia__

::fidl::Request<::test_nullable::SimpleProtocol::Add>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_nullable::SimpleProtocol::Add>,
    ::fidl::Request<::test_nullable::SimpleProtocol::Add>>::
    ToNatural(::fidl::WireRequest<::test_nullable::SimpleProtocol::Add> src) {
  return ::fidl::Request<::test_nullable::SimpleProtocol::Add>(
      WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleProtocolAddRequest,
          ::test_nullable::SimpleProtocolAddRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_nullable::SimpleProtocol::Add>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_nullable::SimpleProtocol::Add>,
    ::fidl::Request<::test_nullable::SimpleProtocol::Add>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_nullable::SimpleProtocol::Add> src) {
  return ::fidl::WireRequest<::test_nullable::SimpleProtocol::Add>(
      WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleProtocolAddRequest,
          ::test_nullable::SimpleProtocolAddRequest>::ToWire(arena,
                                                             std::move(src)));
}

::fidl::Response<::test_nullable::SimpleProtocol::Add>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>,
    ::fidl::Response<::test_nullable::SimpleProtocol::Add>>::
    ToNatural(::fidl::WireResponse<::test_nullable::SimpleProtocol::Add> src) {
  return ::fidl::Response<::test_nullable::SimpleProtocol::Add>(
      WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleProtocolAddTopResponse,
          ::test_nullable::SimpleProtocolAddTopResponse>::
          ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>,
    ::fidl::Response<::test_nullable::SimpleProtocol::Add>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<::test_nullable::SimpleProtocol::Add> src) {
  return ::fidl::WireResponse<::test_nullable::SimpleProtocol::Add>(
      WireNaturalConversionTraits<
          ::test_nullable::wire::SimpleProtocolAddTopResponse,
          ::test_nullable::SimpleProtocolAddTopResponse>::ToWire(arena,
                                                                 std::move(
                                                                     src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
