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

#pragma once

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

namespace fidl {
namespace internal {

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

template <>
struct NaturalTypeForWireType<::test_inheritance::wire::SuperFooTopResponse> {
  using type = ::test_inheritance::SuperFooTopResponse;
};
template <>
struct WireTypeForNaturalType<::test_inheritance::SuperFooTopResponse> {
  using type = ::test_inheritance::wire::SuperFooTopResponse;
};

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

template <>
struct NaturalTypeForWireType<::test_inheritance::wire::SuperFooRequest> {
  using type = ::test_inheritance::SuperFooRequest;
};
template <>
struct WireTypeForNaturalType<::test_inheritance::SuperFooRequest> {
  using type = ::test_inheritance::wire::SuperFooRequest;
};

#ifdef __Fuchsia__

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

template <>
struct NaturalTypeForWireType<::fidl::WireRequest<::test_inheritance::Super::Foo>> {
  using type = ::fidl::Request<::test_inheritance::Super::Foo>;
};
template <>
struct WireTypeForNaturalType<::fidl::Request<::test_inheritance::Super::Foo>> {
  using type = ::fidl::WireRequest<::test_inheritance::Super::Foo>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_inheritance::Super::Foo>, ::fidl::Response<::test_inheritance::Super::Foo>> {
  static ::fidl::Response<::test_inheritance::Super::Foo> ToNatural(::fidl::WireResponse<::test_inheritance::Super::Foo> src);
  static ::fidl::WireResponse<::test_inheritance::Super::Foo> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_inheritance::Super::Foo> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_inheritance::Super::Foo>> {
  using type = ::fidl::Response<::test_inheritance::Super::Foo>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_inheritance::Super::Foo>> {
  using type = ::fidl::WireResponse<::test_inheritance::Super::Foo>;
};

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

template <>
struct NaturalTypeForWireType<::fidl::WireRequest<::test_inheritance::Sub::Foo>> {
  using type = ::fidl::Request<::test_inheritance::Sub::Foo>;
};
template <>
struct WireTypeForNaturalType<::fidl::Request<::test_inheritance::Sub::Foo>> {
  using type = ::fidl::WireRequest<::test_inheritance::Sub::Foo>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_inheritance::Sub::Foo>, ::fidl::Response<::test_inheritance::Sub::Foo>> {
  static ::fidl::Response<::test_inheritance::Sub::Foo> ToNatural(::fidl::WireResponse<::test_inheritance::Sub::Foo> src);
  static ::fidl::WireResponse<::test_inheritance::Sub::Foo> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_inheritance::Sub::Foo> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_inheritance::Sub::Foo>> {
  using type = ::fidl::Response<::test_inheritance::Sub::Foo>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_inheritance::Sub::Foo>> {
  using type = ::fidl::WireResponse<::test_inheritance::Sub::Foo>;
};
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
