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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.unionsandwich/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/cpp/wire/service_handler.h>
#include <test/unionsandwich/cpp/fidl.h>

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

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize8Alignment4> {
  using HLCPPType = ::test::unionsandwich::SandwichUnionSize8Alignment4;
  static inline ::test::unionsandwich::SandwichUnionSize8Alignment4 Convert(::test_unionsandwich::SandwichUnionSize8Alignment4&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize8Alignment4> {
  using NaturalType = ::test_unionsandwich::SandwichUnionSize8Alignment4;
  static inline ::test_unionsandwich::SandwichUnionSize8Alignment4 Convert(::test::unionsandwich::SandwichUnionSize8Alignment4&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize12Alignment4> {
  using HLCPPType = ::test::unionsandwich::SandwichUnionSize12Alignment4;
  static inline ::test::unionsandwich::SandwichUnionSize12Alignment4 Convert(::test_unionsandwich::SandwichUnionSize12Alignment4&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize12Alignment4> {
  using NaturalType = ::test_unionsandwich::SandwichUnionSize12Alignment4;
  static inline ::test_unionsandwich::SandwichUnionSize12Alignment4 Convert(::test::unionsandwich::SandwichUnionSize12Alignment4&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::StructSize16Alignment8> {
  using HLCPPType = ::test::unionsandwich::StructSize16Alignment8;
  static inline ::test::unionsandwich::StructSize16Alignment8 Convert(::test_unionsandwich::StructSize16Alignment8&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::StructSize16Alignment8> {
  using NaturalType = ::test_unionsandwich::StructSize16Alignment8;
  static inline ::test_unionsandwich::StructSize16Alignment8 Convert(::test::unionsandwich::StructSize16Alignment8&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize24Alignment8> {
  using HLCPPType = ::test::unionsandwich::SandwichUnionSize24Alignment8;
  static inline ::test::unionsandwich::SandwichUnionSize24Alignment8 Convert(::test_unionsandwich::SandwichUnionSize24Alignment8&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize24Alignment8> {
  using NaturalType = ::test_unionsandwich::SandwichUnionSize24Alignment8;
  static inline ::test_unionsandwich::SandwichUnionSize24Alignment8 Convert(::test::unionsandwich::SandwichUnionSize24Alignment8&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize36Alignment4> {
  using HLCPPType = ::test::unionsandwich::SandwichUnionSize36Alignment4;
  static inline ::test::unionsandwich::SandwichUnionSize36Alignment4 Convert(::test_unionsandwich::SandwichUnionSize36Alignment4&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize36Alignment4> {
  using NaturalType = ::test_unionsandwich::SandwichUnionSize36Alignment4;
  static inline ::test_unionsandwich::SandwichUnionSize36Alignment4 Convert(::test::unionsandwich::SandwichUnionSize36Alignment4&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::UnionSize8Alignment4> {
  using HLCPPType = ::test::unionsandwich::UnionSize8Alignment4;
  static inline ::test::unionsandwich::UnionSize8Alignment4 Convert(::test_unionsandwich::UnionSize8Alignment4&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::UnionSize8Alignment4> {
  using NaturalType = ::test_unionsandwich::UnionSize8Alignment4;
  static inline ::test_unionsandwich::UnionSize8Alignment4 Convert(::test::unionsandwich::UnionSize8Alignment4&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::UnionSize12Alignment4> {
  using HLCPPType = ::test::unionsandwich::UnionSize12Alignment4;
  static inline ::test::unionsandwich::UnionSize12Alignment4 Convert(::test_unionsandwich::UnionSize12Alignment4&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::UnionSize12Alignment4> {
  using NaturalType = ::test_unionsandwich::UnionSize12Alignment4;
  static inline ::test_unionsandwich::UnionSize12Alignment4 Convert(::test::unionsandwich::UnionSize12Alignment4&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::UnionSize24Alignment8> {
  using HLCPPType = ::test::unionsandwich::UnionSize24Alignment8;
  static inline ::test::unionsandwich::UnionSize24Alignment8 Convert(::test_unionsandwich::UnionSize24Alignment8&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::UnionSize24Alignment8> {
  using NaturalType = ::test_unionsandwich::UnionSize24Alignment8;
  static inline ::test_unionsandwich::UnionSize24Alignment8 Convert(::test::unionsandwich::UnionSize24Alignment8&&);
};
template <>
struct NaturalToHLCPPTraits<::test_unionsandwich::UnionSize36Alignment4> {
  using HLCPPType = ::test::unionsandwich::UnionSize36Alignment4;
  static inline ::test::unionsandwich::UnionSize36Alignment4 Convert(::test_unionsandwich::UnionSize36Alignment4&&);
};
template <>
struct HLCPPToNaturalTraits<::test::unionsandwich::UnionSize36Alignment4> {
  using NaturalType = ::test_unionsandwich::UnionSize36Alignment4;
  static inline ::test_unionsandwich::UnionSize36Alignment4 Convert(::test::unionsandwich::UnionSize36Alignment4&&);
};

::test::unionsandwich::SandwichUnionSize8Alignment4 NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize8Alignment4>::Convert(::test_unionsandwich::SandwichUnionSize8Alignment4&& value) {
  ::test::unionsandwich::SandwichUnionSize8Alignment4 hlcpp;
  hlcpp.before = ::fidl::NaturalToHLCPP(std::move(value.before()));
  hlcpp.union_ = ::fidl::NaturalToHLCPP(std::move(value.union_()));
  hlcpp.after = ::fidl::NaturalToHLCPP(std::move(value.after()));
  return hlcpp;
}

::test_unionsandwich::SandwichUnionSize8Alignment4 HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize8Alignment4>::Convert(::test::unionsandwich::SandwichUnionSize8Alignment4&& value) {
  return ::test_unionsandwich::SandwichUnionSize8Alignment4{{
      .before = ::fidl::HLCPPToNatural(std::move(value.before)),
      .union_ = ::fidl::HLCPPToNatural(std::move(value.union_)),
      .after = ::fidl::HLCPPToNatural(std::move(value.after)),
  }};
}
::test::unionsandwich::SandwichUnionSize12Alignment4 NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize12Alignment4>::Convert(::test_unionsandwich::SandwichUnionSize12Alignment4&& value) {
  ::test::unionsandwich::SandwichUnionSize12Alignment4 hlcpp;
  hlcpp.before = ::fidl::NaturalToHLCPP(std::move(value.before()));
  hlcpp.union_ = ::fidl::NaturalToHLCPP(std::move(value.union_()));
  hlcpp.after = ::fidl::NaturalToHLCPP(std::move(value.after()));
  return hlcpp;
}

::test_unionsandwich::SandwichUnionSize12Alignment4 HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize12Alignment4>::Convert(::test::unionsandwich::SandwichUnionSize12Alignment4&& value) {
  return ::test_unionsandwich::SandwichUnionSize12Alignment4{{
      .before = ::fidl::HLCPPToNatural(std::move(value.before)),
      .union_ = ::fidl::HLCPPToNatural(std::move(value.union_)),
      .after = ::fidl::HLCPPToNatural(std::move(value.after)),
  }};
}
::test::unionsandwich::StructSize16Alignment8 NaturalToHLCPPTraits<::test_unionsandwich::StructSize16Alignment8>::Convert(::test_unionsandwich::StructSize16Alignment8&& value) {
  ::test::unionsandwich::StructSize16Alignment8 hlcpp;
  hlcpp.f1 = ::fidl::NaturalToHLCPP(std::move(value.f1()));
  hlcpp.f2 = ::fidl::NaturalToHLCPP(std::move(value.f2()));
  return hlcpp;
}

::test_unionsandwich::StructSize16Alignment8 HLCPPToNaturalTraits<::test::unionsandwich::StructSize16Alignment8>::Convert(::test::unionsandwich::StructSize16Alignment8&& value) {
  return ::test_unionsandwich::StructSize16Alignment8{{
      .f1 = ::fidl::HLCPPToNatural(std::move(value.f1)),
      .f2 = ::fidl::HLCPPToNatural(std::move(value.f2)),
  }};
}
::test::unionsandwich::SandwichUnionSize24Alignment8 NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize24Alignment8>::Convert(::test_unionsandwich::SandwichUnionSize24Alignment8&& value) {
  ::test::unionsandwich::SandwichUnionSize24Alignment8 hlcpp;
  hlcpp.before = ::fidl::NaturalToHLCPP(std::move(value.before()));
  hlcpp.union_ = ::fidl::NaturalToHLCPP(std::move(value.union_()));
  hlcpp.after = ::fidl::NaturalToHLCPP(std::move(value.after()));
  return hlcpp;
}

::test_unionsandwich::SandwichUnionSize24Alignment8 HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize24Alignment8>::Convert(::test::unionsandwich::SandwichUnionSize24Alignment8&& value) {
  return ::test_unionsandwich::SandwichUnionSize24Alignment8{{
      .before = ::fidl::HLCPPToNatural(std::move(value.before)),
      .union_ = ::fidl::HLCPPToNatural(std::move(value.union_)),
      .after = ::fidl::HLCPPToNatural(std::move(value.after)),
  }};
}
::test::unionsandwich::SandwichUnionSize36Alignment4 NaturalToHLCPPTraits<::test_unionsandwich::SandwichUnionSize36Alignment4>::Convert(::test_unionsandwich::SandwichUnionSize36Alignment4&& value) {
  ::test::unionsandwich::SandwichUnionSize36Alignment4 hlcpp;
  hlcpp.before = ::fidl::NaturalToHLCPP(std::move(value.before()));
  hlcpp.union_ = ::fidl::NaturalToHLCPP(std::move(value.union_()));
  hlcpp.after = ::fidl::NaturalToHLCPP(std::move(value.after()));
  return hlcpp;
}

::test_unionsandwich::SandwichUnionSize36Alignment4 HLCPPToNaturalTraits<::test::unionsandwich::SandwichUnionSize36Alignment4>::Convert(::test::unionsandwich::SandwichUnionSize36Alignment4&& value) {
  return ::test_unionsandwich::SandwichUnionSize36Alignment4{{
      .before = ::fidl::HLCPPToNatural(std::move(value.before)),
      .union_ = ::fidl::HLCPPToNatural(std::move(value.union_)),
      .after = ::fidl::HLCPPToNatural(std::move(value.after)),
  }};
}

::test::unionsandwich::UnionSize8Alignment4 NaturalToHLCPPTraits<::test_unionsandwich::UnionSize8Alignment4>::Convert(::test_unionsandwich::UnionSize8Alignment4&& value) {
  ::test::unionsandwich::UnionSize8Alignment4 hlcpp;
  switch (value.Which()) {
    case ::test_unionsandwich::UnionSize8Alignment4::Tag::kVariant:
      hlcpp.set_variant(::fidl::NaturalToHLCPP(std::move(value.variant().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_unionsandwich::UnionSize8Alignment4 HLCPPToNaturalTraits<::test::unionsandwich::UnionSize8Alignment4>::Convert(::test::unionsandwich::UnionSize8Alignment4&& value) {
  using _NaturalUnion = ::test_unionsandwich::UnionSize8Alignment4;
  switch (value.Which()) {
    case ::test::unionsandwich::UnionSize8Alignment4::Tag::kVariant:
      return _NaturalUnion::WithVariant(
          ::fidl::HLCPPToNatural(std::move(value.variant())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unionsandwich::UnionSize8Alignment4");
  }
}
::test::unionsandwich::UnionSize12Alignment4 NaturalToHLCPPTraits<::test_unionsandwich::UnionSize12Alignment4>::Convert(::test_unionsandwich::UnionSize12Alignment4&& value) {
  ::test::unionsandwich::UnionSize12Alignment4 hlcpp;
  switch (value.Which()) {
    case ::test_unionsandwich::UnionSize12Alignment4::Tag::kVariant:
      hlcpp.set_variant(::fidl::NaturalToHLCPP(std::move(value.variant().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_unionsandwich::UnionSize12Alignment4 HLCPPToNaturalTraits<::test::unionsandwich::UnionSize12Alignment4>::Convert(::test::unionsandwich::UnionSize12Alignment4&& value) {
  using _NaturalUnion = ::test_unionsandwich::UnionSize12Alignment4;
  switch (value.Which()) {
    case ::test::unionsandwich::UnionSize12Alignment4::Tag::kVariant:
      return _NaturalUnion::WithVariant(
          ::fidl::HLCPPToNatural(std::move(value.variant())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unionsandwich::UnionSize12Alignment4");
  }
}
::test::unionsandwich::UnionSize24Alignment8 NaturalToHLCPPTraits<::test_unionsandwich::UnionSize24Alignment8>::Convert(::test_unionsandwich::UnionSize24Alignment8&& value) {
  ::test::unionsandwich::UnionSize24Alignment8 hlcpp;
  switch (value.Which()) {
    case ::test_unionsandwich::UnionSize24Alignment8::Tag::kVariant:
      hlcpp.set_variant(::fidl::NaturalToHLCPP(std::move(value.variant().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_unionsandwich::UnionSize24Alignment8 HLCPPToNaturalTraits<::test::unionsandwich::UnionSize24Alignment8>::Convert(::test::unionsandwich::UnionSize24Alignment8&& value) {
  using _NaturalUnion = ::test_unionsandwich::UnionSize24Alignment8;
  switch (value.Which()) {
    case ::test::unionsandwich::UnionSize24Alignment8::Tag::kVariant:
      return _NaturalUnion::WithVariant(
          ::fidl::HLCPPToNatural(std::move(value.variant())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unionsandwich::UnionSize24Alignment8");
  }
}
::test::unionsandwich::UnionSize36Alignment4 NaturalToHLCPPTraits<::test_unionsandwich::UnionSize36Alignment4>::Convert(::test_unionsandwich::UnionSize36Alignment4&& value) {
  ::test::unionsandwich::UnionSize36Alignment4 hlcpp;
  switch (value.Which()) {
    case ::test_unionsandwich::UnionSize36Alignment4::Tag::kVariant:
      hlcpp.set_variant(::fidl::NaturalToHLCPP(std::move(value.variant().value())));
      break;
    default:
      break;
  }
  return hlcpp;
}

::test_unionsandwich::UnionSize36Alignment4 HLCPPToNaturalTraits<::test::unionsandwich::UnionSize36Alignment4>::Convert(::test::unionsandwich::UnionSize36Alignment4&& value) {
  using _NaturalUnion = ::test_unionsandwich::UnionSize36Alignment4;
  switch (value.Which()) {
    case ::test::unionsandwich::UnionSize36Alignment4::Tag::kVariant:
      return _NaturalUnion::WithVariant(
          ::fidl::HLCPPToNatural(std::move(value.variant())));
    default:
      ZX_PANIC("Can't convert invalid strict union %s from HLCPP to Natural", "::test::unionsandwich::UnionSize36Alignment4");
  }
}

#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
