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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_struct::Simple WireNaturalConversionTraits<::test_struct::wire::Simple, ::test_struct::Simple>::ToNatural(::test_struct::wire::Simple src) {
  return ::test_struct::Simple{{
      .f1 = WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.f1)),
      .f2 = WireNaturalConversionTraits<bool, bool>::ToNatural(std::move(src.f2)),
  }};
}
::test_struct::wire::Simple WireNaturalConversionTraits<::test_struct::wire::Simple, ::test_struct::Simple>::ToWire(fidl::AnyArena& arena, ::test_struct::Simple src) {
  return ::test_struct::wire::Simple{
      .f1 = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.f1())),
      .f2 = WireNaturalConversionTraits<bool, bool>::ToWire(arena, std::move(src.f2())),
  };
}

::test_struct::BasicStruct WireNaturalConversionTraits<::test_struct::wire::BasicStruct, ::test_struct::BasicStruct>::ToNatural(::test_struct::wire::BasicStruct src) {
  return ::test_struct::BasicStruct{{
      .x = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.x)),
      .y = WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToNatural(std::move(src.y)),
  }};
}
::test_struct::wire::BasicStruct WireNaturalConversionTraits<::test_struct::wire::BasicStruct, ::test_struct::BasicStruct>::ToWire(fidl::AnyArena& arena, ::test_struct::BasicStruct src) {
  return ::test_struct::wire::BasicStruct{
      .x = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.x())),
      .y = WireNaturalConversionTraits<::fidl::StringView, ::std::string>::ToWire(arena, std::move(src.y())),
  };
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
