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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_unionsandwich::SandwichUnionSize8Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize8Alignment4, ::test_unionsandwich::SandwichUnionSize8Alignment4>::ToNatural(::test_unionsandwich::wire::SandwichUnionSize8Alignment4 src) {
  return ::test_unionsandwich::SandwichUnionSize8Alignment4{{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.before)),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize8Alignment4, ::test_unionsandwich::UnionSize8Alignment4>::ToNatural(std::move(src.union_)),
      .after = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.after)),
  }};
}
::test_unionsandwich::wire::SandwichUnionSize8Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize8Alignment4, ::test_unionsandwich::SandwichUnionSize8Alignment4>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::SandwichUnionSize8Alignment4 src) {
  return ::test_unionsandwich::wire::SandwichUnionSize8Alignment4{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.before())),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize8Alignment4, ::test_unionsandwich::UnionSize8Alignment4>::ToWire(arena, std::move(src.union_())),
      .after = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.after())),
  };
}

::test_unionsandwich::SandwichUnionSize12Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize12Alignment4, ::test_unionsandwich::SandwichUnionSize12Alignment4>::ToNatural(::test_unionsandwich::wire::SandwichUnionSize12Alignment4 src) {
  return ::test_unionsandwich::SandwichUnionSize12Alignment4{{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.before)),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize12Alignment4, ::test_unionsandwich::UnionSize12Alignment4>::ToNatural(std::move(src.union_)),
      .after = WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(std::move(src.after)),
  }};
}
::test_unionsandwich::wire::SandwichUnionSize12Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize12Alignment4, ::test_unionsandwich::SandwichUnionSize12Alignment4>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::SandwichUnionSize12Alignment4 src) {
  return ::test_unionsandwich::wire::SandwichUnionSize12Alignment4{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.before())),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize12Alignment4, ::test_unionsandwich::UnionSize12Alignment4>::ToWire(arena, std::move(src.union_())),
      .after = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(arena, std::move(src.after())),
  };
}

::test_unionsandwich::StructSize16Alignment8 WireNaturalConversionTraits<::test_unionsandwich::wire::StructSize16Alignment8, ::test_unionsandwich::StructSize16Alignment8>::ToNatural(::test_unionsandwich::wire::StructSize16Alignment8 src) {
  return ::test_unionsandwich::StructSize16Alignment8{{
      .f1 = WireNaturalConversionTraits<uint64_t, uint64_t>::ToNatural(std::move(src.f1)),
      .f2 = WireNaturalConversionTraits<uint64_t, uint64_t>::ToNatural(std::move(src.f2)),
  }};
}
::test_unionsandwich::wire::StructSize16Alignment8 WireNaturalConversionTraits<::test_unionsandwich::wire::StructSize16Alignment8, ::test_unionsandwich::StructSize16Alignment8>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::StructSize16Alignment8 src) {
  return ::test_unionsandwich::wire::StructSize16Alignment8{
      .f1 = WireNaturalConversionTraits<uint64_t, uint64_t>::ToWire(arena, std::move(src.f1())),
      .f2 = WireNaturalConversionTraits<uint64_t, uint64_t>::ToWire(arena, std::move(src.f2())),
  };
}

::test_unionsandwich::SandwichUnionSize24Alignment8 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize24Alignment8, ::test_unionsandwich::SandwichUnionSize24Alignment8>::ToNatural(::test_unionsandwich::wire::SandwichUnionSize24Alignment8 src) {
  return ::test_unionsandwich::SandwichUnionSize24Alignment8{{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.before)),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize24Alignment8, ::test_unionsandwich::UnionSize24Alignment8>::ToNatural(std::move(src.union_)),
      .after = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.after)),
  }};
}
::test_unionsandwich::wire::SandwichUnionSize24Alignment8 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize24Alignment8, ::test_unionsandwich::SandwichUnionSize24Alignment8>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::SandwichUnionSize24Alignment8 src) {
  return ::test_unionsandwich::wire::SandwichUnionSize24Alignment8{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.before())),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize24Alignment8, ::test_unionsandwich::UnionSize24Alignment8>::ToWire(arena, std::move(src.union_())),
      .after = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.after())),
  };
}

::test_unionsandwich::SandwichUnionSize36Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize36Alignment4, ::test_unionsandwich::SandwichUnionSize36Alignment4>::ToNatural(::test_unionsandwich::wire::SandwichUnionSize36Alignment4 src) {
  return ::test_unionsandwich::SandwichUnionSize36Alignment4{{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.before)),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize36Alignment4, ::test_unionsandwich::UnionSize36Alignment4>::ToNatural(std::move(src.union_)),
      .after = WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.after)),
  }};
}
::test_unionsandwich::wire::SandwichUnionSize36Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::SandwichUnionSize36Alignment4, ::test_unionsandwich::SandwichUnionSize36Alignment4>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::SandwichUnionSize36Alignment4 src) {
  return ::test_unionsandwich::wire::SandwichUnionSize36Alignment4{
      .before = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.before())),
      .union_ = WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize36Alignment4, ::test_unionsandwich::UnionSize36Alignment4>::ToWire(arena, std::move(src.union_())),
      .after = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.after())),
  };
}

