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

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

::test_encapsulatedstructs::NonInlineStructTestStruct
WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::NonInlineStructTestStruct,
    ::test_encapsulatedstructs::NonInlineStructTestStruct>::
    ToNatural(::test_encapsulatedstructs::wire::NonInlineStructTestStruct src) {
  return ::test_encapsulatedstructs::NonInlineStructTestStruct({
      .element = WireNaturalConversionTraits<
          ::fidl::ObjectView<::test_encapsulatedstructs::wire::Int16Int8>,
          ::std::unique_ptr<::test_encapsulatedstructs::Int16Int8>>::
          ToNatural(std::move(src.element)),
      .h = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToNatural(
          std::move(src.h)),
  });
}
::test_encapsulatedstructs::wire::NonInlineStructTestStruct
WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::NonInlineStructTestStruct,
    ::test_encapsulatedstructs::NonInlineStructTestStruct>::
    ToWire(fidl::AnyArena& arena,
           ::test_encapsulatedstructs::NonInlineStructTestStruct src) {
  return ::test_encapsulatedstructs::wire::NonInlineStructTestStruct{
      .element = WireNaturalConversionTraits<
          ::fidl::ObjectView<::test_encapsulatedstructs::wire::Int16Int8>,
          ::std::unique_ptr<::test_encapsulatedstructs::Int16Int8>>::
          ToWire(arena, std::move(src.element())),
      .h = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToWire(
          arena, std::move(src.h())),
  };
}

#endif  // __Fuchsia__

::test_encapsulatedstructs::Int8Int32
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::Int8Int32,
                            ::test_encapsulatedstructs::Int8Int32>::
    ToNatural(::test_encapsulatedstructs::wire::Int8Int32 src) {
  return ::test_encapsulatedstructs::Int8Int32({
      .a = WireNaturalConversionTraits<int8_t, int8_t>::ToNatural(
          std::move(src.a)),
      .b = WireNaturalConversionTraits<int32_t, int32_t>::ToNatural(
          std::move(src.b)),
  });
}
::test_encapsulatedstructs::wire::Int8Int32
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::Int8Int32,
                            ::test_encapsulatedstructs::Int8Int32>::
    ToWire(fidl::AnyArena& arena, ::test_encapsulatedstructs::Int8Int32 src) {
  return ::test_encapsulatedstructs::wire::Int8Int32{
      .a = WireNaturalConversionTraits<int8_t, int8_t>::ToWire(
          arena, std::move(src.a())),
      .b = WireNaturalConversionTraits<int32_t, int32_t>::ToWire(
          arena, std::move(src.b())),
  };
}

::test_encapsulatedstructs::Int16Int8
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::Int16Int8,
                            ::test_encapsulatedstructs::Int16Int8>::
    ToNatural(::test_encapsulatedstructs::wire::Int16Int8 src) {
  return ::test_encapsulatedstructs::Int16Int8({
      .a = WireNaturalConversionTraits<int16_t, int16_t>::ToNatural(
          std::move(src.a)),
      .b = WireNaturalConversionTraits<int8_t, int8_t>::ToNatural(
          std::move(src.b)),
  });
}
::test_encapsulatedstructs::wire::Int16Int8
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::Int16Int8,
                            ::test_encapsulatedstructs::Int16Int8>::
    ToWire(fidl::AnyArena& arena, ::test_encapsulatedstructs::Int16Int8 src) {
  return ::test_encapsulatedstructs::wire::Int16Int8{
      .a = WireNaturalConversionTraits<int16_t, int16_t>::ToWire(
          arena, std::move(src.a())),
      .b = WireNaturalConversionTraits<int8_t, int8_t>::ToWire(
          arena, std::move(src.b())),
  };
}

