#ifndef PK_EV_H #define PK_EV_H #include struct pk_ev_mgr; typedef uint64_t pk_ev_id_T; struct pk_ev_mgr *pk_ev_create(); void pk_ev_destroy(struct pk_ev_mgr *evmgr); typedef void (*pk_ev_cb)(); void pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid); void pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb); void pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...); #endif /* PK_EV_H */ #ifdef PK_IMPL_EV #include #include #include #ifndef PK_EV_MAX_COUNT # define PK_EV_MAX_COUNT 16 #endif struct pk_ev { pk_ev_id_T evid; pk_ev_cb **cb; uint8_t n_cb; }; struct pk_ev_mgr { struct pk_ev *ev; uint8_t n_ev; }; inline struct pk_ev_mgr* pk_ev_create() { struct pk_ev_mgr *mgr = (struct pk_ev_mgr*)malloc(sizeof(struct pk_ev_mgr)); if (mgr == NULL) return NULL; memset(mgr, 0, sizeof(struct pk_ev_mgr)); mgr->ev = (struct pk_ev*)malloc(sizeof(struct pk_ev) * PK_EV_MAX_COUNT); if (mgr->ev == NULL) return NULL; memset(mgr->ev, 0, sizeof(struct pk_ev) * PK_EV_MAX_COUNT); mgr->n_ev = 0; return mgr; } inline void pk_ev_destroy(struct pk_ev_mgr *evmgr) { memset(evmgr->ev, 0, sizeof(struct pk_ev) * PK_EV_MAX_COUNT); free(evmgr->ev); memset(evmgr, 0, sizeof(struct pk_ev_mgr)); free(evmgr); } inline void pk_ev_register_ev(struct pk_ev_mgr *evmgr, pk_ev_id_T evid) { // TODO } inline void pk_ev_register_cb(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, pk_ev_cb *cb) { // TODO } inline void pk_ev_emit(struct pk_ev_mgr *evmgr, pk_ev_id_T evid, ...) { assert(evmgr != NULL); uint8_t i; struct pk_ev *ev = {0}; for (i = 0; i < evmgr->n_ev; ++i) { if (evmgr->ev[i].evid == evid) { ev = &evmgr->ev[i]; break; } } if (ev == NULL) return; for (i = 0; i < ev->n_cb; ++i) { (*ev->cb[i])(); } } #endif