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

// fidl_experiment = output_index_json

#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>

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

namespace fidl {
namespace internal {

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;
};

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::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::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::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::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;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
