Eina_Value type EINA_value.
authorGuilherme Iscaro <iscaro@profusion.mobi>
Thu, 17 Aug 2017 17:36:47 +0000 (14:36 -0300)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Wed, 23 Aug 2017 21:32:13 +0000 (18:32 -0300)
src/lib/eina/eina_value.c
src/lib/eina/eina_value.h
src/tests/eina/eina_test_value.c

index 3e8cff7..cdc237d 100644 (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;
index 87354cd..a1ed51d 100644 (file)
@@ -362,6 +362,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*
index df07710..9bdcc4c 100644 (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);
 }