feat: added MessageReceiver trait
This commit is contained in:
parent
163fac8f02
commit
a4253abfa1
13
core/src/message_receiver.c
Normal file
13
core/src/message_receiver.c
Normal 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};
|
||||||
|
}
|
36
core/src/message_receiver.h
Normal file
36
core/src/message_receiver.h
Normal 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
|
Loading…
Reference in a new issue