From 82ad4b4bfb541c64216f6738964f5d11907c2813 Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Wed, 5 Jan 2022 23:11:12 +0200 Subject: [PATCH] Changed how types are registered Signed-off-by: Robear Selwans --- ev_numeric.h | 21 ++------------------- ev_types.h | 29 +++++++++-------------------- ev_vec.h | 24 +++++++++++------------- 3 files changed, 22 insertions(+), 52 deletions(-) diff --git a/ev_numeric.h b/ev_numeric.h index 1860315..95e8a78 100644 --- a/ev_numeric.h +++ b/ev_numeric.h @@ -5,36 +5,19 @@ #include "ev_types.h" // Signed integers -EV_REGISTER_TYPE(i8); -TYPEDATA_GEN(i8, DEFAULT(0)); - -EV_REGISTER_TYPE(i16); +TYPEDATA_GEN(i8 , DEFAULT(0)); TYPEDATA_GEN(i16, DEFAULT(0)); - -EV_REGISTER_TYPE(i32); TYPEDATA_GEN(i32, DEFAULT(0)); - -EV_REGISTER_TYPE(i64); TYPEDATA_GEN(i64, DEFAULT(0)); // Unsigned integers -EV_REGISTER_TYPE(u8); -TYPEDATA_GEN(u8, DEFAULT(0)); - -EV_REGISTER_TYPE(u16); +TYPEDATA_GEN(u8 , DEFAULT(0)); TYPEDATA_GEN(u16, DEFAULT(0)); - -EV_REGISTER_TYPE(u32); TYPEDATA_GEN(u32, DEFAULT(0)); - -EV_REGISTER_TYPE(u64); TYPEDATA_GEN(u64, DEFAULT(0)); // Floating-Point Numbers -EV_REGISTER_TYPE(f32); TYPEDATA_GEN(f32, DEFAULT(0.0f)); - -EV_REGISTER_TYPE(f64); TYPEDATA_GEN(f64, DEFAULT(0.0)); struct Int8Data { i8 MIN; i8 MAX; }; diff --git a/ev_types.h b/ev_types.h index 2192d86..8dd28d7 100644 --- a/ev_types.h +++ b/ev_types.h @@ -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 diff --git a/ev_vec.h b/ev_vec.h index 9cfba9e..183f4d9 100644 --- a/ev_vec.h +++ b/ev_vec.h @@ -30,24 +30,22 @@ #define EV_VEC_GROWTH_RATE 3 / 2 #endif -EV_TYPEDEF(ev_vec_t, void *); -TYPEDATA_GEN(ev_vec_t); -EV_TYPEDEF(ev_svec_t, void *); -TYPEDATA_GEN(ev_svec_t); +typedef void *ev_vec_t; +TYPEDATA_GEN(ev_vec_t, INVALID(0)); +typedef void *ev_svec_t; +TYPEDATA_GEN(ev_svec_t, INVALID(0)); -EV_TYPEDEF(ev_vec_error_t, enum { +typedef enum { EV_VEC_ERR_NONE = 0, - EV_VEC_ERR_OOM = 1, -}); + EV_VEC_ERR_OOM = 1 +} ev_vec_error_t; +TYPEDATA_GEN(ev_vec_error_t, DEFAULT(EV_VEC_ERR_NONE)); #if defined(EV_VEC_SHORTNAMES) -EV_TYPEDEF(vec_t, ev_vec_t); -TYPEDATA_GEN(vec_t); -EV_TYPEDEF(svec_t, ev_svec_t); -TYPEDATA_GEN(svec_t); +#define vec_t ev_vec_t +#define svec_t ev_svec_t -EV_TYPEDEF(vec_error_t, ev_vec_error_t); -TYPEDATA_GEN(vec_error_t); +#define vec_error_t ev_vec_error_t # define vec(T) ev_vec(T) # define svec(T) ev_svec(T)