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

#pragma once

#include <fidl/test.inheritance/cpp/natural_types.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/llcpp/internal/transport_channel.h>
#include <test/inheritance/cpp/fidl.h>

namespace fidl {
namespace internal {

template <>
struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_inheritance::Super>> {
  using HLCPPType = fidl::InterfaceHandle<::test::inheritance::super>;
  static inline fidl::InterfaceHandle<::test::inheritance::super> Convert(fidl::ClientEnd<::test_inheritance::Super>&& c) {
    return fidl::InterfaceHandle<::test::inheritance::super>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_inheritance::Super>> {
  using HLCPPType = fidl::InterfaceRequest<::test::inheritance::super>;
  static inline fidl::InterfaceRequest<::test::inheritance::super> Convert(fidl::ServerEnd<::test_inheritance::Super>&& c) {
    return fidl::InterfaceRequest<::test::inheritance::super>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::inheritance::super>> {
  using NaturalType = fidl::ClientEnd<::test_inheritance::Super>;
  static inline fidl::ClientEnd<::test_inheritance::Super> Convert(fidl::InterfaceHandle<::test::inheritance::super>&& c) {
    return fidl::ClientEnd<::test_inheritance::Super>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::inheritance::super>> {
  using NaturalType = fidl::ServerEnd<::test_inheritance::Super>;
  static inline fidl::ServerEnd<::test_inheritance::Super> Convert(fidl::InterfaceRequest<::test::inheritance::super>&& c) {
    return fidl::ServerEnd<::test_inheritance::Super>(c.TakeChannel());
  }
};
template <>
struct NaturalToHLCPPTraits<fidl::ClientEnd<::test_inheritance::Sub>> {
  using HLCPPType = fidl::InterfaceHandle<::test::inheritance::sub>;
  static inline fidl::InterfaceHandle<::test::inheritance::sub> Convert(fidl::ClientEnd<::test_inheritance::Sub>&& c) {
    return fidl::InterfaceHandle<::test::inheritance::sub>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<fidl::ServerEnd<::test_inheritance::Sub>> {
  using HLCPPType = fidl::InterfaceRequest<::test::inheritance::sub>;
  static inline fidl::InterfaceRequest<::test::inheritance::sub> Convert(fidl::ServerEnd<::test_inheritance::Sub>&& c) {
    return fidl::InterfaceRequest<::test::inheritance::sub>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceHandle<::test::inheritance::sub>> {
  using NaturalType = fidl::ClientEnd<::test_inheritance::Sub>;
  static inline fidl::ClientEnd<::test_inheritance::Sub> Convert(fidl::InterfaceHandle<::test::inheritance::sub>&& c) {
    return fidl::ClientEnd<::test_inheritance::Sub>(c.TakeChannel());
  }
};

template <>
struct HLCPPToNaturalTraits<fidl::InterfaceRequest<::test::inheritance::sub>> {
  using NaturalType = fidl::ServerEnd<::test_inheritance::Sub>;
  static inline fidl::ServerEnd<::test_inheritance::Sub> Convert(fidl::InterfaceRequest<::test::inheritance::sub>&& c) {
    return fidl::ServerEnd<::test_inheritance::Sub>(c.TakeChannel());
  }
};

template <>
struct NaturalToHLCPPTraits<::test_inheritance::SuperFooTopResponse> {
  using HLCPPType = ::test::inheritance::SuperFooTopResponse;
  static inline ::test::inheritance::SuperFooTopResponse Convert(::test_inheritance::SuperFooTopResponse&&);
};
template <>
struct HLCPPToNaturalTraits<::test::inheritance::SuperFooTopResponse> {
  using NaturalType = ::test_inheritance::SuperFooTopResponse;
  static inline ::test_inheritance::SuperFooTopResponse Convert(::test::inheritance::SuperFooTopResponse&&);
};
template <>
struct NaturalToHLCPPTraits<::test_inheritance::SuperFooRequest> {
  using HLCPPType = ::test::inheritance::SuperFooRequest;
  static inline ::test::inheritance::SuperFooRequest Convert(::test_inheritance::SuperFooRequest&&);
};
template <>
struct HLCPPToNaturalTraits<::test::inheritance::SuperFooRequest> {
  using NaturalType = ::test_inheritance::SuperFooRequest;
  static inline ::test_inheritance::SuperFooRequest Convert(::test::inheritance::SuperFooRequest&&);
};

::test::inheritance::SuperFooTopResponse NaturalToHLCPPTraits<::test_inheritance::SuperFooTopResponse>::Convert(::test_inheritance::SuperFooTopResponse&& value) {
  ::test::inheritance::SuperFooTopResponse hlcpp;
  hlcpp.y = ::fidl::NaturalToHLCPP(std::move(value.y()));
  return hlcpp;
}

::test_inheritance::SuperFooTopResponse HLCPPToNaturalTraits<::test::inheritance::SuperFooTopResponse>::Convert(::test::inheritance::SuperFooTopResponse&& value) {
  return ::test_inheritance::SuperFooTopResponse{{
      .y = ::fidl::HLCPPToNatural(std::move(value.y)),
  }};
}
::test::inheritance::SuperFooRequest NaturalToHLCPPTraits<::test_inheritance::SuperFooRequest>::Convert(::test_inheritance::SuperFooRequest&& value) {
  ::test::inheritance::SuperFooRequest hlcpp;
  hlcpp.s = ::fidl::NaturalToHLCPP(std::move(value.s()));
  return hlcpp;
}

::test_inheritance::SuperFooRequest HLCPPToNaturalTraits<::test::inheritance::SuperFooRequest>::Convert(::test::inheritance::SuperFooRequest&& value) {
  return ::test_inheritance::SuperFooRequest{{
      .s = ::fidl::HLCPPToNatural(std::move(value.s)),
  }};
}

}  // namespace internal
}  // namespace fidl
