From 3ed176370d077ede61c75d61e9f7ecf83d84cd11 Mon Sep 17 00:00:00 2001 From: Guilherme Iscaro Date: Tue, 8 Aug 2017 16:57:31 -0300 Subject: [PATCH] Eina: Add EINA_VALUE_TYPE_ERROR This new type will be used by the new promise/future implementation, which will be used to flag errors. --- src/lib/eina/eina_value.c | 62 +++++++++++++++++++++++++++++---------- src/lib/eina/eina_value.h | 40 +++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 16 deletions(-) diff --git a/src/lib/eina/eina_value.c b/src/lib/eina/eina_value.c index 3d8dce8039..3e8cff721b 100644 --- a/src/lib/eina/eina_value.c +++ b/src/lib/eina/eina_value.c @@ -167,7 +167,7 @@ _eina_value_type_uchar_convert_to(const Eina_Value_Type *type EINA_UNUSED, const short other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -315,7 +315,7 @@ _eina_value_type_ushort_convert_to(const Eina_Value_Type *type EINA_UNUSED, cons return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -465,7 +465,7 @@ _eina_value_type_uint_convert_to(const Eina_Value_Type *type EINA_UNUSED, const return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v > (unsigned int)eina_value_int_max)) @@ -619,7 +619,7 @@ _eina_value_type_ulong_convert_to(const Eina_Value_Type *type EINA_UNUSED, const return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v > (unsigned int)eina_value_int_max)) @@ -778,7 +778,7 @@ _eina_value_type_uint64_convert_to(const Eina_Value_Type *type EINA_UNUSED, cons return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v > (unsigned int)eina_value_int_max)) @@ -936,7 +936,7 @@ _eina_value_type_char_convert_to(const Eina_Value_Type *type EINA_UNUSED, const short other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -1094,7 +1094,7 @@ _eina_value_type_short_convert_to(const Eina_Value_Type *type EINA_UNUSED, const short other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -1258,7 +1258,7 @@ _eina_value_type_int_convert_to(const Eina_Value_Type *type EINA_UNUSED, const E return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; return eina_value_type_pset(convert, convert_mem, &other_mem); @@ -1424,7 +1424,7 @@ _eina_value_type_long_convert_to(const Eina_Value_Type *type EINA_UNUSED, const return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v < eina_value_int_min)) @@ -1597,7 +1597,7 @@ _eina_value_type_int64_convert_to(const Eina_Value_Type *type EINA_UNUSED, const return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v < eina_value_int_min)) @@ -1776,7 +1776,7 @@ _eina_value_type_float_convert_to(const Eina_Value_Type *type EINA_UNUSED, const return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v < eina_value_int_min)) @@ -1957,7 +1957,7 @@ _eina_value_type_double_convert_to(const Eina_Value_Type *type EINA_UNUSED, cons return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v; if (EINA_UNLIKELY(v < eina_value_int_min)) @@ -2123,7 +2123,7 @@ _eina_value_type_string_common_convert_to(const Eina_Value_Type *type EINA_UNUSE return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem; if ((sscanf(v, "%d", &other_mem) != 1) && @@ -3438,7 +3438,7 @@ _eina_value_type_timeval_convert_to(const Eina_Value_Type *type EINA_UNUSED, con return EINA_FALSE; return eina_value_type_pset(convert, convert_mem, &other_mem); } - else if (convert == EINA_VALUE_TYPE_INT) + else if ((convert == EINA_VALUE_TYPE_INT) || (convert == EINA_VALUE_TYPE_ERROR)) { int other_mem = v.tv_sec; if (EINA_UNLIKELY(v.tv_sec < eina_value_int_min)) @@ -4554,6 +4554,20 @@ _eina_value_type_optional_pget(const Eina_Value_Type *type EINA_UNUSED, const vo return EINA_TRUE; } +static Eina_Bool +_eina_value_type_eina_error_convert_to(const Eina_Value_Type *type, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem) +{ + if (convert == EINA_VALUE_TYPE_STRINGSHARE || + convert == EINA_VALUE_TYPE_STRING) + { + const Eina_Error v = *(const Eina_Error *)type_mem; + const char *msg = eina_error_msg_get(v); + return eina_value_type_pset(convert, convert_mem, &msg); + } + + return _eina_value_type_int_convert_to(type, convert, type_mem, convert_mem); +} + EAPI const Eina_Value_Type _EINA_VALUE_TYPE_OPTIONAL = { EINA_VALUE_TYPE_VERSION, sizeof(Eina_Value_Union), @@ -4785,6 +4799,20 @@ static const Eina_Value_Type _EINA_VALUE_TYPE_BASICS[] = { _eina_value_type_ulong_vset, _eina_value_type_ulong_pset, _eina_value_type_ulong_pget + }, + { + EINA_VALUE_TYPE_VERSION, + sizeof(Eina_Error), + "Eina_Error", + _eina_value_type_int_setup, + _eina_value_type_int_flush, + _eina_value_type_int_copy, + _eina_value_type_int_compare, + _eina_value_type_eina_error_convert_to, + NULL, /* no convert from */ + _eina_value_type_int_vset, + _eina_value_type_int_pset, + _eina_value_type_int_pget } }; @@ -4992,11 +5020,12 @@ eina_value_init(void) EINA_VALUE_TYPE_STRINGSHARE = _EINA_VALUE_TYPE_BASICS + 12; EINA_VALUE_TYPE_STRING = _EINA_VALUE_TYPE_BASICS + 13; EINA_VALUE_TYPE_TIMESTAMP = _EINA_VALUE_TYPE_BASICS + 14; + EINA_VALUE_TYPE_ERROR = _EINA_VALUE_TYPE_BASICS + 15; _EINA_VALUE_TYPE_BASICS_START = _EINA_VALUE_TYPE_BASICS + 0; - _EINA_VALUE_TYPE_BASICS_END = _EINA_VALUE_TYPE_BASICS + 14; + _EINA_VALUE_TYPE_BASICS_END = _EINA_VALUE_TYPE_BASICS + 15; - EINA_SAFETY_ON_FALSE_RETURN_VAL((sizeof(_EINA_VALUE_TYPE_BASICS)/sizeof(_EINA_VALUE_TYPE_BASICS[0])) == 15, EINA_FALSE); + EINA_SAFETY_ON_FALSE_RETURN_VAL((sizeof(_EINA_VALUE_TYPE_BASICS)/sizeof(_EINA_VALUE_TYPE_BASICS[0])) == 16, EINA_FALSE); EINA_VALUE_TYPE_ARRAY = &_EINA_VALUE_TYPE_ARRAY; @@ -5068,6 +5097,7 @@ eina_value_shutdown(void) 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_ERROR = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_UCHAR = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_USHORT = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_UINT = NULL; diff --git a/src/lib/eina/eina_value.h b/src/lib/eina/eina_value.h index 756314cb85..87354cd612 100644 --- a/src/lib/eina/eina_value.h +++ b/src/lib/eina/eina_value.h @@ -349,6 +349,18 @@ union _Eina_Value_Union uint64_t _guarantee; /**< guarantees 8-byte alignment */ }; + +/** + * @var EINA_VALUE_TYPE_ERROR + * manages Eina_Error values. + * This value will hold an Eina_Error number, + * which can be converted to string to get its message or call + * eina_error_msg_get() on the number to convert yourself. + * + * @since 1.21 + */ +EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_ERROR; + /** * @var EINA_VALUE_TYPE_UCHAR * manages unsigned char type. @@ -732,6 +744,7 @@ static inline int eina_value_compare(const Eina_Value *a, * The variable argument is dependent on chosen type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -793,6 +806,7 @@ static inline Eina_Bool eina_value_set(Eina_Value *value, * The variable argument is dependent on chosen type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -896,6 +910,7 @@ static inline Eina_Bool eina_value_vget(const Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -962,6 +977,7 @@ static inline Eina_Bool eina_value_pset(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1170,6 +1186,7 @@ static inline Eina_Bool eina_value_array_remove(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -1231,6 +1248,7 @@ static inline Eina_Bool eina_value_array_set(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1280,6 +1298,7 @@ static inline Eina_Bool eina_value_array_get(const Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -1335,6 +1354,7 @@ static inline Eina_Bool eina_value_array_insert(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -1476,6 +1496,7 @@ static inline Eina_Bool eina_value_array_vappend(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1541,6 +1562,7 @@ static inline Eina_Bool eina_value_array_pset(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1591,6 +1613,7 @@ static inline Eina_Bool eina_value_array_pget(const Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1649,6 +1672,7 @@ static inline Eina_Bool eina_value_array_pinsert(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1817,6 +1841,7 @@ static inline Eina_Bool eina_value_list_remove(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -1877,6 +1902,7 @@ static inline Eina_Bool eina_value_list_set(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -1925,6 +1951,7 @@ static inline Eina_Bool eina_value_list_get(const Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -1979,6 +2006,7 @@ static inline Eina_Bool eina_value_list_insert(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -2119,6 +2147,7 @@ static inline Eina_Bool eina_value_list_vappend(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2183,6 +2212,7 @@ static inline Eina_Bool eina_value_list_pset(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2232,6 +2262,7 @@ static inline Eina_Bool eina_value_list_pget(const Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2289,6 +2320,7 @@ static inline Eina_Bool eina_value_list_pinsert(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2444,6 +2476,7 @@ static inline Eina_Bool eina_value_hash_del(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -2497,6 +2530,7 @@ static inline Eina_Bool eina_value_hash_set(Eina_Value *value, * The variable argument is dependent on chosen subtype. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2583,6 +2617,7 @@ static inline Eina_Bool eina_value_hash_vget(const Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2639,6 +2674,7 @@ static inline Eina_Bool eina_value_hash_pset(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -2984,6 +3020,7 @@ static inline Eina_Bool eina_value_struct_setup(Eina_Value *value, * The variable argument is dependent on chosen member type. The list * for basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short * @li EINA_VALUE_TYPE_UINT: unsigned int @@ -3052,6 +3089,7 @@ static inline Eina_Bool eina_value_struct_set(Eina_Value *value, * The variable argument is dependent on chosen member type. The list * for basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -3154,6 +3192,7 @@ static inline Eina_Bool eina_value_struct_vget(const Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int* @@ -3226,6 +3265,7 @@ static inline Eina_Bool eina_value_struct_pset(Eina_Value *value, * The pointer type is dependent on chosen value type. The list for * basic types: * + * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* * @li EINA_VALUE_TYPE_UINT: unsigned int*