Eina_Value type EINA_value.

This commit is contained in:
Guilherme Iscaro 2017-08-17 14:36:47 -03:00 committed by Gustavo Sverzut Barbieri
parent 3ed176370d
commit 6cbfe100d5
3 changed files with 197 additions and 0 deletions

View File

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

View File

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

View File

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