/* This software is licensed by the MIT License, see LICENSE file */ /* Copyright © 2022 Gregory Lirent */ #ifndef LIBCDSB_CORE_GENERICS_H #define LIBCDSB_CORE_GENERICS_H #define vtypeof(x) (vtype)(_Generic((x),\ const void*: VTYPE_POINTER, void*: VTYPE_POINTER,\ const char**: VTYPE_STRING, char**: VTYPE_STRING,\ const vtype_string*: VTYPE_STRING, vtype_string*: VTYPE_STRING,\ const vtype_array*: VTYPE_ARRAY, vtype_array*: VTYPE_ARRAY,\ const vtype_list*: VTYPE_LIST, vtype_list*: VTYPE_LIST,\ const vtype_map*: VTYPE_MAP, vtype_map*: VTYPE_MAP,\ const vtype_set*: VTYPE_SET, vtype_set*: VTYPE_SET,\ const vtype_dict*: VTYPE_DICT, vtype_dict*: VTYPE_DICT,\ vtype_bool: VTYPE_BOOLEAN,\ vtype_uint8: VTYPE_UINT8,\ vtype_uint16: VTYPE_UINT16,\ vtype_uint32: VTYPE_UINT32,\ vtype_uint64: VTYPE_UINT64,\ vtype_int8: VTYPE_INT8,\ vtype_int16: VTYPE_INT16,\ vtype_int32: VTYPE_INT32,\ vtype_int64: VTYPE_INT64,\ vtype_float: VTYPE_FLOAT,\ vtype_double: VTYPE_DOUBLE,\ vtype_ldouble: VTYPE_LDOUBLE)) #define _LIBCDSB_vtypeof(x) vtypeof(_Generic((x), default: (x), const char*: &(x), char*: &(x))) #define _LIBCDSB_value_pointer(x) _Generic((x), default: &(x),\ vtype_string*: (x), const vtype_string*: (x),\ vtype_array*: (x), const vtype_array*: (x),\ vtype_list*: (x), const vtype_list*: (x),\ vtype_map*: (x), const vtype_map*: (x),\ vtype_set*: (x), const vtype_set*: (x),\ vtype_dict*: (x), const vtype_dict*: (x)) #define _LIBCDSB_Generic(T, f, v) _Generic((v),\ void*: T ## _ ## f ## _pointer, const void*: T ## _ ## f ## _pointer,\ char*: T ## _ ## f ## _cstring, const char*: T ## _ ## f ## _cstring,\ vtype_string*: T ## _ ## f ## _string, const vtype_string*: T ## _ ## f ## _string,\ vtype_array*: T ## _ ## f ## _array, const vtype_array*: T ## _ ## f ## _array,\ vtype_list*: T ## _ ## f ## _list, const vtype_list*: T ## _ ## f ## _list,\ vtype_map*: T ## _ ## f ## _map, const vtype_map*: T ## _ ## f ## _map,\ vtype_set*: T ## _ ## f ## _vset, const vtype_set*: T ## _ ## f ## _vset,\ vtype_dict*: T ## _ ## f ## _dict, const vtype_dict*: T ## _ ## f ## _dict,\ vtype_bool: T ## _ ## f ## _boolean,\ vtype_uint8: T ## _ ## f ## _uint8,\ vtype_uint16: T ## _ ## f ## _uint16,\ vtype_uint32: T ## _ ## f ## _uint32,\ vtype_uint64: T ## _ ## f ## _uint64,\ vtype_int8: T ## _ ## f ## _int8,\ vtype_int16: T ## _ ## f ## _int16,\ vtype_int32: T ## _ ## f ## _int32,\ vtype_int64: T ## _ ## f ## _int64,\ vtype_float: T ## _ ## f ## _float,\ vtype_double: T ## _ ## f ## _double,\ vtype_ldouble: T ## _ ## f ## _ldouble\ ) #define _LIBCDSB_Generic2(T, f, k, v) _Generic((k),\ void*: _LIBCDSB_Generic(T, f ## _pointer, v), const void*: _LIBCDSB_Generic(T, f ## _pointer, v),\ char*: _LIBCDSB_Generic(T, f ## _cstring, v), const char*: _LIBCDSB_Generic(T, f ## _cstring, v),\ vtype_string*: _LIBCDSB_Generic(T, f ## _string, v), const vtype_string*: _LIBCDSB_Generic(T, f ## _string, v),\ vtype_array*: _LIBCDSB_Generic(T, f ## _array, v), const vtype_array*: _LIBCDSB_Generic(T, f ## _array, v),\ vtype_list*: _LIBCDSB_Generic(T, f ## _list, v), const vtype_list*: _LIBCDSB_Generic(T, f ## _list, v),\ vtype_map*: _LIBCDSB_Generic(T, f ## _map, v), const vtype_map*: _LIBCDSB_Generic(T, f ## _map, v),\ vtype_set*: _LIBCDSB_Generic(T, f ## _vset, v), const vtype_set*: _LIBCDSB_Generic(T, f ## _vset, v),\ vtype_dict*: _LIBCDSB_Generic(T, f ## _dict, v), const vtype_dict*: _LIBCDSB_Generic(T, f ## _dict, v),\ vtype_bool: _LIBCDSB_Generic(T, f ## _boolean, v),\ vtype_uint8: _LIBCDSB_Generic(T, f ## _uint8, v),\ vtype_uint16: _LIBCDSB_Generic(T, f ## _uint16, v),\ vtype_uint32: _LIBCDSB_Generic(T, f ## _uint32, v),\ vtype_uint64: _LIBCDSB_Generic(T, f ## _uint64, v),\ vtype_int8: _LIBCDSB_Generic(T, f ## _int8, v),\ vtype_int16: _LIBCDSB_Generic(T, f ## _int16, v),\ vtype_int32: _LIBCDSB_Generic(T, f ## _int32, v),\ vtype_int64: _LIBCDSB_Generic(T, f ## _int64, v),\ vtype_float: _LIBCDSB_Generic(T, f ## _float, v),\ vtype_double: _LIBCDSB_Generic(T, f ## _double, v),\ vtype_ldouble: _LIBCDSB_Generic(T, f ## _ldouble, v)\ ) #define _LIBCDSB_Generic_attach(T, ins_f, att_f, v) _Generic((v),\ void*: T ## _ ## ins_f ## _pointer, const void*: T ## _ ## ins_f ## _pointer,\ char*: T ## _ ## ins_f ## _cstring, const char*: T ## _ ## ins_f ## _cstring,\ vtype_string*: T ## _ ## att_f ## _string, const vtype_string*: T ## _ ## att_f ## _string,\ vtype_array*: T ## _ ## att_f ## _array, const vtype_array*: T ## _ ## att_f ## _array,\ vtype_list*: T ## _ ## att_f ## _list, const vtype_list*: T ## _ ## att_f ## _list,\ vtype_map*: T ## _ ## att_f ## _map, const vtype_map*: T ## _ ## att_f ## _map,\ vtype_set*: T ## _ ## att_f ## _vset, const vtype_set*: T ## _ ## att_f ## _vset,\ vtype_dict*: T ## _ ## att_f ## _dict, const vtype_dict*: T ## _ ## att_f ## _dict,\ vtype_bool: T ## _ ## ins_f ## _boolean,\ vtype_uint8: T ## _ ## ins_f ## _uint8,\ vtype_uint16: T ## _ ## ins_f ## _uint16,\ vtype_uint32: T ## _ ## ins_f ## _uint32,\ vtype_uint64: T ## _ ## ins_f ## _uint64,\ vtype_int8: T ## _ ## ins_f ## _int8,\ vtype_int16: T ## _ ## ins_f ## _int16,\ vtype_int32: T ## _ ## ins_f ## _int32,\ vtype_int64: T ## _ ## ins_f ## _int64,\ vtype_float: T ## _ ## ins_f ## _float,\ vtype_double: T ## _ ## ins_f ## _double,\ vtype_ldouble: T ## _ ## ins_f ## _ldouble\ ) #define _LIBCDSB_GenericS(T, f, v) _Generic((v),\ void*: T ## _ ## f ## _cstring, const void*: T ## _ ## f ## _cstring,\ char*: T ## _ ## f ## _cstring, const char*: T ## _ ## f ## _cstring,\ vtype_string*: T ## _ ## f ## _string, const vtype_string*: T ## _ ## f ## _string,\ int: T ## _ ## f ## _char, unsigned int: T ## _ ## f ## _char,\ char: T ## _ ## f ## _char, unsigned char: T ## _ ## f ## _char,\ short: T ## _ ## f ## _char, unsigned short: T ## _ ## f ## _char\ ) #define _LIBCDSB_GenericS2(T, f, s, d) _Generic((s),\ void*: _LIBCDSB_GenericS(T, f ## _cstring, d), const void*: _LIBCDSB_GenericS(T, f ## _cstring, d),\ char*: _LIBCDSB_GenericS(T, f ## _cstring, d), const char*: _LIBCDSB_GenericS(T, f ## _cstring, d),\ vtype_string*: _LIBCDSB_GenericS(T, f ## _string, d), const vtype_string*: _LIBCDSB_GenericS(T, f ## _string, d),\ int: _LIBCDSB_GenericS(T, f ## _char, d), unsigned int: _LIBCDSB_GenericS(T, f ## _char, d),\ char: _LIBCDSB_GenericS(T, f ## _char, d), unsigned char: _LIBCDSB_GenericS(T, f ## _char, d),\ short: _LIBCDSB_GenericS(T, f ## _char, d), unsigned short: _LIBCDSB_GenericS(T, f ## _char, d)\ ) #endif /* LIBCDSB_CORE_GENERICS_H */