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

// fidl_experiment = output_index_json

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

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace fidl {
namespace internal {

::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())),
  };
}

::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())),
  };
}

#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::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::SimpleProtocolAddResponse WireNaturalConversionTraits<::test_nullable::wire::SimpleProtocolAddResponse, ::test_nullable::SimpleProtocolAddResponse>::ToNatural(::test_nullable::wire::SimpleProtocolAddResponse src) {
  return ::test_nullable::SimpleProtocolAddResponse(WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.sum)));
}
::test_nullable::wire::SimpleProtocolAddResponse WireNaturalConversionTraits<::test_nullable::wire::SimpleProtocolAddResponse, ::test_nullable::SimpleProtocolAddResponse>::ToWire(fidl::AnyArena& arena, ::test_nullable::SimpleProtocolAddResponse src) {
  return ::test_nullable::wire::SimpleProtocolAddResponse{
      .sum = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.sum())),
  };
}

#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::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__

::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::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>, ::fidl::Box<::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>, ::fidl::Box<::test_nullable::Int32Wrapper>>::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<::fidl::WireOptional<::test_nullable::wire::SimpleUnion>, ::fidl::Box<::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<::fidl::WireOptional<::test_nullable::wire::SimpleUnion>, ::fidl::Box<::test_nullable::SimpleUnion>>::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())));
  }
}

#ifdef __Fuchsia__

::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::SimpleProtocolAddResponse, ::test_nullable::SimpleProtocolAddResponse>::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::SimpleProtocolAddResponse, ::test_nullable::SimpleProtocolAddResponse>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