::test_encapsulatedstructs::ArrayInt16Int8
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::ArrayInt16Int8,
                            ::test_encapsulatedstructs::ArrayInt16Int8>::
    ToNatural(::test_encapsulatedstructs::wire::ArrayInt16Int8 src) {
  return ::test_encapsulatedstructs::ArrayInt16Int8(
      WireNaturalConversionTraits<
          ::fidl::Array<::test_encapsulatedstructs::wire::Int16Int8, 3>,
          ::std::array<::test_encapsulatedstructs::Int16Int8,
                       3>>::ToNatural(std::move(src.arr)));
}
::test_encapsulatedstructs::wire::ArrayInt16Int8
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::ArrayInt16Int8,
                            ::test_encapsulatedstructs::ArrayInt16Int8>::
    ToWire(fidl::AnyArena& arena,
           ::test_encapsulatedstructs::ArrayInt16Int8 src) {
  return ::test_encapsulatedstructs::wire::ArrayInt16Int8{
      .arr = WireNaturalConversionTraits<
          ::fidl::Array<::test_encapsulatedstructs::wire::Int16Int8, 3>,
          ::std::array<::test_encapsulatedstructs::Int16Int8,
                       3>>::ToWire(arena, std::move(src.arr())),
  };
}

::test_encapsulatedstructs::StructPaddingTestStruct WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::StructPaddingTestStruct,
    ::test_encapsulatedstructs::StructPaddingTestStruct>::
    ToNatural(::test_encapsulatedstructs::wire::StructPaddingTestStruct src) {
  return ::test_encapsulatedstructs::StructPaddingTestStruct({
      .trailing = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::Int16Int8,
          ::test_encapsulatedstructs::Int16Int8>::
          ToNatural(std::move(src.trailing)),
      .inner = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::Int8Int32,
          ::test_encapsulatedstructs::Int8Int32>::
          ToNatural(std::move(src.inner)),
      .array = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::ArrayInt16Int8,
          ::test_encapsulatedstructs::ArrayInt16Int8>::
          ToNatural(std::move(src.array)),
  });
}
::test_encapsulatedstructs::wire::StructPaddingTestStruct
WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::StructPaddingTestStruct,
    ::test_encapsulatedstructs::StructPaddingTestStruct>::
    ToWire(fidl::AnyArena& arena,
           ::test_encapsulatedstructs::StructPaddingTestStruct src) {
  return ::test_encapsulatedstructs::wire::StructPaddingTestStruct{
      .trailing = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::Int16Int8,
          ::test_encapsulatedstructs::Int16Int8>::ToWire(arena,
                                                         std::move(
                                                             src.trailing())),
      .inner = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::Int8Int32,
          ::test_encapsulatedstructs::Int8Int32>::ToWire(arena,
                                                         std::move(
                                                             src.inner())),
      .array = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::ArrayInt16Int8,
          ::test_encapsulatedstructs::ArrayInt16Int8>::ToWire(arena,
                                                              std::move(
                                                                  src.array())),
  };
}

#ifdef __Fuchsia__

::test_encapsulatedstructs::TopLevelStruct
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::TopLevelStruct,
                            ::test_encapsulatedstructs::TopLevelStruct>::
    ToNatural(::test_encapsulatedstructs::wire::TopLevelStruct src) {
  return ::test_encapsulatedstructs::TopLevelStruct({
      .a = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::StructPaddingTestStruct,
          ::test_encapsulatedstructs::StructPaddingTestStruct>::
          ToNatural(std::move(src.a)),
      .b = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::NonInlineStructTestStruct,
          ::test_encapsulatedstructs::NonInlineStructTestStruct>::
          ToNatural(std::move(src.b)),
  });
}
::test_encapsulatedstructs::wire::TopLevelStruct
WireNaturalConversionTraits<::test_encapsulatedstructs::wire::TopLevelStruct,
                            ::test_encapsulatedstructs::TopLevelStruct>::
    ToWire(fidl::AnyArena& arena,
           ::test_encapsulatedstructs::TopLevelStruct src) {
  return ::test_encapsulatedstructs::wire::TopLevelStruct{
      .a = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::StructPaddingTestStruct,
          ::test_encapsulatedstructs::StructPaddingTestStruct>::
          ToWire(arena, std::move(src.a())),
      .b = WireNaturalConversionTraits<
          ::test_encapsulatedstructs::wire::NonInlineStructTestStruct,
          ::test_encapsulatedstructs::NonInlineStructTestStruct>::
          ToWire(arena, std::move(src.b())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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