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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

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;
};

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

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

#ifdef __Fuchsia__

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

}  // namespace internal
}  // namespace fidl
