#include <panda/unievent/backend/uv.h>
#include "UVBackend.h"
#include "UVUdp.h"
#include "UVTcp.h"
#include "UVTty.h"
#include "UVIdle.h"
#include "UVPoll.h"
#include "UVPipe.h"
#include "UVWork.h"
#include "UVTimer.h"
#include "UVCheck.h"
#include "UVAsync.h"
#include "UVSignal.h"
#include "UVDelayer.h"
#include "UVPrepare.h"
#include "UVFsEvent.h"

namespace panda { namespace unievent { namespace backend {

static uv::UVBackend _backend;

Backend* UV = &_backend;

}}}

namespace panda { namespace unievent { namespace backend { namespace uv {

TimerImpl*   UVLoop::new_timer     (ITimerImplListener* l)                      { return new UVTimer(this, l); }
PrepareImpl* UVLoop::new_prepare   (IPrepareImplListener* l)                    { return new UVPrepare(this, l); }
CheckImpl*   UVLoop::new_check     (ICheckImplListener* l)                      { return new UVCheck(this, l); }
IdleImpl*    UVLoop::new_idle      (IIdleImplListener* l)                       { return new UVIdle(this, l); }
AsyncImpl*   UVLoop::new_async     (IAsyncImplListener* l)                      { return new UVAsync(this, l); }
SignalImpl*  UVLoop::new_signal    (ISignalImplListener* l)                     { return new UVSignal(this, l); }
PollImpl*    UVLoop::new_poll_sock (IPollImplListener* l, sock_t sock)          { return new UVPoll(this, l, sock); }
PollImpl*    UVLoop::new_poll_fd   (IPollImplListener* l, int fd)               { return new UVPoll(this, l, fd, nullptr); }
UdpImpl*     UVLoop::new_udp       (IUdpImplListener* l, int domain, int flags) { return new UVUdp(this, l, domain, flags); }
PipeImpl*    UVLoop::new_pipe      (IStreamImplListener* l, bool ipc)           { return new UVPipe(this, l, ipc); }
TcpImpl*     UVLoop::new_tcp       (IStreamImplListener* l, int domain)         { return new UVTcp(this, l, domain); }
TtyImpl*     UVLoop::new_tty       (IStreamImplListener* l, fd_t fd)            { return new UVTty(this, l, fd); }
WorkImpl*    UVLoop::new_work      (IWorkImplListener* l)                       { return new UVWork(this, l); }
FsEventImpl* UVLoop::new_fs_event  (IFsEventImplListener* l)                    { return new UVFsEvent(this, l); }

}}}}