From a4253abfa1bc50d98465f62d130bfa056fe80696 Mon Sep 17 00:00:00 2001 From: Sara Date: Mon, 27 Nov 2023 17:38:54 +0100 Subject: [PATCH] feat: added MessageReceiver trait --- core/src/message_receiver.c | 13 +++++++++++++ core/src/message_receiver.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 core/src/message_receiver.c create mode 100644 core/src/message_receiver.h diff --git a/core/src/message_receiver.c b/core/src/message_receiver.c new file mode 100644 index 0000000..ea56b3a --- /dev/null +++ b/core/src/message_receiver.c @@ -0,0 +1,13 @@ +#include "message_receiver.h" +#include "stddef.h" + +void* message_receiver_refuse(void* self, MessageID id, void* data) { + return NULL; +} + +MessageReceiver message_receiver_no_implementation(void* data) { + static IMessageReceiver const tc = { + .handle_message = message_receiver_refuse + }; + return (MessageReceiver){.data = data, .tc = &tc}; +} diff --git a/core/src/message_receiver.h b/core/src/message_receiver.h new file mode 100644 index 0000000..a460801 --- /dev/null +++ b/core/src/message_receiver.h @@ -0,0 +1,36 @@ +#ifndef _fencer_message_receiver_h +#define _fencer_message_receiver_h + +#include "stdint.h" +#include "typeclass_helpers.h" + +typedef uint32_t MessageID; + +typedef struct IMessageReceiver { + void* (*const handle_message)(void*, MessageID, void*); +} IMessageReceiver; + +typedef struct MessageReceiver { + void* data; + IMessageReceiver const* tc; +} MessageReceiver; + +extern void* message_receiver_refuse(void* self, MessageID id, void* data); + +extern MessageReceiver message_receiver_no_implementation(void* x); + +#define impl_no_MessageReceiver_for(T)\ +static inline MessageReceiver T##_as_MessageReceiver(T* x) {\ + return message_receiver_no_implementation(x);\ +} + +#define impl_MessageReceiver_for(T, handle_message_f)\ +static inline MessageReceiver T##_as_MessageReceiver(T* x) {\ + TC_FN_TYPECHECK(void*, handle_message_f, T*, MessageID, void*);\ + static IMessageReceiver const tc = {\ + .handle_message = (void*(*const)(void*,MessageID,void*)) handle_message_f,\ + };\ + return (MessageReceiver){.data = x, .tc = &tc};\ +} + +#endif // !_fencer_message_receiver_h