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

#pragma once

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

namespace fidl {
namespace internal {

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

template <>
struct NaturalTypeForWireType<::test_versions::wire::Struct> {
  using type = ::test_versions::Struct;
};
template <>
struct WireTypeForNaturalType<::test_versions::Struct> {
  using type = ::test_versions::wire::Struct;
};

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

template <>
struct NaturalTypeForWireType<::test_versions::wire::Table> {
  using type = ::test_versions::Table;
};
template <>
struct WireTypeForNaturalType<::test_versions::Table> {
  using type = ::test_versions::wire::Table;
};

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

template <>
struct WireNaturalConversionTraits<::test_versions::wire::Union,
                                   std::unique_ptr<::test_versions::Union>> {
  static std::unique_ptr<::test_versions::Union> ToNatural(
      ::test_versions::wire::Union src);
  static ::test_versions::wire::Union ToWire(
      fidl::AnyArena& arena, std::unique_ptr<::test_versions::Union> src);
};

template <>
struct NaturalTypeForWireType<::test_versions::wire::Union> {
  using type = std::unique_ptr<::test_versions::Union>;
};
template <>
struct WireTypeForNaturalType<::test_versions::Union> {
  using type = ::test_versions::wire::Union;
};
template <>
struct WireTypeForNaturalType<std::unique_ptr<::test_versions::Union>> {
  using type = ::test_versions::wire::Union;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_versions::Protocol::Foo>,
    ::fidl::Request<::test_versions::Protocol::Foo>> {
  static ::fidl::Request<::test_versions::Protocol::Foo> ToNatural(
      ::fidl::WireRequest<::test_versions::Protocol::Foo> src);
  static ::fidl::WireRequest<::test_versions::Protocol::Foo> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Request<::test_versions::Protocol::Foo> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_versions::Protocol::Foo>> {
  using type = ::fidl::Request<::test_versions::Protocol::Foo>;
};
template <>
struct WireTypeForNaturalType<::fidl::Request<::test_versions::Protocol::Foo>> {
  using type = ::fidl::WireRequest<::test_versions::Protocol::Foo>;
};
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
