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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

::test_inheritancewithrecursivedecl::ParentFirstRequest WireNaturalConversionTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, ::test_inheritancewithrecursivedecl::ParentFirstRequest>::ToNatural(::test_inheritancewithrecursivedecl::wire::ParentFirstRequest src) {
  return ::test_inheritancewithrecursivedecl::ParentFirstRequest(WireNaturalConversionTraits<::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>, ::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>>::ToNatural(std::move(src.request)));
}
::test_inheritancewithrecursivedecl::wire::ParentFirstRequest WireNaturalConversionTraits<::test_inheritancewithrecursivedecl::wire::ParentFirstRequest, ::test_inheritancewithrecursivedecl::ParentFirstRequest>::ToWire(fidl::AnyArena& arena, ::test_inheritancewithrecursivedecl::ParentFirstRequest src) {
  return ::test_inheritancewithrecursivedecl::wire::ParentFirstRequest{
      .request = WireNaturalConversionTraits<::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>, ::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>>::ToWire(arena, std::move(src.request())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

::test_inheritancewithrecursivedecl::ChildSecondRequest WireNaturalConversionTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest, ::test_inheritancewithrecursivedecl::ChildSecondRequest>::ToNatural(::test_inheritancewithrecursivedecl::wire::ChildSecondRequest src) {
  return ::test_inheritancewithrecursivedecl::ChildSecondRequest(WireNaturalConversionTraits<::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>, ::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>>::ToNatural(std::move(src.request)));
}
::test_inheritancewithrecursivedecl::wire::ChildSecondRequest WireNaturalConversionTraits<::test_inheritancewithrecursivedecl::wire::ChildSecondRequest, ::test_inheritancewithrecursivedecl::ChildSecondRequest>::ToWire(fidl::AnyArena& arena, ::test_inheritancewithrecursivedecl::ChildSecondRequest src) {
  return ::test_inheritancewithrecursivedecl::wire::ChildSecondRequest{
      .request = WireNaturalConversionTraits<::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>, ::fidl::ServerEnd<::test_inheritancewithrecursivedecl::Parent>>::ToWire(arena, std::move(src.request())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
