#ifndef WEPOLL_H_
#define WEPOLL_H_
#ifndef WEPOLL_EXPORT
#define WEPOLL_EXPORT
#endif
#include <stdint.h>
enum EPOLL_EVENTS
{
    EPOLLIN = (int)(1U << 0),
    EPOLLPRI = (int)(1U << 1),
    EPOLLOUT = (int)(1U << 2),
    EPOLLERR = (int)(1U << 3),
    EPOLLHUP = (int)(1U << 4),
    EPOLLRDNORM = (int)(1U << 6),
    EPOLLRDBAND = (int)(1U << 7),
    EPOLLWRNORM = (int)(1U << 8),
    EPOLLWRBAND = (int)(1U << 9),
    EPOLLMSG = (int)(1U << 10), 
    EPOLLRDHUP = (int)(1U << 13),
    EPOLLEVENT = (int)(1U << 14),
    EPOLLONESHOT = (int)(1U << 31)
};
#define EPOLLIN (1U << 0)
#define EPOLLPRI (1U << 1)
#define EPOLLOUT (1U << 2)
#define EPOLLERR (1U << 3)
#define EPOLLHUP (1U << 4)
#define EPOLLRDNORM (1U << 6)
#define EPOLLRDBAND (1U << 7)
#define EPOLLWRNORM (1U << 8)
#define EPOLLWRBAND (1U << 9)
#define EPOLLMSG (1U << 10)
#define EPOLLRDHUP (1U << 13)
#define EPOLLEVENT (1U << 14)
#define EPOLLONESHOT (1U << 31)
#define EPOLL_CTL_ADD 1
#define EPOLL_CTL_MOD 2
#define EPOLL_CTL_DEL 3
typedef void* HANDLE;
typedef uintptr_t SOCKET;
typedef union epoll_data
{
    void* ptr;
    int fd;
    uint32_t u32;
    uint64_t u64;
    SOCKET sock; 
    HANDLE hnd;  
} epoll_data_t;
struct epoll_event
{
    uint32_t events;   
    epoll_data_t data; 
};
#ifdef __cplusplus
extern "C"
{
#endif
    WEPOLL_EXPORT HANDLE epoll_create(int size);
    WEPOLL_EXPORT HANDLE epoll_create1(int flags);
    WEPOLL_EXPORT int epoll_close(HANDLE ephnd);
    WEPOLL_EXPORT int epoll_ctl(HANDLE ephnd,
                                int op,
                                SOCKET sock,
                                struct epoll_event* event);
    WEPOLL_EXPORT int epoll_wait(HANDLE ephnd,
                                 struct epoll_event* events,
                                 int maxevents,
                                 int timeout);
    WEPOLL_EXPORT void epoll_post_signal(HANDLE ephnd, uint64_t event);
#ifdef __cplusplus
} 
#endif
#endif 