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

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

namespace fidl {
namespace internal {

::test_table::TableWithAttributes WireNaturalConversionTraits<::test_table::wire::TableWithAttributes, ::test_table::TableWithAttributes>::ToNatural(::test_table::wire::TableWithAttributes src) {
  ::test_table::TableWithAttributes dst;
  if (src.has_x()) {
    dst.x() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.x()));
  }

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

::test_table::SimpleTable WireNaturalConversionTraits<::test_table::wire::SimpleTable, ::test_table::SimpleTable>::ToNatural(::test_table::wire::SimpleTable src) {
  ::test_table::SimpleTable dst;
  if (src.has_x()) {
    dst.x() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.x()));
  }
  if (src.has_y()) {
    dst.y() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.y()));
  }

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

::test_table::ReverseOrdinalTable WireNaturalConversionTraits<::test_table::wire::ReverseOrdinalTable, ::test_table::ReverseOrdinalTable>::ToNatural(::test_table::wire::ReverseOrdinalTable src) {
  ::test_table::ReverseOrdinalTable dst;
  if (src.has_z()) {
    dst.z() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.z()));
  }
  if (src.has_y()) {
    dst.y() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.y()));
  }
  if (src.has_x()) {
    dst.x() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.x()));
  }

  return dst;
}
::test_table::wire::ReverseOrdinalTable WireNaturalConversionTraits<::test_table::wire::ReverseOrdinalTable, ::test_table::ReverseOrdinalTable>::ToWire(fidl::AnyArena& arena, ::test_table::ReverseOrdinalTable src) {
  auto builder = ::test_table::wire::ReverseOrdinalTable::Builder(arena);
  if (src.z().has_value()) {
    builder.z(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.z().value())));
  }
  if (src.y().has_value()) {
    builder.y(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.y().value())));
  }
  if (src.x().has_value()) {
    builder.x(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.x().value())));
  }
  return builder.Build();
}

::test_table::OlderSimpleTable WireNaturalConversionTraits<::test_table::wire::OlderSimpleTable, ::test_table::OlderSimpleTable>::ToNatural(::test_table::wire::OlderSimpleTable src) {
  ::test_table::OlderSimpleTable dst;
  if (src.has_x()) {
    dst.x() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.x()));
  }

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

::test_table::NewerSimpleTable WireNaturalConversionTraits<::test_table::wire::NewerSimpleTable, ::test_table::NewerSimpleTable>::ToNatural(::test_table::wire::NewerSimpleTable src) {
  ::test_table::NewerSimpleTable dst;
  if (src.has_x()) {
    dst.x() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.x()));
  }
  if (src.has_y()) {
    dst.y() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.y()));
  }
  if (src.has_z()) {
    dst.z() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.z()));
  }

  return dst;
}
::test_table::wire::NewerSimpleTable WireNaturalConversionTraits<::test_table::wire::NewerSimpleTable, ::test_table::NewerSimpleTable>::ToWire(fidl::AnyArena& arena, ::test_table::NewerSimpleTable src) {
  auto builder = ::test_table::wire::NewerSimpleTable::Builder(arena);
  if (src.x().has_value()) {
    builder.x(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.x().value())));
  }
  if (src.y().has_value()) {
    builder.y(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.y().value())));
  }
  if (src.z().has_value()) {
    builder.z(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.z().value())));
  }
  return builder.Build();
}

::test_table::ExtensionTable WireNaturalConversionTraits<::test_table::wire::ExtensionTable, ::test_table::ExtensionTable>::ToNatural(::test_table::wire::ExtensionTable src) {
  ::test_table::ExtensionTable dst;

  return dst;
}
::test_table::wire::ExtensionTable WireNaturalConversionTraits<::test_table::wire::ExtensionTable, ::test_table::ExtensionTable>::ToWire(fidl::AnyArena& arena, ::test_table::ExtensionTable src) {
  auto builder = ::test_table::wire::ExtensionTable::Builder(arena);
  return builder.Build();
}

