diff --git a/legacy/eina/src/include/eina_inline_value.x b/legacy/eina/src/include/eina_inline_value.x index 2256be4808..08393c9308 100644 --- a/legacy/eina/src/include/eina_inline_value.x +++ b/legacy/eina/src/include/eina_inline_value.x @@ -30,21 +30,23 @@ #ifdef EINA_VALUE_NO_OPTIMIZE #define EINA_VALUE_TYPE_DEFAULT(type) (0) #else + +/** + * @var _EINA_VALUE_TYPE_BASICS_START + * pointer to the first basic type. + * @private + */ +EAPI extern const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_START; + +/** + * @var _EINA_VALUE_TYPE_BASICS_END + * pointer to the last (inclusive) basic type. + * @private + */ +EAPI extern const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_END; #define EINA_VALUE_TYPE_DEFAULT(type) \ - ((type == EINA_VALUE_TYPE_UCHAR) || \ - (type == EINA_VALUE_TYPE_USHORT) || \ - (type == EINA_VALUE_TYPE_UINT) || \ - (type == EINA_VALUE_TYPE_ULONG) || \ - (type == EINA_VALUE_TYPE_UINT64) || \ - (type == EINA_VALUE_TYPE_CHAR) || \ - (type == EINA_VALUE_TYPE_SHORT) || \ - (type == EINA_VALUE_TYPE_INT) || \ - (type == EINA_VALUE_TYPE_LONG) || \ - (type == EINA_VALUE_TYPE_INT64) || \ - (type == EINA_VALUE_TYPE_FLOAT) || \ - (type == EINA_VALUE_TYPE_DOUBLE) || \ - (type == EINA_VALUE_TYPE_STRINGSHARE) || \ - (type == EINA_VALUE_TYPE_STRING)) + ((_EINA_VALUE_TYPE_BASICS_START <= type) && \ + (type <= _EINA_VALUE_TYPE_BASICS_END)) #endif #define EINA_VALUE_TYPE_CHECK_RETURN(value) \ diff --git a/legacy/eina/src/lib/eina_value.c b/legacy/eina/src/lib/eina_value.c index 664ac2499a..c5b34d2fb0 100644 --- a/legacy/eina/src/lib/eina_value.c +++ b/legacy/eina/src/lib/eina_value.c @@ -252,21 +252,6 @@ _eina_value_type_uchar_pget(const Eina_Value_Type *type __UNUSED__, const void * return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_UCHAR = { - EINA_VALUE_TYPE_VERSION, - sizeof(unsigned char), - "unsigned char", - _eina_value_type_uchar_setup, - _eina_value_type_uchar_flush, - _eina_value_type_uchar_copy, - _eina_value_type_uchar_compare, - _eina_value_type_uchar_convert_to, - NULL, /* no convert from */ - _eina_value_type_uchar_vset, - _eina_value_type_uchar_pset, - _eina_value_type_uchar_pget -}; - static Eina_Bool _eina_value_type_ushort_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -418,21 +403,6 @@ _eina_value_type_ushort_pget(const Eina_Value_Type *type __UNUSED__, const void return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_USHORT = { - EINA_VALUE_TYPE_VERSION, - sizeof(unsigned short), - "unsigned short", - _eina_value_type_ushort_setup, - _eina_value_type_ushort_flush, - _eina_value_type_ushort_copy, - _eina_value_type_ushort_compare, - _eina_value_type_ushort_convert_to, - NULL, /* no convert from */ - _eina_value_type_ushort_vset, - _eina_value_type_ushort_pset, - _eina_value_type_ushort_pget -}; - static Eina_Bool _eina_value_type_uint_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -588,21 +558,6 @@ _eina_value_type_uint_pget(const Eina_Value_Type *type __UNUSED__, const void *m return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_UINT = { - EINA_VALUE_TYPE_VERSION, - sizeof(unsigned int), - "unsigned int", - _eina_value_type_uint_setup, - _eina_value_type_uint_flush, - _eina_value_type_uint_copy, - _eina_value_type_uint_compare, - _eina_value_type_uint_convert_to, - NULL, /* no convert from */ - _eina_value_type_uint_vset, - _eina_value_type_uint_pset, - _eina_value_type_uint_pget -}; - static Eina_Bool _eina_value_type_ulong_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -762,22 +717,6 @@ _eina_value_type_ulong_pget(const Eina_Value_Type *type __UNUSED__, const void * return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_ULONG = { - EINA_VALUE_TYPE_VERSION, - sizeof(unsigned long), - "unsigned long", - _eina_value_type_ulong_setup, - _eina_value_type_ulong_flush, - _eina_value_type_ulong_copy, - _eina_value_type_ulong_compare, - _eina_value_type_ulong_convert_to, - NULL, /* no convert from */ - _eina_value_type_ulong_vset, - _eina_value_type_ulong_pset, - _eina_value_type_ulong_pget -}; - - static Eina_Bool _eina_value_type_uint64_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -942,21 +881,6 @@ _eina_value_type_uint64_pget(const Eina_Value_Type *type __UNUSED__, const void return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_UINT64 = { - EINA_VALUE_TYPE_VERSION, - sizeof(uint64_t), - "uint64_t", - _eina_value_type_uint64_setup, - _eina_value_type_uint64_flush, - _eina_value_type_uint64_copy, - _eina_value_type_uint64_compare, - _eina_value_type_uint64_convert_to, - NULL, /* no convert from */ - _eina_value_type_uint64_vset, - _eina_value_type_uint64_pset, - _eina_value_type_uint64_pget -}; - static Eina_Bool _eina_value_type_char_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -1112,21 +1036,6 @@ _eina_value_type_char_pget(const Eina_Value_Type *type __UNUSED__, const void *m return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_CHAR = { - EINA_VALUE_TYPE_VERSION, - sizeof(char), - "char", - _eina_value_type_char_setup, - _eina_value_type_char_flush, - _eina_value_type_char_copy, - _eina_value_type_char_compare, - _eina_value_type_char_convert_to, - NULL, /* no convert from */ - _eina_value_type_char_vset, - _eina_value_type_char_pset, - _eina_value_type_char_pget -}; - static Eina_Bool _eina_value_type_short_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -1288,21 +1197,6 @@ _eina_value_type_short_pget(const Eina_Value_Type *type __UNUSED__, const void * return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_SHORT = { - EINA_VALUE_TYPE_VERSION, - sizeof(short), - "short", - _eina_value_type_short_setup, - _eina_value_type_short_flush, - _eina_value_type_short_copy, - _eina_value_type_short_compare, - _eina_value_type_short_convert_to, - NULL, /* no convert from */ - _eina_value_type_short_vset, - _eina_value_type_short_pset, - _eina_value_type_short_pget -}; - static Eina_Bool _eina_value_type_int_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -1470,21 +1364,6 @@ _eina_value_type_int_pget(const Eina_Value_Type *type __UNUSED__, const void *me return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_INT = { - EINA_VALUE_TYPE_VERSION, - sizeof(int), - "int", - _eina_value_type_int_setup, - _eina_value_type_int_flush, - _eina_value_type_int_copy, - _eina_value_type_int_compare, - _eina_value_type_int_convert_to, - NULL, /* no convert from */ - _eina_value_type_int_vset, - _eina_value_type_int_pset, - _eina_value_type_int_pget -}; - static Eina_Bool _eina_value_type_long_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -1658,21 +1537,6 @@ _eina_value_type_long_pget(const Eina_Value_Type *type __UNUSED__, const void *m return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_LONG = { - EINA_VALUE_TYPE_VERSION, - sizeof(long), - "long", - _eina_value_type_long_setup, - _eina_value_type_long_flush, - _eina_value_type_long_copy, - _eina_value_type_long_compare, - _eina_value_type_long_convert_to, - NULL, /* no convert from */ - _eina_value_type_long_vset, - _eina_value_type_long_pset, - _eina_value_type_long_pget -}; - static Eina_Bool _eina_value_type_int64_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -1853,21 +1717,6 @@ _eina_value_type_int64_pget(const Eina_Value_Type *type __UNUSED__, const void * return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_INT64 = { - EINA_VALUE_TYPE_VERSION, - sizeof(int64_t), - "int64_t", - _eina_value_type_int64_setup, - _eina_value_type_int64_flush, - _eina_value_type_int64_copy, - _eina_value_type_int64_compare, - _eina_value_type_int64_convert_to, - NULL, /* no convert from */ - _eina_value_type_int64_vset, - _eina_value_type_int64_pset, - _eina_value_type_int64_pget -}; - static Eina_Bool _eina_value_type_float_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -2054,21 +1903,6 @@ _eina_value_type_float_pget(const Eina_Value_Type *type __UNUSED__, const void * return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_FLOAT = { - EINA_VALUE_TYPE_VERSION, - sizeof(float), - "float", - _eina_value_type_float_setup, - _eina_value_type_float_flush, - _eina_value_type_float_copy, - _eina_value_type_float_compare, - _eina_value_type_float_convert_to, - NULL, /* no convert from */ - _eina_value_type_float_vset, - _eina_value_type_float_pset, - _eina_value_type_float_pget -}; - static Eina_Bool _eina_value_type_double_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -2249,21 +2083,6 @@ _eina_value_type_double_pget(const Eina_Value_Type *type __UNUSED__, const void return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_DOUBLE = { - EINA_VALUE_TYPE_VERSION, - sizeof(double), - "double", - _eina_value_type_double_setup, - _eina_value_type_double_flush, - _eina_value_type_double_copy, - _eina_value_type_double_compare, - _eina_value_type_double_convert_to, - NULL, /* no convert from */ - _eina_value_type_double_vset, - _eina_value_type_double_pset, - _eina_value_type_double_pget -}; - static Eina_Bool _eina_value_type_string_common_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -2450,21 +2269,6 @@ _eina_value_type_stringshare_pset(const Eina_Value_Type *type __UNUSED__, void * return eina_stringshare_replace((const char **)mem, *str); } -static const Eina_Value_Type _EINA_VALUE_TYPE_STRINGSHARE = { - EINA_VALUE_TYPE_VERSION, - sizeof(const char *), - "stringshare", - _eina_value_type_string_common_setup, - _eina_value_type_stringshare_flush, - _eina_value_type_stringshare_copy, - _eina_value_type_string_common_compare, - _eina_value_type_string_common_convert_to, - NULL, /* no convert from */ - _eina_value_type_stringshare_vset, - _eina_value_type_stringshare_pset, - _eina_value_type_string_common_pget -}; - static Eina_Bool _eina_value_type_string_flush(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -2534,22 +2338,6 @@ _eina_value_type_string_pset(const Eina_Value_Type *type __UNUSED__, void *mem, return EINA_TRUE; } -static const Eina_Value_Type _EINA_VALUE_TYPE_STRING = { - EINA_VALUE_TYPE_VERSION, - sizeof(char *), - "string", - _eina_value_type_string_common_setup, - _eina_value_type_string_flush, - _eina_value_type_string_copy, - _eina_value_type_string_common_compare, - _eina_value_type_string_common_convert_to, - NULL, /* no convert from */ - _eina_value_type_string_vset, - _eina_value_type_string_pset, - _eina_value_type_string_common_pget -}; - - static Eina_Bool _eina_value_type_array_setup(const Eina_Value_Type *type __UNUSED__, void *mem) { @@ -2867,6 +2655,210 @@ static const Eina_Value_Type _EINA_VALUE_TYPE_ARRAY = { _eina_value_type_array_pget }; +/* keep all basic types inlined in an array so we can compare if it's + * a basic type using pointer arithmetic. + * + * NOTE-1: JUST BASIC TYPES, DO NOT ADD MORE TYPES HERE!!! + * NOTE-2: KEEP ORDER, see eina_value_init() + */ +static const Eina_Value_Type _EINA_VALUE_TYPE_BASICS[] = { + { + EINA_VALUE_TYPE_VERSION, + sizeof(unsigned char), + "unsigned char", + _eina_value_type_uchar_setup, + _eina_value_type_uchar_flush, + _eina_value_type_uchar_copy, + _eina_value_type_uchar_compare, + _eina_value_type_uchar_convert_to, + NULL, /* no convert from */ + _eina_value_type_uchar_vset, + _eina_value_type_uchar_pset, + _eina_value_type_uchar_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(unsigned short), + "unsigned short", + _eina_value_type_ushort_setup, + _eina_value_type_ushort_flush, + _eina_value_type_ushort_copy, + _eina_value_type_ushort_compare, + _eina_value_type_ushort_convert_to, + NULL, /* no convert from */ + _eina_value_type_ushort_vset, + _eina_value_type_ushort_pset, + _eina_value_type_ushort_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(unsigned int), + "unsigned int", + _eina_value_type_uint_setup, + _eina_value_type_uint_flush, + _eina_value_type_uint_copy, + _eina_value_type_uint_compare, + _eina_value_type_uint_convert_to, + NULL, /* no convert from */ + _eina_value_type_uint_vset, + _eina_value_type_uint_pset, + _eina_value_type_uint_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(unsigned long), + "unsigned long", + _eina_value_type_ulong_setup, + _eina_value_type_ulong_flush, + _eina_value_type_ulong_copy, + _eina_value_type_ulong_compare, + _eina_value_type_ulong_convert_to, + NULL, /* no convert from */ + _eina_value_type_ulong_vset, + _eina_value_type_ulong_pset, + _eina_value_type_ulong_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(uint64_t), + "uint64_t", + _eina_value_type_uint64_setup, + _eina_value_type_uint64_flush, + _eina_value_type_uint64_copy, + _eina_value_type_uint64_compare, + _eina_value_type_uint64_convert_to, + NULL, /* no convert from */ + _eina_value_type_uint64_vset, + _eina_value_type_uint64_pset, + _eina_value_type_uint64_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(char), + "char", + _eina_value_type_char_setup, + _eina_value_type_char_flush, + _eina_value_type_char_copy, + _eina_value_type_char_compare, + _eina_value_type_char_convert_to, + NULL, /* no convert from */ + _eina_value_type_char_vset, + _eina_value_type_char_pset, + _eina_value_type_char_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(short), + "short", + _eina_value_type_short_setup, + _eina_value_type_short_flush, + _eina_value_type_short_copy, + _eina_value_type_short_compare, + _eina_value_type_short_convert_to, + NULL, /* no convert from */ + _eina_value_type_short_vset, + _eina_value_type_short_pset, + _eina_value_type_short_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(int), + "int", + _eina_value_type_int_setup, + _eina_value_type_int_flush, + _eina_value_type_int_copy, + _eina_value_type_int_compare, + _eina_value_type_int_convert_to, + NULL, /* no convert from */ + _eina_value_type_int_vset, + _eina_value_type_int_pset, + _eina_value_type_int_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(long), + "long", + _eina_value_type_long_setup, + _eina_value_type_long_flush, + _eina_value_type_long_copy, + _eina_value_type_long_compare, + _eina_value_type_long_convert_to, + NULL, /* no convert from */ + _eina_value_type_long_vset, + _eina_value_type_long_pset, + _eina_value_type_long_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(int64_t), + "int64_t", + _eina_value_type_int64_setup, + _eina_value_type_int64_flush, + _eina_value_type_int64_copy, + _eina_value_type_int64_compare, + _eina_value_type_int64_convert_to, + NULL, /* no convert from */ + _eina_value_type_int64_vset, + _eina_value_type_int64_pset, + _eina_value_type_int64_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(float), + "float", + _eina_value_type_float_setup, + _eina_value_type_float_flush, + _eina_value_type_float_copy, + _eina_value_type_float_compare, + _eina_value_type_float_convert_to, + NULL, /* no convert from */ + _eina_value_type_float_vset, + _eina_value_type_float_pset, + _eina_value_type_float_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(double), + "double", + _eina_value_type_double_setup, + _eina_value_type_double_flush, + _eina_value_type_double_copy, + _eina_value_type_double_compare, + _eina_value_type_double_convert_to, + NULL, /* no convert from */ + _eina_value_type_double_vset, + _eina_value_type_double_pset, + _eina_value_type_double_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(const char *), + "stringshare", + _eina_value_type_string_common_setup, + _eina_value_type_stringshare_flush, + _eina_value_type_stringshare_copy, + _eina_value_type_string_common_compare, + _eina_value_type_string_common_convert_to, + NULL, /* no convert from */ + _eina_value_type_stringshare_vset, + _eina_value_type_stringshare_pset, + _eina_value_type_string_common_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(char *), + "string", + _eina_value_type_string_common_setup, + _eina_value_type_string_flush, + _eina_value_type_string_copy, + _eina_value_type_string_common_compare, + _eina_value_type_string_common_convert_to, + NULL, /* no convert from */ + _eina_value_type_string_vset, + _eina_value_type_string_pset, + _eina_value_type_string_common_pget + } +}; /** * @endcond @@ -2899,20 +2891,27 @@ eina_value_init(void) EINA_ERROR_VALUE_FAILED = eina_error_msg_static_register( EINA_ERROR_VALUE_FAILED_STR); - EINA_VALUE_TYPE_UCHAR = &_EINA_VALUE_TYPE_UCHAR; - EINA_VALUE_TYPE_USHORT = &_EINA_VALUE_TYPE_USHORT; - EINA_VALUE_TYPE_UINT = &_EINA_VALUE_TYPE_UINT; - EINA_VALUE_TYPE_ULONG = &_EINA_VALUE_TYPE_ULONG; - EINA_VALUE_TYPE_UINT64 = &_EINA_VALUE_TYPE_UINT64; - EINA_VALUE_TYPE_CHAR = &_EINA_VALUE_TYPE_CHAR; - EINA_VALUE_TYPE_SHORT = &_EINA_VALUE_TYPE_SHORT; - EINA_VALUE_TYPE_INT = &_EINA_VALUE_TYPE_INT; - EINA_VALUE_TYPE_LONG = &_EINA_VALUE_TYPE_LONG; - EINA_VALUE_TYPE_INT64 = &_EINA_VALUE_TYPE_INT64; - EINA_VALUE_TYPE_FLOAT = &_EINA_VALUE_TYPE_FLOAT; - EINA_VALUE_TYPE_DOUBLE = &_EINA_VALUE_TYPE_DOUBLE; - EINA_VALUE_TYPE_STRINGSHARE = &_EINA_VALUE_TYPE_STRINGSHARE; - EINA_VALUE_TYPE_STRING = &_EINA_VALUE_TYPE_STRING; + EINA_VALUE_TYPE_UCHAR = _EINA_VALUE_TYPE_BASICS + 0; + EINA_VALUE_TYPE_USHORT = _EINA_VALUE_TYPE_BASICS + 1; + EINA_VALUE_TYPE_UINT = _EINA_VALUE_TYPE_BASICS + 2; + EINA_VALUE_TYPE_ULONG = _EINA_VALUE_TYPE_BASICS + 3; + EINA_VALUE_TYPE_UINT64 = _EINA_VALUE_TYPE_BASICS + 4; + EINA_VALUE_TYPE_CHAR = _EINA_VALUE_TYPE_BASICS + 5; + EINA_VALUE_TYPE_SHORT = _EINA_VALUE_TYPE_BASICS + 6; + EINA_VALUE_TYPE_INT = _EINA_VALUE_TYPE_BASICS + 7; + EINA_VALUE_TYPE_LONG = _EINA_VALUE_TYPE_BASICS + 8; + EINA_VALUE_TYPE_INT64 = _EINA_VALUE_TYPE_BASICS + 9; + EINA_VALUE_TYPE_FLOAT = _EINA_VALUE_TYPE_BASICS + 10; + EINA_VALUE_TYPE_DOUBLE = _EINA_VALUE_TYPE_BASICS + 11; + EINA_VALUE_TYPE_STRINGSHARE = _EINA_VALUE_TYPE_BASICS + 12; + EINA_VALUE_TYPE_STRING = _EINA_VALUE_TYPE_BASICS + 13; + + _EINA_VALUE_TYPE_BASICS_START = _EINA_VALUE_TYPE_BASICS + 0; + _EINA_VALUE_TYPE_BASICS_END = _EINA_VALUE_TYPE_BASICS + 13; + + EINA_SAFETY_ON_FALSE_RETURN_VAL((sizeof(_EINA_VALUE_TYPE_BASICS)/sizeof(_EINA_VALUE_TYPE_BASICS[0])) == 14, EINA_FALSE); + + EINA_VALUE_TYPE_ARRAY = &_EINA_VALUE_TYPE_ARRAY; return EINA_TRUE; @@ -2945,7 +2944,8 @@ eina_value_shutdown(void) * API * *============================================================================*/ -EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_UCHAR; +EAPI const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_START = NULL; +EAPI const Eina_Value_Type *_EINA_VALUE_TYPE_BASICS_END = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_UCHAR = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_USHORT = NULL;