::test_unionsandwich::UnionSize8Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize8Alignment4, ::test_unionsandwich::UnionSize8Alignment4>::ToNatural(::test_unionsandwich::wire::UnionSize8Alignment4 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::wire::UnionSize8Alignment4::Tag::kVariant:
      return ::test_unionsandwich::UnionSize8Alignment4::WithVariant(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.variant())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unionsandwich::wire::UnionSize8Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize8Alignment4, ::test_unionsandwich::UnionSize8Alignment4>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::UnionSize8Alignment4 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::UnionSize8Alignment4::Tag::kVariant:
      return ::test_unionsandwich::wire::UnionSize8Alignment4::WithVariant(
          WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.variant().value())));
  }
}

::test_unionsandwich::UnionSize12Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize12Alignment4, ::test_unionsandwich::UnionSize12Alignment4>::ToNatural(::test_unionsandwich::wire::UnionSize12Alignment4 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::wire::UnionSize12Alignment4::Tag::kVariant:
      return ::test_unionsandwich::UnionSize12Alignment4::WithVariant(
          WireNaturalConversionTraits<::fidl::Array<uint8_t, 6>, ::std::array<uint8_t, 6>>::ToNatural(std::move(src.variant())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unionsandwich::wire::UnionSize12Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize12Alignment4, ::test_unionsandwich::UnionSize12Alignment4>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::UnionSize12Alignment4 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::UnionSize12Alignment4::Tag::kVariant:
      return ::test_unionsandwich::wire::UnionSize12Alignment4::WithVariant(arena,
                                                                            WireNaturalConversionTraits<::fidl::Array<uint8_t, 6>, ::std::array<uint8_t, 6>>::ToWire(arena, std::move(src.variant().value())));
  }
}

::test_unionsandwich::UnionSize24Alignment8 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize24Alignment8, ::test_unionsandwich::UnionSize24Alignment8>::ToNatural(::test_unionsandwich::wire::UnionSize24Alignment8 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::wire::UnionSize24Alignment8::Tag::kVariant:
      return ::test_unionsandwich::UnionSize24Alignment8::WithVariant(
          WireNaturalConversionTraits<::test_unionsandwich::wire::StructSize16Alignment8, ::test_unionsandwich::StructSize16Alignment8>::ToNatural(std::move(src.variant())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unionsandwich::wire::UnionSize24Alignment8 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize24Alignment8, ::test_unionsandwich::UnionSize24Alignment8>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::UnionSize24Alignment8 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::UnionSize24Alignment8::Tag::kVariant:
      return ::test_unionsandwich::wire::UnionSize24Alignment8::WithVariant(arena,
                                                                            WireNaturalConversionTraits<::test_unionsandwich::wire::StructSize16Alignment8, ::test_unionsandwich::StructSize16Alignment8>::ToWire(arena, std::move(src.variant().value())));
  }
}

::test_unionsandwich::UnionSize36Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize36Alignment4, ::test_unionsandwich::UnionSize36Alignment4>::ToNatural(::test_unionsandwich::wire::UnionSize36Alignment4 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::wire::UnionSize36Alignment4::Tag::kVariant:
      return ::test_unionsandwich::UnionSize36Alignment4::WithVariant(
          WireNaturalConversionTraits<::fidl::Array<uint8_t, 32>, ::std::array<uint8_t, 32>>::ToNatural(std::move(src.variant())));
    default:
      ZX_PANIC("unknown union tag in strict union");
  }
}
::test_unionsandwich::wire::UnionSize36Alignment4 WireNaturalConversionTraits<::test_unionsandwich::wire::UnionSize36Alignment4, ::test_unionsandwich::UnionSize36Alignment4>::ToWire(fidl::AnyArena& arena, ::test_unionsandwich::UnionSize36Alignment4 src) {
  switch (src.Which()) {
    case ::test_unionsandwich::UnionSize36Alignment4::Tag::kVariant:
      return ::test_unionsandwich::wire::UnionSize36Alignment4::WithVariant(arena,
                                                                            WireNaturalConversionTraits<::fidl::Array<uint8_t, 32>, ::std::array<uint8_t, 32>>::ToWire(arena, std::move(src.variant().value())));
  }
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
