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

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

namespace fidl {
namespace internal {

::test_inheritance::SuperFooTopResponse
WireNaturalConversionTraits<::test_inheritance::wire::SuperFooTopResponse,
                            ::test_inheritance::SuperFooTopResponse>::
    ToNatural(::test_inheritance::wire::SuperFooTopResponse src) {
  return ::test_inheritance::SuperFooTopResponse(
      WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(
          std::move(src.y)));
}
::test_inheritance::wire::SuperFooTopResponse
WireNaturalConversionTraits<::test_inheritance::wire::SuperFooTopResponse,
                            ::test_inheritance::SuperFooTopResponse>::
    ToWire(fidl::AnyArena& arena, ::test_inheritance::SuperFooTopResponse src) {
  return ::test_inheritance::wire::SuperFooTopResponse{
      .y = WireNaturalConversionTraits<int64_t, int64_t>::ToWire(
          arena, std::move(src.y())),
  };
}

::test_inheritance::SuperFooRequest
WireNaturalConversionTraits<::test_inheritance::wire::SuperFooRequest,
                            ::test_inheritance::SuperFooRequest>::
    ToNatural(::test_inheritance::wire::SuperFooRequest src) {
  return ::test_inheritance::SuperFooRequest(
      WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(
          std::move(src.s)));
}
::test_inheritance::wire::SuperFooRequest
WireNaturalConversionTraits<::test_inheritance::wire::SuperFooRequest,
                            ::test_inheritance::SuperFooRequest>::
    ToWire(fidl::AnyArena& arena, ::test_inheritance::SuperFooRequest src) {
  return ::test_inheritance::wire::SuperFooRequest{
      .s = WireNaturalConversionTraits<
          ::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.s())),
  };
}

#ifdef __Fuchsia__

::fidl::Request<::test_inheritance::Super::Foo>
WireNaturalConversionTraits<::fidl::WireRequest<::test_inheritance::Super::Foo>,
                            ::fidl::Request<::test_inheritance::Super::Foo>>::
    ToNatural(::fidl::WireRequest<::test_inheritance::Super::Foo> src) {
  return ::fidl::Request<::test_inheritance::Super::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooRequest,
          ::test_inheritance::SuperFooRequest>::ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_inheritance::Super::Foo>
WireNaturalConversionTraits<::fidl::WireRequest<::test_inheritance::Super::Foo>,
                            ::fidl::Request<::test_inheritance::Super::Foo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_inheritance::Super::Foo> src) {
  return ::fidl::WireRequest<::test_inheritance::Super::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooRequest,
          ::test_inheritance::SuperFooRequest>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_inheritance::Super::Foo> WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_inheritance::Super::Foo>,
    ::fidl::Response<::test_inheritance::Super::Foo>>::
    ToNatural(::fidl::WireResponse<::test_inheritance::Super::Foo> src) {
  return ::fidl::Response<::test_inheritance::Super::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooTopResponse,
          ::test_inheritance::SuperFooTopResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_inheritance::Super::Foo>
WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_inheritance::Super::Foo>,
    ::fidl::Response<::test_inheritance::Super::Foo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<::test_inheritance::Super::Foo> src) {
  return ::fidl::WireResponse<::test_inheritance::Super::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooTopResponse,
          ::test_inheritance::SuperFooTopResponse>::ToWire(arena,
                                                           std::move(src)));
}

::fidl::Request<::test_inheritance::Sub::Foo>
WireNaturalConversionTraits<::fidl::WireRequest<::test_inheritance::Sub::Foo>,
                            ::fidl::Request<::test_inheritance::Sub::Foo>>::
    ToNatural(::fidl::WireRequest<::test_inheritance::Sub::Foo> src) {
  return ::fidl::Request<::test_inheritance::Sub::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooRequest,
          ::test_inheritance::SuperFooRequest>::ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_inheritance::Sub::Foo>
WireNaturalConversionTraits<::fidl::WireRequest<::test_inheritance::Sub::Foo>,
                            ::fidl::Request<::test_inheritance::Sub::Foo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_inheritance::Sub::Foo> src) {
  return ::fidl::WireRequest<::test_inheritance::Sub::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooRequest,
          ::test_inheritance::SuperFooRequest>::ToWire(arena, std::move(src)));
}

::fidl::Response<::test_inheritance::Sub::Foo>
WireNaturalConversionTraits<::fidl::WireResponse<::test_inheritance::Sub::Foo>,
                            ::fidl::Response<::test_inheritance::Sub::Foo>>::
    ToNatural(::fidl::WireResponse<::test_inheritance::Sub::Foo> src) {
  return ::fidl::Response<::test_inheritance::Sub::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooTopResponse,
          ::test_inheritance::SuperFooTopResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_inheritance::Sub::Foo>
WireNaturalConversionTraits<::fidl::WireResponse<::test_inheritance::Sub::Foo>,
                            ::fidl::Response<::test_inheritance::Sub::Foo>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Response<::test_inheritance::Sub::Foo> src) {
  return ::fidl::WireResponse<::test_inheritance::Sub::Foo>(
      WireNaturalConversionTraits<
          ::test_inheritance::wire::SuperFooTopResponse,
          ::test_inheritance::SuperFooTopResponse>::ToWire(arena,
                                                           std::move(src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
