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

#pragma once

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

namespace fidl {
namespace internal {

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

template <>
struct NaturalTypeForWireType<::test_anonymous::wire::TableData> {
  using type = ::test_anonymous::TableData;
};
template <>
struct WireTypeForNaturalType<::test_anonymous::TableData> {
  using type = ::test_anonymous::wire::TableData;
};

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

template <>
struct NaturalTypeForWireType<
    ::test_anonymous::wire::SomeProtocolSomeMethodRequest> {
  using type = ::test_anonymous::SomeProtocolSomeMethodRequest;
};
template <>
struct WireTypeForNaturalType<::test_anonymous::SomeProtocolSomeMethodRequest> {
  using type = ::test_anonymous::wire::SomeProtocolSomeMethodRequest;
};

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

template <>
struct NaturalTypeForWireType<::test_anonymous::wire::OverrideTest> {
  using type = ::test_anonymous::OverrideTest;
};
template <>
struct WireTypeForNaturalType<::test_anonymous::OverrideTest> {
  using type = ::test_anonymous::wire::OverrideTest;
};

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

template <>
struct NaturalTypeForWireType<
    ::test_anonymous::wire::SomeProtocolSomeMethodResponse> {
  using type = ::test_anonymous::SomeProtocolSomeMethodResponse;
};
template <>
struct WireTypeForNaturalType<
    ::test_anonymous::SomeProtocolSomeMethodResponse> {
  using type = ::test_anonymous::wire::SomeProtocolSomeMethodResponse;
};

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

template <>
struct NaturalTypeForWireType<
    ::test_anonymous::wire::SomeProtocolSomeMethodTopResponse> {
  using type = ::test_anonymous::SomeProtocolSomeMethodTopResponse;
};
template <>
struct WireTypeForNaturalType<
    ::test_anonymous::SomeProtocolSomeMethodTopResponse> {
  using type = ::test_anonymous::wire::SomeProtocolSomeMethodTopResponse;
};

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

template <>
struct NaturalTypeForWireType<::test_anonymous::wire::TableMember> {
  using type = ::test_anonymous::TableMember;
};
template <>
struct WireTypeForNaturalType<::test_anonymous::TableMember> {
  using type = ::test_anonymous::wire::TableMember;
};

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

template <>
struct NaturalTypeForWireType<::test_anonymous::wire::FunctionApplication> {
  using type = ::test_anonymous::FunctionApplication;
};
template <>
struct WireTypeForNaturalType<::test_anonymous::FunctionApplication> {
  using type = ::test_anonymous::wire::FunctionApplication;
};

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

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

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

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

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

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

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

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

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

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_anonymous::SomeProtocol::SomeMethod>,
    ::fidl::Request<::test_anonymous::SomeProtocol::SomeMethod>> {
  static ::fidl::Request<::test_anonymous::SomeProtocol::SomeMethod> ToNatural(
      ::fidl::WireRequest<::test_anonymous::SomeProtocol::SomeMethod> src);
  static ::fidl::WireRequest<::test_anonymous::SomeProtocol::SomeMethod> ToWire(
      fidl::AnyArena& arena,
      ::fidl::Request<::test_anonymous::SomeProtocol::SomeMethod> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireRequest<::test_anonymous::SomeProtocol::SomeMethod>> {
  using type = ::fidl::Request<::test_anonymous::SomeProtocol::SomeMethod>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Request<::test_anonymous::SomeProtocol::SomeMethod>> {
  using type = ::fidl::WireRequest<::test_anonymous::SomeProtocol::SomeMethod>;
};

template <>
struct WireNaturalConversionTraits<
    ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod>,
    ::fidl::Response<::test_anonymous::SomeProtocol::SomeMethod>> {
  static ::fidl::Response<::test_anonymous::SomeProtocol::SomeMethod> ToNatural(
      ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod> src);
  static ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod>
  ToWire(fidl::AnyArena& arena,
         ::fidl::Response<::test_anonymous::SomeProtocol::SomeMethod> src);
};

template <>
struct NaturalTypeForWireType<
    ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod>> {
  using type = ::fidl::Response<::test_anonymous::SomeProtocol::SomeMethod>;
};
template <>
struct WireTypeForNaturalType<
    ::fidl::Response<::test_anonymous::SomeProtocol::SomeMethod>> {
  using type = ::fidl::WireResponse<::test_anonymous::SomeProtocol::SomeMethod>;
};
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
