Changed how types are registered

Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
2022-01-05 23:11:12 +02:00
parent 5b22053ff3
commit 82ad4b4bfb
3 changed files with 22 additions and 52 deletions

View File

@@ -42,35 +42,22 @@ typedef struct {
#define DEFINE_DEFAULT_HASH_FUNCTION(T) \
DEFINE_HASH_FUNCTION(T,DEFAULT) { ev_hash_murmur3(self, sizeof(T), seed); }
#define DEFINE_EQUAL_FUNCTION(T,name) bool EQUAL_FUNCTION(T,name)(T *self, T *other)
#define DEFINE_EQUAL_FUNCTION(T,name) bool EQUAL_FUNCTION(T,name)(T *self, T *other)
// NOTE: This shouldn't be used for non-arithmetic types.
#define DEFINE_DEFAULT_EQUAL_FUNCTION(T) \
DEFINE_EQUAL_FUNCTION(T,DEFAULT) { return *self == *other; }
DEFINE_EQUAL_FUNCTION(T,DEFAULT) { return memcmp(self, other, sizeof(T)); }
#define DECLARE_COPY_FUNCTION(T,name) DEFINE_COPY_FUNCTION(T,name);
#define DECLARE_FREE_FUNCTION(T,name) DEFINE_FREE_FUNCTION(T,name);
#define DECLARE_HASH_FUNCTION(T,name) DEFINE_HASH_FUNCTION(T,name);
#define DECLARE_EQUAL_FUNCTION(T,name) DEFINE_EQUAL_FUNCTION(T,name);
#define EV_REGISTER_TYPE(T) \
DEFINE_DEFAULT_COPY_FUNCTION(T) \
DEFINE_DEFAULT_FREE_FUNCTION(T) \
DEFINE_DEFAULT_HASH_FUNCTION(T) \
DEFINE_DEFAULT_EQUAL_FUNCTION(T)
#define EV_TYPEDEF(T, ...) \
typedef __VA_ARGS__ T; \
EV_REGISTER_TYPE(T)
#define TypeData(T) EV_CAT(EV_TYPEDATA_,T)
#define TYPEDATA_GEN(T, ...) \
static const EvTypeData TypeData(T) = { \
EV_DEBUG(.name = EV_STRINGIZE(T),) \
.size = sizeof(T), \
.alignment = EV_ALIGNOF(T), \
.copy_fn = (ev_copy_fn)COPY_FUNCTION(T, DEFAULT), \
.hash_fn = (ev_hash_fn)HASH_FUNCTION(T, DEFAULT), \
.free_fn = (ev_free_fn)FREE_FUNCTION(T, DEFAULT), \
.equal_fn = (ev_equal_fn)EQUAL_FUNCTION(T, DEFAULT), \
.default_val = (void*)&(T){0}, \
.invalid_val = (void*)&(T){0}, \
EV_VA_OPT(__VA_ARGS__)(EV_FOREACH_UDATA(__EV_STRUCT_METHOD_DEF, T, __VA_ARGS__)) \
@@ -92,10 +79,12 @@ typedef struct {
#define __EV_DEFAULT_FN(T, ...) .default_val = (void*)&(T){ __VA_ARGS__ },
#define __EV_INVALID_FN(T, ...) .invalid_val = (void*)&(T){ __VA_ARGS__ },
#define EV_COPY(T) TypeData(T).copy_fn
#define EV_FREE(T) TypeData(T).free_fn
#define EV_HASH(T) TypeData(T).hash_fn
#define EV_EQUAL(T) TypeData(T).equal_fn
#define METHOD_CHECK(...) __VA_ARGS__ EV_DEBUG(?__VA_ARGS__:assert(!EV_STR(__VA_ARGS__)"not defined"))
#define EV_COPY(T) METHOD_CHECK(TypeData(T).copy_fn)
#define EV_FREE(T) METHOD_CHECK(TypeData(T).free_fn)
#define EV_HASH(T) METHOD_CHECK(TypeData(T).hash_fn)
#define EV_EQUAL(T) METHOD_CHECK(TypeData(T).equal_fn)
#define EV_DEFAULT(T) *TypeData(T).default_val
#define EV_INVALID(T) *TypeData(T).invalid_val