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

#pragma once

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

namespace fidl {
namespace internal {

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

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

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

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

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

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

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

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

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

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

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_doccomments::Interface::Method>,
    ::fidl::Request<::test_doccomments::Interface::Method>> {
  static ::fidl::Request<::test_doccomments::Interface::Method> ToNatural(
      ::fidl::WireRequest<::test_doccomments::Interface::Method> src);
  static ::fidl::WireRequest<::test_doccomments::Interface::Method> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Request<::test_doccomments::Interface::Method> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_doccomments::Interface::Method>> {
  using type = ::fidl::Request<::test_doccomments::Interface::Method>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Request<::test_doccomments::Interface::Method>> {
  using type = ::fidl::WireRequest<::test_doccomments::Interface::Method>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireEvent<::test_doccomments::Interface::OnEvent>,
    ::fidl::Event<::test_doccomments::Interface::OnEvent>> {
  static ::fidl::Event<::test_doccomments::Interface::OnEvent> ToNatural(
      ::fidl::WireEvent<::test_doccomments::Interface::OnEvent> src);
  static ::fidl::WireEvent<::test_doccomments::Interface::OnEvent> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Event<::test_doccomments::Interface::OnEvent> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireEvent<::test_doccomments::Interface::OnEvent>> {
  using type = ::fidl::Event<::test_doccomments::Interface::OnEvent>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Event<::test_doccomments::Interface::OnEvent>> {
  using type = ::fidl::WireEvent<::test_doccomments::Interface::OnEvent>;
};
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
