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

#include <fidl/test.inheritance/cpp/natural_messaging.h>

namespace test_inheritance {
[[maybe_unused]] constexpr inline uint64_t ksuper_foo_Ordinal =
    7540745593380780216lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    ksuper_foo_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_inheritance
::fidl::internal::NaturalThenable<::test_inheritance::Super::Foo>
fidl::internal::NaturalClientImpl<::test_inheritance::Super>::Foo(
    ::fidl::Request<::test_inheritance::Super::Foo> request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_inheritance::ksuper_foo_Ordinal,
      ::test_inheritance::ksuper_foo_DynamicFlags};
  _encoder.EncodeBody(::fidl::internal::NaturalMessageConverter<
                      ::fidl::Request<::test_inheritance::Super::Foo>>::
                          IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<::test_inheritance::Super::Foo>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo> fidl::internal::
    NaturalEventDispatcher<::test_inheritance::Super>::DispatchEvent(
        ::fidl::IncomingMessage& msg,
        ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

void fidl::internal::NaturalCompleterBase<::test_inheritance::Super::Foo>::
    Reply(::fidl::Response<::test_inheritance::Super::Foo>&& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_inheritance::ksuper_foo_Ordinal,
      ::test_inheritance::ksuper_foo_DynamicFlags};
  _encoder.EncodeBody(::fidl::internal::NaturalMessageConverter<
                      ::fidl::Response<::test_inheritance::Super::Foo>>::
                          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_inheritance::Super>::entries_[] = {
    {
        ::test_inheritance::ksuper_foo_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_inheritance::SuperFooRequest>(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_inheritance::Super::Foo> request =
              ::fidl::internal::NaturalMessageConverter<
                  ::fidl::Request<::test_inheritance::Super::Foo>>::
                  FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<
              ::test_inheritance::Super::Foo>::Sync completer(txn);
          static_cast<::fidl::Server<::test_inheritance::Super>*>(interface)
              ->Foo(request, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_inheritance::Super>::entries_end_ = &entries_[1];

void fidl::internal::NaturalServerDispatcher<::test_inheritance::Super>::
    Dispatch(::fidl::Server<::test_inheritance::Super>* impl,
             ::fidl::IncomingMessage&& msg,
             internal::IncomingTransportContext transport_context,
             ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_inheritance::Super>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_inheritance::Super>::Dispatch(this, std::move(msg),
                                           std::move(transport_context), txn);
}
#endif  // __Fuchsia__

namespace test_inheritance {
[[maybe_unused]] constexpr inline uint64_t ksub_foo_Ordinal =
    7540745593380780216lu;

[[maybe_unused]] constexpr inline ::fidl::MessageDynamicFlags
    ksub_foo_DynamicFlags = ::fidl::MessageDynamicFlags::kStrictMethod;

#ifdef __Fuchsia__
}  // namespace test_inheritance
::fidl::internal::NaturalThenable<::test_inheritance::Sub::Foo>
fidl::internal::NaturalClientImpl<::test_inheritance::Sub>::Foo(
    ::fidl::Request<::test_inheritance::Sub::Foo> request) const {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_inheritance::ksub_foo_Ordinal,
      ::test_inheritance::ksub_foo_DynamicFlags};
  _encoder.EncodeBody(
      ::fidl::internal::NaturalMessageConverter<::fidl::Request<
          ::test_inheritance::Sub::Foo>>::IntoDomainObject(std::move(request)));
  return ::fidl::internal::NaturalThenable<::test_inheritance::Sub::Foo>(
      &client_base(), {}, std::move(_encoder),
      [](::fidl::internal::ThenableBase* base,
         ::fidl::internal::NaturalMessageEncoder& encoder,
         ::fidl::internal::ResponseContext* response_context) {
        ::fidl::OutgoingMessage msg = encoder.GetMessage();
        return base->SendTwoWay(msg, response_context);
      });
}

namespace test_inheritance {
#endif  // __Fuchsia__

}  // namespace test_inheritance
#ifdef __Fuchsia__

std::optional<::fidl::UnbindInfo>
fidl::internal::NaturalEventDispatcher<::test_inheritance::Sub>::DispatchEvent(
    ::fidl::IncomingMessage& msg,
    ::fidl::internal::IncomingTransportContext transport_context) {
  return ::fidl::UnbindInfo::UnknownOrdinal();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__

void fidl::internal::NaturalCompleterBase<::test_inheritance::Sub::Foo>::Reply(
    ::fidl::Response<::test_inheritance::Sub::Foo>&& response) {
  ::fidl::internal::NaturalMessageEncoder _encoder{
      &::fidl::internal::ChannelTransport::VTable,
      ::test_inheritance::ksub_foo_Ordinal,
      ::test_inheritance::ksub_foo_DynamicFlags};
  _encoder.EncodeBody(::fidl::internal::NaturalMessageConverter<
                      ::fidl::Response<::test_inheritance::Sub::Foo>>::
                          IntoDomainObject(std::move(response)));
  ::fidl::OutgoingMessage _encoded_message = _encoder.GetMessage();
  SendReply(&_encoded_message, ::fidl::internal::OutgoingTransportContext{});
}

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_inheritance::Sub>::entries_[] = {
    {
        ::test_inheritance::ksub_foo_Ordinal,
        [](void* interface, ::fidl::IncomingMessage&& msg,
           internal::IncomingTransportContext transport_context,
           ::fidl::Transaction* txn) {
          ::fitx::result decoded = ::fidl::internal::DecodeTransactionalMessage<
              ::test_inheritance::SuperFooRequest>(std::move(msg));
          if (decoded.is_error()) {
            return decoded.error_value().status();
          }
          ::fidl::Request<::test_inheritance::Sub::Foo> request =
              ::fidl::internal::NaturalMessageConverter<
                  ::fidl::Request<::test_inheritance::Sub::Foo>>::
                  FromDomainObject(std::move(decoded.value()));
          ::fidl::internal::NaturalCompleter<::test_inheritance::Sub::Foo>::Sync
              completer(txn);
          static_cast<::fidl::Server<::test_inheritance::Sub>*>(interface)->Foo(
              request, completer);
          return ZX_OK;
        },
    },
};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_inheritance::Sub>::entries_end_ = &entries_[1];

void fidl::internal::NaturalServerDispatcher<::test_inheritance::Sub>::Dispatch(
    ::fidl::Server<::test_inheritance::Sub>* impl,
    ::fidl::IncomingMessage&& msg,
    internal::IncomingTransportContext transport_context,
    ::fidl::Transaction* txn) {
  ::fidl::internal::Dispatch(impl, msg, std::move(transport_context), txn,
                             entries_, entries_end_);
}
void fidl::Server<::test_inheritance::Sub>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<::test_inheritance::Sub>::Dispatch(
      this, std::move(msg), std::move(transport_context), txn);
}
#endif  // __Fuchsia__
