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

#pragma once

#include <fidl/test.encapsulatedstructs/cpp/markers.h>
#include <fidl/test.encapsulatedstructs/cpp/natural_types.h>
#include <fidl/test.encapsulatedstructs/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.encapsulatedstructs/cpp/natural_messaging.h>
#include <fidl/test.encapsulatedstructs/cpp/wire_messaging.h>
#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::NonInlineStructTestStruct,
    ::test_encapsulatedstructs::NonInlineStructTestStruct> {
  static ::test_encapsulatedstructs::NonInlineStructTestStruct ToNatural(
      ::test_encapsulatedstructs::wire::NonInlineStructTestStruct src);
  static ::test_encapsulatedstructs::wire::NonInlineStructTestStruct ToWire(
      fidl::AnyArena& arena,
      ::test_encapsulatedstructs::NonInlineStructTestStruct src);
};

template <>
struct NaturalTypeForWireType<
    ::test_encapsulatedstructs::wire::NonInlineStructTestStruct> {
  using type = ::test_encapsulatedstructs::NonInlineStructTestStruct;
};
template <>
struct WireTypeForNaturalType<
    ::test_encapsulatedstructs::NonInlineStructTestStruct> {
  using type = ::test_encapsulatedstructs::wire::NonInlineStructTestStruct;
};

#endif  // __Fuchsia__

template <>
struct WireNaturalConversionTraits<::test_encapsulatedstructs::wire::Int8Int32,
                                   ::test_encapsulatedstructs::Int8Int32> {
  static ::test_encapsulatedstructs::Int8Int32 ToNatural(
      ::test_encapsulatedstructs::wire::Int8Int32 src);
  static ::test_encapsulatedstructs::wire::Int8Int32 ToWire(
      fidl::AnyArena& arena, ::test_encapsulatedstructs::Int8Int32 src);
};

template <>
struct NaturalTypeForWireType<::test_encapsulatedstructs::wire::Int8Int32> {
  using type = ::test_encapsulatedstructs::Int8Int32;
};
template <>
struct WireTypeForNaturalType<::test_encapsulatedstructs::Int8Int32> {
  using type = ::test_encapsulatedstructs::wire::Int8Int32;
};

template <>
struct WireNaturalConversionTraits<::test_encapsulatedstructs::wire::Int16Int8,
                                   ::test_encapsulatedstructs::Int16Int8> {
  static ::test_encapsulatedstructs::Int16Int8 ToNatural(
      ::test_encapsulatedstructs::wire::Int16Int8 src);
  static ::test_encapsulatedstructs::wire::Int16Int8 ToWire(
      fidl::AnyArena& arena, ::test_encapsulatedstructs::Int16Int8 src);
};

template <>
struct NaturalTypeForWireType<::test_encapsulatedstructs::wire::Int16Int8> {
  using type = ::test_encapsulatedstructs::Int16Int8;
};
template <>
struct WireTypeForNaturalType<::test_encapsulatedstructs::Int16Int8> {
  using type = ::test_encapsulatedstructs::wire::Int16Int8;
};

template <>
struct WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::ArrayInt16Int8,
    ::test_encapsulatedstructs::ArrayInt16Int8> {
  static ::test_encapsulatedstructs::ArrayInt16Int8 ToNatural(
      ::test_encapsulatedstructs::wire::ArrayInt16Int8 src);
  static ::test_encapsulatedstructs::wire::ArrayInt16Int8 ToWire(
      fidl::AnyArena& arena, ::test_encapsulatedstructs::ArrayInt16Int8 src);
};

template <>
struct NaturalTypeForWireType<
    ::test_encapsulatedstructs::wire::ArrayInt16Int8> {
  using type = ::test_encapsulatedstructs::ArrayInt16Int8;
};
template <>
struct WireTypeForNaturalType<::test_encapsulatedstructs::ArrayInt16Int8> {
  using type = ::test_encapsulatedstructs::wire::ArrayInt16Int8;
};

template <>
struct WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::StructPaddingTestStruct,
    ::test_encapsulatedstructs::StructPaddingTestStruct> {
  static ::test_encapsulatedstructs::StructPaddingTestStruct ToNatural(
      ::test_encapsulatedstructs::wire::StructPaddingTestStruct src);
  static ::test_encapsulatedstructs::wire::StructPaddingTestStruct ToWire(
      fidl::AnyArena& arena,
      ::test_encapsulatedstructs::StructPaddingTestStruct src);
};

template <>
struct NaturalTypeForWireType<
    ::test_encapsulatedstructs::wire::StructPaddingTestStruct> {
  using type = ::test_encapsulatedstructs::StructPaddingTestStruct;
};
template <>
struct WireTypeForNaturalType<
    ::test_encapsulatedstructs::StructPaddingTestStruct> {
  using type = ::test_encapsulatedstructs::wire::StructPaddingTestStruct;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<
    ::test_encapsulatedstructs::wire::TopLevelStruct,
    ::test_encapsulatedstructs::TopLevelStruct> {
  static ::test_encapsulatedstructs::TopLevelStruct ToNatural(
      ::test_encapsulatedstructs::wire::TopLevelStruct src);
  static ::test_encapsulatedstructs::wire::TopLevelStruct ToWire(
      fidl::AnyArena& arena, ::test_encapsulatedstructs::TopLevelStruct src);
};

template <>
struct NaturalTypeForWireType<
    ::test_encapsulatedstructs::wire::TopLevelStruct> {
  using type = ::test_encapsulatedstructs::TopLevelStruct;
};
template <>
struct WireTypeForNaturalType<::test_encapsulatedstructs::TopLevelStruct> {
  using type = ::test_encapsulatedstructs::wire::TopLevelStruct;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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