::test_table::SixtyFourOrdinalTable WireNaturalConversionTraits<::test_table::wire::SixtyFourOrdinalTable, ::test_table::SixtyFourOrdinalTable>::ToNatural(::test_table::wire::SixtyFourOrdinalTable src) {
  ::test_table::SixtyFourOrdinalTable dst;
  if (src.has_v1()) {
    dst.v1() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v1()));
  }
  if (src.has_v2()) {
    dst.v2() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v2()));
  }
  if (src.has_v3()) {
    dst.v3() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v3()));
  }
  if (src.has_v4()) {
    dst.v4() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v4()));
  }
  if (src.has_v5()) {
    dst.v5() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v5()));
  }
  if (src.has_v6()) {
    dst.v6() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v6()));
  }
  if (src.has_v7()) {
    dst.v7() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v7()));
  }
  if (src.has_v8()) {
    dst.v8() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v8()));
  }
  if (src.has_v9()) {
    dst.v9() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v9()));
  }
  if (src.has_v10()) {
    dst.v10() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v10()));
  }
  if (src.has_v11()) {
    dst.v11() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v11()));
  }
  if (src.has_v12()) {
    dst.v12() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v12()));
  }
  if (src.has_v13()) {
    dst.v13() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v13()));
  }
  if (src.has_v14()) {
    dst.v14() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v14()));
  }
  if (src.has_v15()) {
    dst.v15() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v15()));
  }
  if (src.has_v16()) {
    dst.v16() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v16()));
  }
  if (src.has_v17()) {
    dst.v17() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v17()));
  }
  if (src.has_v18()) {
    dst.v18() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v18()));
  }
  if (src.has_v19()) {
    dst.v19() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v19()));
  }
  if (src.has_v20()) {
    dst.v20() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v20()));
  }
  if (src.has_v21()) {
    dst.v21() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v21()));
  }
  if (src.has_v22()) {
    dst.v22() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v22()));
  }
  if (src.has_v23()) {
    dst.v23() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v23()));
  }
  if (src.has_v24()) {
    dst.v24() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v24()));
  }
  if (src.has_v25()) {
    dst.v25() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v25()));
  }
  if (src.has_v26()) {
    dst.v26() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v26()));
  }
  if (src.has_v27()) {
    dst.v27() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v27()));
  }
  if (src.has_v28()) {
    dst.v28() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v28()));
  }
  if (src.has_v29()) {
    dst.v29() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v29()));
  }
  if (src.has_v30()) {
    dst.v30() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v30()));
  }
  if (src.has_v31()) {
    dst.v31() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v31()));
  }
  if (src.has_v32()) {
    dst.v32() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v32()));
  }
  if (src.has_v33()) {
    dst.v33() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v33()));
  }
  if (src.has_v34()) {
    dst.v34() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v34()));
  }
  if (src.has_v35()) {
    dst.v35() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v35()));
  }
  if (src.has_v36()) {
    dst.v36() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v36()));
  }
  if (src.has_v37()) {
    dst.v37() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v37()));
  }
  if (src.has_v38()) {
    dst.v38() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v38()));
  }
  if (src.has_v39()) {
    dst.v39() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v39()));
  }
  if (src.has_v40()) {
    dst.v40() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v40()));
  }
  if (src.has_v41()) {
    dst.v41() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v41()));
  }
  if (src.has_v42()) {
    dst.v42() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v42()));
  }
  if (src.has_v43()) {
    dst.v43() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v43()));
  }
  if (src.has_v44()) {
    dst.v44() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v44()));
  }
  if (src.has_v45()) {
    dst.v45() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v45()));
  }
  if (src.has_v46()) {
    dst.v46() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v46()));
  }
  if (src.has_v47()) {
    dst.v47() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v47()));
  }
  if (src.has_v48()) {
    dst.v48() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v48()));
  }
  if (src.has_v49()) {
    dst.v49() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v49()));
  }
  if (src.has_v50()) {
    dst.v50() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v50()));
  }
  if (src.has_v51()) {
    dst.v51() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v51()));
  }
  if (src.has_v52()) {
    dst.v52() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v52()));
  }
  if (src.has_v53()) {
    dst.v53() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v53()));
  }
  if (src.has_v54()) {
    dst.v54() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v54()));
  }
  if (src.has_v55()) {
    dst.v55() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v55()));
  }
  if (src.has_v56()) {
    dst.v56() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v56()));
  }
  if (src.has_v57()) {
    dst.v57() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v57()));
  }
  if (src.has_v58()) {
    dst.v58() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v58()));
  }
  if (src.has_v59()) {
    dst.v59() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v59()));
  }
  if (src.has_v60()) {
    dst.v60() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v60()));
  }
  if (src.has_v61()) {
    dst.v61() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v61()));
  }
  if (src.has_v62()) {
    dst.v62() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v62()));
  }
  if (src.has_v63()) {
    dst.v63() =
        WireNaturalConversionTraits<int64_t, int64_t>::ToNatural(std::move(src.v63()));
  }
  if (src.has_v64()) {
    dst.v64() =
        WireNaturalConversionTraits<::test_table::wire::ExtensionTable, ::test_table::ExtensionTable>::ToNatural(std::move(src.v64()));
  }

  return dst;
}
::test_table::wire::SixtyFourOrdinalTable WireNaturalConversionTraits<::test_table::wire::SixtyFourOrdinalTable, ::test_table::SixtyFourOrdinalTable>::ToWire(fidl::AnyArena& arena, ::test_table::SixtyFourOrdinalTable src) {
  auto builder = ::test_table::wire::SixtyFourOrdinalTable::Builder(arena);
  if (src.v1().has_value()) {
    builder.v1(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v1().value())));
  }
  if (src.v2().has_value()) {
    builder.v2(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v2().value())));
  }
  if (src.v3().has_value()) {
    builder.v3(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v3().value())));
  }
  if (src.v4().has_value()) {
    builder.v4(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v4().value())));
  }
  if (src.v5().has_value()) {
    builder.v5(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v5().value())));
  }
  if (src.v6().has_value()) {
    builder.v6(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v6().value())));
  }
  if (src.v7().has_value()) {
    builder.v7(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v7().value())));
  }
  if (src.v8().has_value()) {
    builder.v8(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v8().value())));
  }
  if (src.v9().has_value()) {
    builder.v9(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v9().value())));
  }
  if (src.v10().has_value()) {
    builder.v10(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v10().value())));
  }
  if (src.v11().has_value()) {
    builder.v11(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v11().value())));
  }
  if (src.v12().has_value()) {
    builder.v12(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v12().value())));
  }
  if (src.v13().has_value()) {
    builder.v13(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v13().value())));
  }
  if (src.v14().has_value()) {
    builder.v14(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v14().value())));
  }
  if (src.v15().has_value()) {
    builder.v15(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v15().value())));
  }
  if (src.v16().has_value()) {
    builder.v16(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v16().value())));
  }
  if (src.v17().has_value()) {
    builder.v17(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v17().value())));
  }
  if (src.v18().has_value()) {
    builder.v18(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v18().value())));
  }
  if (src.v19().has_value()) {
    builder.v19(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v19().value())));
  }
  if (src.v20().has_value()) {
    builder.v20(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v20().value())));
  }
  if (src.v21().has_value()) {
    builder.v21(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v21().value())));
  }
  if (src.v22().has_value()) {
    builder.v22(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v22().value())));
  }
  if (src.v23().has_value()) {
    builder.v23(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v23().value())));
  }
  if (src.v24().has_value()) {
    builder.v24(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v24().value())));
  }
  if (src.v25().has_value()) {
    builder.v25(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v25().value())));
  }
  if (src.v26().has_value()) {
    builder.v26(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v26().value())));
  }
  if (src.v27().has_value()) {
    builder.v27(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v27().value())));
  }
  if (src.v28().has_value()) {
    builder.v28(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v28().value())));
  }
  if (src.v29().has_value()) {
    builder.v29(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v29().value())));
  }
  if (src.v30().has_value()) {
    builder.v30(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v30().value())));
  }
  if (src.v31().has_value()) {
    builder.v31(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v31().value())));
  }
  if (src.v32().has_value()) {
    builder.v32(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v32().value())));
  }
  if (src.v33().has_value()) {
    builder.v33(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v33().value())));
  }
  if (src.v34().has_value()) {
    builder.v34(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v34().value())));
  }
  if (src.v35().has_value()) {
    builder.v35(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v35().value())));
  }
  if (src.v36().has_value()) {
    builder.v36(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v36().value())));
  }
  if (src.v37().has_value()) {
    builder.v37(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v37().value())));
  }
  if (src.v38().has_value()) {
    builder.v38(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v38().value())));
  }
  if (src.v39().has_value()) {
    builder.v39(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v39().value())));
  }
  if (src.v40().has_value()) {
    builder.v40(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v40().value())));
  }
  if (src.v41().has_value()) {
    builder.v41(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v41().value())));
  }
  if (src.v42().has_value()) {
    builder.v42(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v42().value())));
  }
  if (src.v43().has_value()) {
    builder.v43(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v43().value())));
  }
  if (src.v44().has_value()) {
    builder.v44(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v44().value())));
  }
  if (src.v45().has_value()) {
    builder.v45(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v45().value())));
  }
  if (src.v46().has_value()) {
    builder.v46(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v46().value())));
  }
  if (src.v47().has_value()) {
    builder.v47(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v47().value())));
  }
  if (src.v48().has_value()) {
    builder.v48(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v48().value())));
  }
  if (src.v49().has_value()) {
    builder.v49(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v49().value())));
  }
  if (src.v50().has_value()) {
    builder.v50(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v50().value())));
  }
  if (src.v51().has_value()) {
    builder.v51(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v51().value())));
  }
  if (src.v52().has_value()) {
    builder.v52(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v52().value())));
  }
  if (src.v53().has_value()) {
    builder.v53(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v53().value())));
  }
  if (src.v54().has_value()) {
    builder.v54(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v54().value())));
  }
  if (src.v55().has_value()) {
    builder.v55(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v55().value())));
  }
  if (src.v56().has_value()) {
    builder.v56(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v56().value())));
  }
  if (src.v57().has_value()) {
    builder.v57(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v57().value())));
  }
  if (src.v58().has_value()) {
    builder.v58(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v58().value())));
  }
  if (src.v59().has_value()) {
    builder.v59(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v59().value())));
  }
  if (src.v60().has_value()) {
    builder.v60(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v60().value())));
  }
  if (src.v61().has_value()) {
    builder.v61(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v61().value())));
  }
  if (src.v62().has_value()) {
    builder.v62(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v62().value())));
  }
  if (src.v63().has_value()) {
    builder.v63(
        WireNaturalConversionTraits<int64_t, int64_t>::ToWire(arena, std::move(src.v63().value())));
  }
  if (src.v64().has_value()) {
    builder.v64(
        WireNaturalConversionTraits<::test_table::wire::ExtensionTable, ::test_table::ExtensionTable>::ToWire(arena, std::move(src.v64().value())));
  }
  return builder.Build();
}

::test_table::EmptyTable WireNaturalConversionTraits<::test_table::wire::EmptyTable, ::test_table::EmptyTable>::ToNatural(::test_table::wire::EmptyTable src) {
  ::test_table::EmptyTable dst;

  return dst;
}
::test_table::wire::EmptyTable WireNaturalConversionTraits<::test_table::wire::EmptyTable, ::test_table::EmptyTable>::ToWire(fidl::AnyArena& arena, ::test_table::EmptyTable src) {
  auto builder = ::test_table::wire::EmptyTable::Builder(arena);
  return builder.Build();
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
