From 0d169433a4a37c788ae58ae45a4821e69ee58774 Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Tue, 1 Feb 2022 20:20:43 +0200 Subject: [PATCH] Added default overrides in ev_types Signed-off-by: Robear Selwans --- ev_macros.h | 8 +++----- ev_types.h | 13 ++++++++++--- ev_vec.h | 5 ++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ev_macros.h b/ev_macros.h index f61b825..5ac2696 100644 --- a/ev_macros.h +++ b/ev_macros.h @@ -41,15 +41,14 @@ #if ( EV_CC_MSVC ) # define EV_WARNING_DISABLE_MSVC(w) EV_PRAGMA(warning(disable:w)) +# define EV_WARNING_DISABLE_CLANG(...) +# define EV_WARNING_DISABLE_GCC(...) # define EV_WARNING_PUSH() EV_PRAGMA(warning(push)) # define EV_WARNING_POP() EV_PRAGMA(warning(pop)) # define EV_EXPORT __declspec(dllexport) # define EV_IMPORT __declspec(dllimport) # define EV_UNUSED # define EV_FORCEINLINE __forceinline - -# define EV_WARNING_DISABLE_CLANG(...) -# define EV_WARNING_DISABLE_GCC(...) #elif ( EV_CC_GCC || EV_CC_CLANG ) # define EV_EXPORT __attribute__((visibility("default"))) # define EV_IMPORT @@ -66,8 +65,7 @@ # endif # define EV_WARNING_PUSH() EV_PRAGMA(EV_PRAGMA_CC_NAME diagnostic push) # define EV_WARNING_POP() EV_PRAGMA(EV_PRAGMA_CC_NAME diagnostic pop) - -#define EV_WARNING_DISABLE_MSVC() +# define EV_WARNING_DISABLE_MSVC(...) #else # error "Unknown Compiler" #endif diff --git a/ev_types.h b/ev_types.h index 0baf3fb..b119194 100644 --- a/ev_types.h +++ b/ev_types.h @@ -52,8 +52,8 @@ typedef struct { #define DECLARE_HASH_FUNCTION(T,name) DEFINE_HASH_FUNCTION(T,name); #define DECLARE_EQUAL_FUNCTION(T,name) DEFINE_EQUAL_FUNCTION(T,name); +#define EV_OVERRIDE_VAR(T) EV_CAT(__ev_internal_override_var_,T) #define TypeData(T) EV_CAT(EV_TYPEDATA_,T) -#define TYPEDATA_STRUCT_FROM_(T) #define TYPEDATA_GEN(T, ...) \ EV_WARNING_PUSH(); \ EV_WARNING_DISABLE_GCC("override-init"); \ @@ -66,7 +66,8 @@ typedef struct { .invalid_val = (void*)&(T){0}, \ EV_VA_OPT(__VA_ARGS__)(EV_FOREACH_UDATA(__EV_STRUCT_METHOD_DEF, T, __VA_ARGS__)) \ }; \ - EV_WARNING_POP() + EV_WARNING_POP(); \ + EV_UNUSED static T EV_OVERRIDE_VAR(T) #define __EV_STRUCT_METHOD_DEF(T, ...) EV_CAT(__EV_,EV_CAT(EV_HEAD __VA_ARGS__,_FN))(T, EV_TAIL __VA_ARGS__) @@ -90,7 +91,13 @@ typedef struct { #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) (*(T*)TypeData(T).default_val) +#define __EV_OVERRIDE_DEFAULT(T, ...) EV_OVERRIDE_VAR(T).__VA_ARGS__, +#define __EV_DEFAULT_INTERNAL(T) (*(T*)TypeData(T).default_val) +#define EV_DEFAULT(T, ...) EV_VA_OPT_ELSE(__VA_ARGS__) \ + ((EV_OVERRIDE_VAR(T)=__EV_DEFAULT_INTERNAL(T), \ + EV_FOREACH_UDATA(__EV_OVERRIDE_DEFAULT, T, __VA_ARGS__) \ + EV_OVERRIDE_VAR(T))) \ + (__EV_DEFAULT_INTERNAL(T)) #define EV_INVALID(T) (*(T*)TypeData(T).invalid_val) #endif // EV_HEADERS_TYPES_H diff --git a/ev_vec.h b/ev_vec.h index 8254380..bcb5031 100644 --- a/ev_vec.h +++ b/ev_vec.h @@ -132,9 +132,8 @@ ev_vec_init_impl( #define ev_svec_init(T, ...) __ev_svec_init_impl(T, EV_ARRSIZE((T[])__VA_ARGS__), __VA_ARGS__) #define ev_svec_init_w_cap(T, cap) __ev_svec_init_w_cap_impl(T, cap) -#define __ev_svec_structname(T) EV_CAT(EV_CAT(svec_type_##T##_,__COUNTER__),__LINE__) #define __ev_svec_init_impl(T, len, ...) \ - (ev_svec(T))&((struct __ev_svec_structname(T) { \ + (ev_svec(T))&((struct { \ struct ev_vec_meta_t meta; \ EV_ALIGNAS(EV_ALIGNOF(T)) T data[len]; \ }) { \ @@ -147,7 +146,7 @@ ev_vec_init_impl( }).data #define __ev_svec_init_w_cap_impl(T, cap) \ - (ev_svec(T))&((struct __ev_svec_structname(T) { \ + (ev_svec(T))&((struct { \ struct ev_vec_meta_t meta; \ EV_ALIGNAS(EV_ALIGNOF(T)) T data[cap]; \ }) { \