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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

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

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

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::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::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::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::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::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<::fidl::WireOptional<::test_anonymous::wire::Expression>, std::unique_ptr<::test_anonymous::Expression>> {
  static std::unique_ptr<::test_anonymous::Expression> ToNatural(::fidl::WireOptional<::test_anonymous::wire::Expression> src);
  static ::fidl::WireOptional<::test_anonymous::wire::Expression> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_anonymous::Expression> src);
};

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

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<::fidl::WireOptional<::test_anonymous::wire::UnionMember>, std::unique_ptr<::test_anonymous::UnionMember>> {
  static std::unique_ptr<::test_anonymous::UnionMember> ToNatural(::fidl::WireOptional<::test_anonymous::wire::UnionMember> src);
  static ::fidl::WireOptional<::test_anonymous::wire::UnionMember> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_anonymous::UnionMember> src);
};

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

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<::fidl::WireOptional<::test_anonymous::wire::SomeProtocolSomeMethodResult>, std::unique_ptr<::test_anonymous::SomeProtocolSomeMethodResult>> {
  static std::unique_ptr<::test_anonymous::SomeProtocolSomeMethodResult> ToNatural(::fidl::WireOptional<::test_anonymous::wire::SomeProtocolSomeMethodResult> src);
  static ::fidl::WireOptional<::test_anonymous::wire::SomeProtocolSomeMethodResult> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_anonymous::SomeProtocolSomeMethodResult> src);
};

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

#ifdef __Fuchsia__

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__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
