Added default overrides in ev_types

Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
2022-02-01 20:20:43 +02:00
parent f78561ab59
commit 0d169433a4
3 changed files with 15 additions and 11 deletions

View File

@@ -41,15 +41,14 @@
#if ( EV_CC_MSVC ) #if ( EV_CC_MSVC )
# define EV_WARNING_DISABLE_MSVC(w) EV_PRAGMA(warning(disable:w)) # 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_PUSH() EV_PRAGMA(warning(push))
# define EV_WARNING_POP() EV_PRAGMA(warning(pop)) # define EV_WARNING_POP() EV_PRAGMA(warning(pop))
# define EV_EXPORT __declspec(dllexport) # define EV_EXPORT __declspec(dllexport)
# define EV_IMPORT __declspec(dllimport) # define EV_IMPORT __declspec(dllimport)
# define EV_UNUSED # define EV_UNUSED
# define EV_FORCEINLINE __forceinline # define EV_FORCEINLINE __forceinline
# define EV_WARNING_DISABLE_CLANG(...)
# define EV_WARNING_DISABLE_GCC(...)
#elif ( EV_CC_GCC || EV_CC_CLANG ) #elif ( EV_CC_GCC || EV_CC_CLANG )
# define EV_EXPORT __attribute__((visibility("default"))) # define EV_EXPORT __attribute__((visibility("default")))
# define EV_IMPORT # define EV_IMPORT
@@ -66,8 +65,7 @@
# endif # endif
# define EV_WARNING_PUSH() EV_PRAGMA(EV_PRAGMA_CC_NAME diagnostic push) # 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_POP() EV_PRAGMA(EV_PRAGMA_CC_NAME diagnostic pop)
# define EV_WARNING_DISABLE_MSVC(...)
#define EV_WARNING_DISABLE_MSVC()
#else #else
# error "Unknown Compiler" # error "Unknown Compiler"
#endif #endif

View File

@@ -52,8 +52,8 @@ typedef struct {
#define DECLARE_HASH_FUNCTION(T,name) DEFINE_HASH_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 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(T) EV_CAT(EV_TYPEDATA_,T)
#define TYPEDATA_STRUCT_FROM_(T)
#define TYPEDATA_GEN(T, ...) \ #define TYPEDATA_GEN(T, ...) \
EV_WARNING_PUSH(); \ EV_WARNING_PUSH(); \
EV_WARNING_DISABLE_GCC("override-init"); \ EV_WARNING_DISABLE_GCC("override-init"); \
@@ -66,7 +66,8 @@ typedef struct {
.invalid_val = (void*)&(T){0}, \ .invalid_val = (void*)&(T){0}, \
EV_VA_OPT(__VA_ARGS__)(EV_FOREACH_UDATA(__EV_STRUCT_METHOD_DEF, T, __VA_ARGS__)) \ 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__) #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_FREE(T) METHOD_CHECK(TypeData(T).free_fn)
#define EV_HASH(T) METHOD_CHECK(TypeData(T).hash_fn) #define EV_HASH(T) METHOD_CHECK(TypeData(T).hash_fn)
#define EV_EQUAL(T) METHOD_CHECK(TypeData(T).equal_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) #define EV_INVALID(T) (*(T*)TypeData(T).invalid_val)
#endif // EV_HEADERS_TYPES_H #endif // EV_HEADERS_TYPES_H

View File

@@ -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(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_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, ...) \ #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; \ struct ev_vec_meta_t meta; \
EV_ALIGNAS(EV_ALIGNOF(T)) T data[len]; \ EV_ALIGNAS(EV_ALIGNOF(T)) T data[len]; \
}) { \ }) { \
@@ -147,7 +146,7 @@ ev_vec_init_impl(
}).data }).data
#define __ev_svec_init_w_cap_impl(T, cap) \ #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; \ struct ev_vec_meta_t meta; \
EV_ALIGNAS(EV_ALIGNOF(T)) T data[cap]; \ EV_ALIGNAS(EV_ALIGNOF(T)) T data[cap]; \
}) { \ }) { \