#pragma once #include "BackendHandle.h" #include "backend/PollImpl.h" namespace panda { namespace unievent { struct IPollListener { virtual void on_poll (const PollSP&, int events, const std::error_code&) = 0; }; struct IPollSelfListener : IPollListener { virtual void on_poll (int events, const std::error_code&) = 0; void on_poll (const PollSP&, int events, const std::error_code& err) override { on_poll(events, err); } }; struct Poll : virtual BackendHandle, private backend::IPollImplListener { using poll_fptr = void(const PollSP& handle, int events, const std::error_code& err); using poll_fn = panda::function; enum { READABLE = 1, WRITABLE = 2, PRIORITIZED = 4, DISCONNECT = 8, }; struct Socket { sock_t val; }; struct Fd { int val; }; CallbackDispatcher event; static PollSP create (Socket, int events, const poll_fn&, const LoopSP& = Loop::default_loop(), Ownership = Ownership::TRANSFER); static PollSP create (Fd , int events, const poll_fn&, const LoopSP& = Loop::default_loop(), Ownership = Ownership::TRANSFER); Poll (Socket, const LoopSP& = Loop::default_loop(), Ownership = Ownership::TRANSFER); Poll (Fd , const LoopSP& = Loop::default_loop(), Ownership = Ownership::TRANSFER); const HandleType& type () const override; IPollListener* event_listener () const { return _listener; } void event_listener (IPollListener* l) { _listener = l; } virtual excepted start (int events, const poll_fn& = {}); virtual excepted stop (); void reset () override; void clear () override; void call_now (int events, const std::error_code& err = {}) { handle_poll(events, err); } excepted fileno () const { return _impl ? handle_fd_excepted(impl()->fileno()) : fh_t(); } static const HandleType TYPE; private: IPollListener* _listener; void handle_poll (int events, const std::error_code& err) override; backend::PollImpl* impl () const { return static_cast(_impl); } }; }}