Last active
May 3, 2023 08:45
-
-
Save kaneel/3ef0cc28ad3e82e89dba7572ff814109 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
typedef char EventName[255]; | |
typedef union HandlerData { | |
int i; | |
float f; | |
char str[255]; | |
} HandlerData; | |
typedef void (*EventHandler)(EventName event, HandlerData *data); | |
typedef struct EventItem { | |
EventName *name; | |
EventHandler handler; | |
HandlerData *data; | |
} EventItem; | |
typedef struct EventBus { | |
EventItem *events; | |
unsigned int maxEvents; | |
unsigned int cursorEvents; | |
} EventBus; | |
void handler(EventName event, HandlerData *data) { | |
printf("yes $%s %f\n", event, data->f); | |
} | |
void handler2(EventName event, HandlerData *data) { | |
printf("no $%s %d\n", event, data->i); | |
} | |
EventBus EventBus_init() { | |
EventItem *events = malloc(1 * sizeof(EventItem)); | |
EventBus bus = { events, 0, 0 }; | |
return bus; | |
} | |
void EventBus_addEvent(EventBus *bus, EventName *name, EventHandler handler, HandlerData *data) { | |
if (bus->cursorEvents == bus->maxEvents) { | |
EventItem *events = bus->events; | |
bus->events = realloc(events, sizeof(EventItem) * (bus->maxEvents++ + 1)); | |
} | |
bus->events[bus->cursorEvents++] = (EventItem) { | |
.name = name, | |
.handler = handler, | |
.data = data | |
}; | |
} | |
void moveEvents(EventItem *events, unsigned int start, unsigned int max) { | |
if ( start < max) | |
for (unsigned int i = start; i < max; i++) { | |
events[i] = events[i + 1]; | |
} | |
} | |
void EventBus_removeEvent(EventBus *bus, EventName *name, EventHandler handler) { | |
EventItem *events = bus->events; | |
unsigned int counter = 0; | |
for (unsigned int i = 0; i < bus->maxEvents; i++) { | |
EventItem event = events[i]; | |
if (event.name == name && event.handler == handler) { | |
counter += 1; | |
moveEvents(events, i, bus->maxEvents - 1); | |
} | |
} | |
if (counter > 0) { | |
bus->maxEvents = bus->maxEvents - counter; | |
bus->cursorEvents = bus->maxEvents; | |
bus->events = realloc(events, sizeof(EventItem) * (bus->maxEvents)); | |
} | |
} | |
void EventBus_triggerEvent(EventBus *bus, EventName *name) { | |
for (unsigned int i = 0; i < bus->maxEvents; i++) { | |
EventItem event = bus->events[i]; | |
if (event.name == name) { | |
event.handler(*event.name, event.data); | |
} | |
} | |
} | |
int main() { | |
EventBus bus = EventBus_init(); | |
EventName name = "test/1"; | |
EventName name2 = "test/2"; | |
HandlerData data = { .f = 2.0 }; | |
HandlerData data2 = { .i = 0 }; | |
EventBus_addEvent(&bus, &name, &handler, &data); | |
EventBus_addEvent(&bus, &name2, &handler2, &data2); | |
EventBus_triggerEvent(&bus, &name); | |
EventBus_removeEvent(&bus, &name, &handler); | |
EventBus_triggerEvent(&bus, &name); | |
data2.i = 2; | |
EventBus_triggerEvent(&bus, &name2); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment