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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_versions::Struct WireNaturalConversionTraits<::test_versions::wire::Struct, ::test_versions::Struct>::ToNatural(::test_versions::wire::Struct src) {
  return ::test_versions::Struct(WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.x)));
}
::test_versions::wire::Struct WireNaturalConversionTraits<::test_versions::wire::Struct, ::test_versions::Struct>::ToWire(fidl::AnyArena& arena, ::test_versions::Struct src) {
  return ::test_versions::wire::Struct{
      .x = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.x())),
  };
}

::test_versions::Table WireNaturalConversionTraits<::test_versions::wire::Table, ::test_versions::Table>::ToNatural(::test_versions::wire::Table src) {
  ::test_versions::Table dst;
  if (src.has_x()) {
    dst.x() =
        WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.x()));
  }

  return dst;
}
::test_versions::wire::Table WireNaturalConversionTraits<::test_versions::wire::Table, ::test_versions::Table>::ToWire(fidl::AnyArena& arena, ::test_versions::Table src) {
  auto builder = ::test_versions::wire::Table::Builder(arena);
  if (src.x().has_value()) {
    builder.x(
        WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.x().value())));
  }
  return builder.Build();
}

::test_versions::Union WireNaturalConversionTraits<::test_versions::wire::Union, ::test_versions::Union>::ToNatural(::test_versions::wire::Union src) {
  switch (src.Which()) {
    case ::test_versions::wire::Union::Tag::kX:
      return ::test_versions::Union::WithX(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.x())));
    default:
      return ::test_versions::Union(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{});
  }
}
::test_versions::wire::Union WireNaturalConversionTraits<::test_versions::wire::Union, ::test_versions::Union>::ToWire(fidl::AnyArena& arena, ::test_versions::Union src) {
  switch (src.Which()) {
    case ::test_versions::Union::Tag::kX:
      return ::test_versions::wire::Union::WithX(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.x().value())));
    default:
      return ::test_versions::wire::Union();
  }
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
