From 6cbfe100d5f2d6771e9f68883a5c81ee8735e710 Mon Sep 17 00:00:00 2001 From: Guilherme Iscaro Date: Thu, 17 Aug 2017 14:36:47 -0300 Subject: [PATCH] Eina_Value type EINA_value. --- src/lib/eina/eina_value.c | 89 ++++++++++++++++++++++++++++++++ src/lib/eina/eina_value.h | 39 ++++++++++++++ src/tests/eina/eina_test_value.c | 69 +++++++++++++++++++++++++ 3 files changed, 197 insertions(+) diff --git a/src/lib/eina/eina_value.c b/src/lib/eina/eina_value.c index 3e8cff721b..cdc237d202 100644 --- a/src/lib/eina/eina_value.c +++ b/src/lib/eina/eina_value.c @@ -3796,6 +3796,91 @@ static const Eina_Value_Type _EINA_VALUE_TYPE_BLOB = { _eina_value_type_blob_pget }; +static Eina_Bool +_eina_value_type_value_setup(const Eina_Value_Type *type EINA_UNUSED, void *mem) +{ + Eina_Value *v = mem; + memset(v, 0, sizeof(Eina_Value)); + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_value_flush(const Eina_Value_Type *type EINA_UNUSED, void *mem) +{ + Eina_Value *v = mem; + eina_value_flush(v); + return EINA_TRUE; +} + +static Eina_Bool +_eina_value_type_value_copy(const Eina_Value_Type *type EINA_UNUSED, const void *src, void *dst) +{ + const Eina_Value *v_src = src; + Eina_Value *v_dst = dst; + return eina_value_copy(v_src, v_dst); +} + +static int +_eina_value_type_value_compare(const Eina_Value_Type *type EINA_UNUSED, const void *a, const void *b) +{ + const Eina_Value *v1 = a; + const Eina_Value *v2 = b; + return eina_value_compare(v1, v2); +} + +static Eina_Bool +_eina_value_type_value_convert_to(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem) +{ + const Eina_Value *v = type_mem; + return eina_value_type_convert_to(v->type, convert, eina_value_memory_get(v), convert_mem); +} + +static Eina_Bool +_eina_value_type_value_convert_from(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type *convert, void *type_mem, const void *convert_mem) +{ + Eina_Value *v = type_mem; + return eina_value_type_convert_from(v->type, convert, eina_value_memory_get(v), convert_mem); +} + +static Eina_Bool +_eina_value_type_value_vset(const Eina_Value_Type *type EINA_UNUSED, void *mem, va_list args) +{ + Eina_Value *dst = mem; + Eina_Value src = va_arg(args, Eina_Value); + return eina_value_copy(&src, dst); +} + +static Eina_Bool +_eina_value_type_value_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, const void *ptr) +{ + Eina_Value *dst = mem; + const Eina_Value *src = ptr; + return eina_value_copy(src, dst); +} + +static Eina_Bool +_eina_value_type_value_pget(const Eina_Value_Type *type EINA_UNUSED, const void *mem, void *ptr) +{ + const Eina_Value *src = mem; + Eina_Value *dst = ptr; + return eina_value_copy(src, dst); +} + +static const Eina_Value_Type _EINA_VALUE_TYPE_VALUE = { + EINA_VALUE_TYPE_VERSION, + sizeof(Eina_Value), + "Eina_Value", + _eina_value_type_value_setup, + _eina_value_type_value_flush, + _eina_value_type_value_copy, + _eina_value_type_value_compare, + _eina_value_type_value_convert_to, + _eina_value_type_value_convert_from, + _eina_value_type_value_vset, + _eina_value_type_value_pset, + _eina_value_type_value_pget +}; + static int _eina_value_struct_operations_binsearch_cmp(const void *pa, const void *pb) { @@ -5042,6 +5127,9 @@ eina_value_init(void) EINA_VALUE_STRUCT_OPERATIONS_BINSEARCH = &_EINA_VALUE_STRUCT_OPERATIONS_BINSEARCH; EINA_VALUE_STRUCT_OPERATIONS_STRINGSHARE = &_EINA_VALUE_STRUCT_OPERATIONS_STRINGSHARE; + EINA_VALUE_TYPE_VALUE = &_EINA_VALUE_TYPE_VALUE; + + return EINA_TRUE; on_init_fail_hash: @@ -5097,6 +5185,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_VALUE = 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; diff --git a/src/lib/eina/eina_value.h b/src/lib/eina/eina_value.h index 87354cd612..a1ed51df5f 100644 --- a/src/lib/eina/eina_value.h +++ b/src/lib/eina/eina_value.h @@ -361,6 +361,17 @@ union _Eina_Value_Union */ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_ERROR; +/** + * @var EINA_VALUE_TYPE_VALUE + * manages Eina_Value values. + * This value will hold an Eina_Value, + * which can be usefull for storing data + * inside an #Eina_Value_Array. + * + * @since 1.21 + */ +EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_VALUE; + /** * @var EINA_VALUE_TYPE_UCHAR * manages unsigned char type. @@ -744,6 +755,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -806,6 +818,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -910,6 +923,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -977,6 +991,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1186,6 +1201,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -1248,6 +1264,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1298,6 +1315,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -1354,6 +1372,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -1496,6 +1515,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1562,6 +1582,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1613,6 +1634,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1672,6 +1694,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1841,6 +1864,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -1902,6 +1926,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -1951,6 +1976,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -2006,6 +2032,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -2147,6 +2174,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -2212,6 +2240,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -2262,6 +2291,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -2320,6 +2350,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -2476,6 +2507,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -2530,6 +2562,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -2617,6 +2650,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -2674,6 +2708,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -3020,6 +3055,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_VALUE: Eina_Value * @li EINA_VALUE_TYPE_ERROR: Eina_Error * @li EINA_VALUE_TYPE_UCHAR: unsigned char * @li EINA_VALUE_TYPE_USHORT: unsigned short @@ -3089,6 +3125,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -3192,6 +3229,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* @@ -3265,6 +3303,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_VALUE: Eina_Value* * @li EINA_VALUE_TYPE_ERROR: Eina_Error* * @li EINA_VALUE_TYPE_UCHAR: unsigned char* * @li EINA_VALUE_TYPE_USHORT: unsigned short* diff --git a/src/tests/eina/eina_test_value.c b/src/tests/eina/eina_test_value.c index df0771008c..9bdcc4c120 100644 --- a/src/tests/eina/eina_test_value.c +++ b/src/tests/eina/eina_test_value.c @@ -2873,6 +2873,73 @@ START_TEST(eina_value_test_optional_struct_members) } END_TEST +START_TEST(eina_value_test_value) +{ + Eina_Value composed, v; + const int ivalue = 3500; + int i; + const char *str; + + eina_init(); + + fail_if(!eina_value_setup(&composed, EINA_VALUE_TYPE_VALUE)); + fail_if(!eina_value_setup(&v, EINA_VALUE_TYPE_INT)); + fail_if(!eina_value_set(&v, ivalue)); + fail_if(!eina_value_set(&composed, v)); + + fail_if(!eina_value_get(&composed, &v)); + fail_if(!eina_value_get(&v, &i)); + fail_if(i != ivalue); + + eina_value_flush(&v); + fail_if(!eina_value_setup(&v, EINA_VALUE_TYPE_STRING)); + fail_if(!eina_value_convert(&composed, &v)); + fail_if(!eina_value_get(&v, &str)); + ck_assert_str_eq(str, "3500"); + + eina_value_flush(&v); + fail_if(!eina_value_copy(&composed, &v)); + fail_if(eina_value_compare(&composed, &v)); + + eina_value_flush(&v); + eina_value_flush(&composed); + eina_shutdown(); +} +END_TEST + +START_TEST(eina_value_test_value_string) +{ + Eina_Value composed, v, str_v; + const char *msg = "A string", *str; + + eina_init(); + + fail_if(!eina_value_setup(&composed, EINA_VALUE_TYPE_VALUE)); + fail_if(!eina_value_setup(&v, EINA_VALUE_TYPE_STRING)); + fail_if(!eina_value_set(&v, msg)); + fail_if(!eina_value_set(&composed, v)); + + eina_value_flush(&v); + fail_if(!eina_value_copy(&composed, &v)); + fail_if(eina_value_compare(&composed, &v)); + + fail_if(!eina_value_get(&composed, &str_v)); + fail_if(!eina_value_get(&str_v, &str)); + ck_assert_str_eq(str, msg); + eina_value_flush(&str_v); + + str = NULL; + fail_if(!eina_value_get(&v, &str_v)); + fail_if(!eina_value_get(&str_v, &str)); + ck_assert_str_eq(str, msg); + + eina_value_flush(&str_v); + eina_value_flush(&composed); + eina_value_flush(&v); + eina_shutdown(); +} +END_TEST + void eina_test_value(TCase *tc) { @@ -2901,4 +2968,6 @@ eina_test_value(TCase *tc) tcase_add_test(tc, eina_value_test_optional_int); tcase_add_test(tc, eina_value_test_optional_string); tcase_add_test(tc, eina_value_test_optional_struct_members); + tcase_add_test(tc, eina_value_test_value); + tcase_add_test(tc, eina_value_test_value_string); }