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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

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

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

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
