diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-10-31 21:01:08 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-10-31 21:01:08 -0400 |
| commit | e4d71f20517488dd48cec43a870af496b0f90c5b (patch) | |
| tree | 4518595f17b62bcd697904d247d1fe5baa063ca6 /pkev.h | |
| parent | b79beeafcb2feec7fbf830034ddcd61e03297283 (diff) | |
pkev: checkpoint: create
Diffstat (limited to 'pkev.h')
| -rw-r--r-- | pkev.h | 93 |
1 files changed, 93 insertions, 0 deletions
@@ -0,0 +1,93 @@ +#ifndef PK_EV_H +#define PK_EV_H + +#include <stdint.h> + +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 <assert.h> +#include <stdlib.h> +#include <string.h> + +#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 |
