eina_value: array now adopts given Eina_Inarray.
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 12 Jan 2012 17:07:07 +0000 (17:07 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 12 Jan 2012 17:07:07 +0000 (17:07 +0000)
This should allow users to setup the array manually, in an efficient
way, then make it an Eina_Value.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@67145 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/eina_value.h
src/lib/eina_value.c
src/tests/eina_test_value.c

index 3de86a9..fcb4639 100644 (file)
@@ -205,6 +205,16 @@ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_STRING;
  *  @li eina_value_array_vget() and eina_value_array_vset()
  *  @li eina_value_array_pget() and eina_value_array_pset()
  *
+ * eina_value_set() takes an #Eina_Value_Array where just @c subtype
+ * and @c step are used. If there is an @c array, it will be adopted
+ * and its contents must be properly configurable as @c subtype
+ * expects. eina_value_pset() takes a pointer to an #Eina_Value_Array.
+ * For your convenience, use eina_value_array_setup().
+ *
+ * eina_value_get() and eina_value_pget() takes a pointer to
+ * #Eina_Value_Array, it's an exact copy of the current structure in
+ * use by value, no copies are done.
+ *
  * @since 1.2
  */
 EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_ARRAY;
index 72717f3..4632b75 100644 (file)
@@ -2612,22 +2612,37 @@ _eina_value_type_array_pset(const Eina_Value_Type *type __UNUSED__, void *mem, c
 {
    Eina_Value_Array *tmem = mem;
    const Eina_Value_Array *desc = ptr;
+   Eina_Inarray *desc_array;
 
    if ((!tmem->subtype) && (!desc->subtype))
      return EINA_TRUE;
 
+   desc_array = desc->array;
+   if (desc_array)
+     {
+        EINA_SAFETY_ON_FALSE_RETURN_VAL
+          (desc_array->member_size == desc->subtype->value_size, EINA_FALSE);
+     }
+
    if (tmem->array)
      {
         _eina_value_type_array_flush_elements(tmem);
-        eina_inarray_setup(tmem->array, desc->subtype->value_size, desc->step);
+        if (desc_array)
+          eina_inarray_free(tmem->array);
+        else
+          eina_inarray_setup(tmem->array, desc->subtype->value_size,
+                             desc->step);
      }
-   else
+   else if (!desc_array)
      {
         tmem->array = eina_inarray_new(desc->subtype->value_size, desc->step);
         if (!tmem->array)
           return EINA_FALSE;
      }
 
+   if (desc_array)
+     tmem->array = desc_array;
+
    tmem->subtype = desc->subtype;
 
    return EINA_TRUE;
index e8e0c7b..4bff973 100644 (file)
@@ -1047,6 +1047,8 @@ END_TEST
 START_TEST(eina_value_test_array)
 {
    Eina_Value *value, other;
+   Eina_Value_Array desc;
+   Eina_Inarray *inarray;
    char c;
    char buf[1024];
    char *str;
@@ -1128,6 +1130,25 @@ START_TEST(eina_value_test_array)
    fail_unless(eina_value_get(&other, &c));
    fail_unless(c == 33);
 
+   inarray = eina_inarray_new(sizeof(char), 0);
+   fail_unless(inarray != NULL);
+   c = 11;
+   fail_unless(eina_inarray_append(inarray, &c) >= 0);
+   c = 21;
+   fail_unless(eina_inarray_append(inarray, &c) >= 0);
+   c = 31;
+   fail_unless(eina_inarray_append(inarray, &c) >= 0);
+   desc.subtype = EINA_VALUE_TYPE_CHAR;
+   desc.step = 0;
+   desc.array = inarray; /* will be adopted and freed by value */
+   fail_unless(eina_value_set(value, desc)); /* manually configure */
+   fail_unless(eina_value_array_get(value, 0, &c));
+   fail_unless(c == 11);
+   fail_unless(eina_value_array_get(value, 1, &c));
+   fail_unless(c == 21);
+   fail_unless(eina_value_array_get(value, 2, &c));
+   fail_unless(c == 31);
+
    eina_value_free(value);
    eina_shutdown();
 }