feat: added MessageReceiver trait

This commit is contained in:
Sara 2023-11-27 17:38:54 +01:00
parent 163fac8f02
commit a4253abfa1
2 changed files with 49 additions and 0 deletions

View file

@ -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};
}

View file

@ -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