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

#pragma once

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

namespace fidl {
namespace internal {

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

template <>
struct NaturalTypeForWireType<::test_table::wire::TableWithAttributes> {
  using type = ::test_table::TableWithAttributes;
};
template <>
struct WireTypeForNaturalType<::test_table::TableWithAttributes> {
  using type = ::test_table::wire::TableWithAttributes;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::SimpleTable> {
  using type = ::test_table::SimpleTable;
};
template <>
struct WireTypeForNaturalType<::test_table::SimpleTable> {
  using type = ::test_table::wire::SimpleTable;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::ReverseOrdinalTable> {
  using type = ::test_table::ReverseOrdinalTable;
};
template <>
struct WireTypeForNaturalType<::test_table::ReverseOrdinalTable> {
  using type = ::test_table::wire::ReverseOrdinalTable;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::OlderSimpleTable> {
  using type = ::test_table::OlderSimpleTable;
};
template <>
struct WireTypeForNaturalType<::test_table::OlderSimpleTable> {
  using type = ::test_table::wire::OlderSimpleTable;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::NewerSimpleTable> {
  using type = ::test_table::NewerSimpleTable;
};
template <>
struct WireTypeForNaturalType<::test_table::NewerSimpleTable> {
  using type = ::test_table::wire::NewerSimpleTable;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::ExtensionTable> {
  using type = ::test_table::ExtensionTable;
};
template <>
struct WireTypeForNaturalType<::test_table::ExtensionTable> {
  using type = ::test_table::wire::ExtensionTable;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::SixtyFourOrdinalTable> {
  using type = ::test_table::SixtyFourOrdinalTable;
};
template <>
struct WireTypeForNaturalType<::test_table::SixtyFourOrdinalTable> {
  using type = ::test_table::wire::SixtyFourOrdinalTable;
};

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

template <>
struct NaturalTypeForWireType<::test_table::wire::EmptyTable> {
  using type = ::test_table::EmptyTable;
};
template <>
struct WireTypeForNaturalType<::test_table::EmptyTable> {
  using type = ::test_table::wire::EmptyTable;
};

#ifdef __Fuchsia__

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