#include <fidl/test.handles/cpp/driver/natural_messaging.h>
#ifdef __Fuchsia__

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#ifdef __Fuchsia__

constexpr ::fidl::internal::MethodEntry fidl::internal::NaturalServerDispatcher<
    ::test_handles::DriverProtocol>::entries_[] = {};

const ::fidl::internal::MethodEntry* fidl::internal::NaturalServerDispatcher<
    ::test_handles::DriverProtocol>::entries_end_ = &entries_[0];

void fidl::internal::NaturalServerDispatcher<::test_handles::DriverProtocol>::
    Dispatch(::fdf::Server<::test_handles::DriverProtocol>* 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 fdf::Server<::test_handles::DriverProtocol>::dispatch_message(
    ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
    ::fidl::internal::IncomingTransportContext transport_context) {
  ::fidl::internal::NaturalServerDispatcher<
      ::test_handles::DriverProtocol>::Dispatch(this, std::move(msg),
                                                std::move(transport_context),
                                                txn);
}
#endif  // __Fuchsia__
