eina_value: optimize detection of basic types.

SVN revision: 67090
This commit is contained in:
Gustavo Sverzut Barbieri 2012-01-11 19:46:55 +00:00
parent 916047532d
commit 5e94a82fab
2 changed files with 243 additions and 241 deletions

View File

@ -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) \

View File

@ -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;