value got the helper, will be useful in other cases as well.
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 24 Jan 2012 22:56:17 +0000 (22:56 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 24 Jan 2012 22:56:17 +0000 (22:56 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@67518 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/eina_inline_value.x
src/include/eina_value.h
src/lib/eina_model.c
src/tests/eina_test_model.c

index 5dc0c55..05b11c9 100644 (file)
@@ -1540,8 +1540,9 @@ eina_value_struct_pset(Eina_Value *value, const char *name, const void *ptr)
    Eina_Value_Struct *st;
    void *mem;
 
-   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, 0);
+   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, EINA_FALSE);
    st = (Eina_Value_Struct *)eina_value_memory_get(value);
    if (!st)
      return EINA_FALSE;
@@ -1571,8 +1572,9 @@ eina_value_struct_pget(const Eina_Value *value, const char *name, void *ptr)
    const void *mem;
    Eina_Bool ret;
 
-   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, 0);
+   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(value, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, EINA_FALSE);
    st = (const Eina_Value_Struct *)eina_value_memory_get(value);
    if (!st)
      return EINA_FALSE;
@@ -1586,6 +1588,75 @@ eina_value_struct_pget(const Eina_Value *value, const char *name, void *ptr)
    ret = eina_value_type_pget(member->type, mem, ptr);
    return ret;
 }
+
+static inline Eina_Bool
+eina_value_struct_value_get(const Eina_Value *src, const char *name, Eina_Value *dst)
+{
+   const Eina_Value_Struct_Member *member;
+   const Eina_Value_Struct *st;
+   const void *mem;
+
+   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(src, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(dst, EINA_FALSE);
+   st = (const Eina_Value_Struct *)eina_value_memory_get(src);
+   if (!st)
+     return EINA_FALSE;
+   member = eina_value_struct_member_find(st, name);
+   if (!member)
+     return EINA_FALSE;
+   mem = eina_value_struct_member_memory_get(st, member);
+   if (!mem)
+     return EINA_FALSE;
+   if (!eina_value_setup(dst, member->type))
+     return EINA_FALSE;
+   if (!eina_value_pset(dst, mem))
+     {
+        eina_value_flush(dst);
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+}
+
+static inline Eina_Bool
+eina_value_struct_value_set(Eina_Value *dst, const char *name, const Eina_Value *src)
+{
+   const Eina_Value_Struct_Member *member;
+   Eina_Value_Struct *st;
+   void *mem;
+   const void *ptr;
+
+   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(dst, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(name, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(src, EINA_FALSE);
+
+   st = (Eina_Value_Struct *)eina_value_memory_get(dst);
+   if (!st)
+     return EINA_FALSE;
+   member = eina_value_struct_member_find(st, name);
+   if (!member)
+     return EINA_FALSE;
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(src->type == member->type, EINA_FALSE);
+
+   mem = eina_value_struct_member_memory_get(st, member);
+   if (!mem)
+     return EINA_FALSE;
+
+   ptr = eina_value_memory_get(src);
+   if (!ptr)
+     return EINA_FALSE;
+
+   eina_value_type_flush(member->type, mem);
+   if (!eina_value_type_setup(member->type, mem)) goto error_setup;
+   if (!eina_value_type_pset(member->type, mem, ptr)) goto error_set;
+   return EINA_TRUE;
+
+ error_set:
+   eina_value_type_flush(member->type, mem);
+ error_setup:
+   return EINA_FALSE;
+}
+
 #undef EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL
 
 
index 846c4ef..4f04a1a 100644 (file)
@@ -435,7 +435,7 @@ static inline void eina_value_flush(Eina_Value *value) EINA_ARG_NONNULL(1);
  * @param copy destination value object
  * @return #EINA_TRUE on success, #EINA_FALSE otherwise.
  *
- * The @a copy object is considered internalized and its existing
+ * The @a copy object is considered uninitialized and its existing
  * contents are overwritten (just as if eina_value_flush() was called on
  * it).
  *
@@ -2702,7 +2702,7 @@ static inline Eina_Bool eina_value_struct_setup(Eina_Value *value,
  */
 static inline Eina_Bool eina_value_struct_set(Eina_Value *value,
                                               const char *name,
-                                              ...) EINA_ARG_NONNULL(1);
+                                              ...) EINA_ARG_NONNULL(1, 2);
 
 /**
  * @brief Get the generic value from an struct member.
@@ -2770,7 +2770,7 @@ static inline Eina_Bool eina_value_struct_set(Eina_Value *value,
  */
 static inline Eina_Bool eina_value_struct_get(const Eina_Value *value,
                                               const char *name,
-                                              ...) EINA_ARG_NONNULL(1);
+                                              ...) EINA_ARG_NONNULL(1, 2);
 
 /**
  * @brief Set the generic value in an struct member.
@@ -2786,7 +2786,7 @@ static inline Eina_Bool eina_value_struct_get(const Eina_Value *value,
  */
 static inline Eina_Bool eina_value_struct_vset(Eina_Value *value,
                                                const char *name,
-                                               va_list args) EINA_ARG_NONNULL(1);
+                                               va_list args) EINA_ARG_NONNULL(1, 2);
 
 /**
  * @brief Get the generic value from an struct member.
@@ -2808,7 +2808,7 @@ static inline Eina_Bool eina_value_struct_vset(Eina_Value *value,
  */
 static inline Eina_Bool eina_value_struct_vget(const Eina_Value *value,
                                                const char *name,
-                                               va_list args) EINA_ARG_NONNULL(1);
+                                               va_list args) EINA_ARG_NONNULL(1, 2);
 
 /**
  * @brief Set the generic value in an struct member from pointer.
@@ -2875,7 +2875,7 @@ static inline Eina_Bool eina_value_struct_vget(const Eina_Value *value,
  */
 static inline Eina_Bool eina_value_struct_pset(Eina_Value *value,
                                                const char *name,
-                                               const void *ptr) EINA_ARG_NONNULL(1, 3);
+                                               const void *ptr) EINA_ARG_NONNULL(1, 2, 3);
 
 /**
  * @brief Get the generic value to pointer from an struct member.
@@ -2944,7 +2944,34 @@ static inline Eina_Bool eina_value_struct_pset(Eina_Value *value,
  */
 static inline Eina_Bool eina_value_struct_pget(const Eina_Value *value,
                                                const char *name,
-                                               void *ptr) EINA_ARG_NONNULL(1, 3);
+                                               void *ptr) EINA_ARG_NONNULL(1, 2, 3);
+
+/**
+ * @brief Get the member as Eina_Value copy
+ * @param src source value object
+ * @param name name to find the member
+ * @param dst where to return the member value.
+ *
+ * The argument @a dst is considered uninitialized and it's setup to
+ * the type of the member.
+ *
+ * @since 1.2
+ */
+static inline Eina_Bool eina_value_struct_value_get(const Eina_Value *src,
+                                                    const char *name,
+                                                    Eina_Value *dst) EINA_ARG_NONNULL(1, 2, 3);
+
+/**
+ * @brief Set the member from Eina_Value source
+ * @param dst destination value object
+ * @param name name to find the member
+ * @param src source value
+ *
+ * @since 1.2
+ */
+static inline Eina_Bool eina_value_struct_value_set(Eina_Value *dst,
+                                                    const char *name,
+                                                    const Eina_Value *src) EINA_ARG_NONNULL(1, 2, 3);
 
 /**
  * @}
index fc37203..b7685e2 100644 (file)
@@ -2567,54 +2567,17 @@ _eina_model_interface_properties_struct_destructor(Eina_Model *model)
 static Eina_Bool
 _eina_model_interface_properties_struct_get(const Eina_Model *model, const char *name, Eina_Value *val)
 {
-   EINA_MODEL_INTERFACE_PROPERTIES_STRUCT_GET(model);
-   const Eina_Value_Struct_Member *m;
-   const void *p;
-
-   /* highly optimized, but duplicates code from eina_inline_value.x */
-
-   m = eina_value_struct_member_find(priv, name);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
-
-   p = eina_value_struct_member_memory_get(priv, m);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(eina_value_setup(val, m->type), EINA_FALSE);
-   EINA_SAFETY_ON_FALSE_GOTO(eina_value_pset(val, p), error);
-   return EINA_TRUE;
-
- error:
-   eina_value_flush(val);
-   return EINA_FALSE;
+   const Eina_Value *v = eina_model_interface_private_data_get
+     (model, EINA_MODEL_INTERFACE_PROPERTIES_STRUCT);
+   return eina_value_struct_value_get(v, name, val);
 }
 
 static Eina_Bool
 _eina_model_interface_properties_struct_set(Eina_Model *model, const char *name, const Eina_Value *val)
 {
-   EINA_MODEL_INTERFACE_PROPERTIES_STRUCT_GET(model);
-   const Eina_Value_Struct_Member *m;
-   const void *src;
-   void *dst;
-
-   /* highly optimized, but duplicates code from eina_inline_value.x */
-
-   m = eina_value_struct_member_find(priv, name);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(val->type == m->type, EINA_FALSE);
-
-   dst = eina_value_struct_member_memory_get(priv, m);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(dst, EINA_FALSE);
-   src = eina_value_memory_get(val);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(src, EINA_FALSE);
-
-   eina_value_type_flush(m->type, dst);
-   if (!eina_value_type_setup(m->type, dst)) goto error_setup;
-   if (!eina_value_type_pset(m->type, dst, src)) goto error_set;
-   return EINA_TRUE;
-
- error_set:
-   eina_value_type_flush(m->type, dst);
- error_setup:
-   return EINA_FALSE;
+   Eina_Value *v = eina_model_interface_private_data_get
+     (model, EINA_MODEL_INTERFACE_PROPERTIES_STRUCT);
+   return eina_value_struct_value_set(v, name, val);
 }
 
 static Eina_Bool
index 0eb516d..f50395f 100644 (file)
@@ -758,7 +758,7 @@ START_TEST(eina_model_test_struct)
    };
    Eina_Value inv, outv;
    int i;
-   char c;
+   char c, *s;
    Eina_List *lst;
    Eina_Bool ck;
 
@@ -813,9 +813,7 @@ START_TEST(eina_model_test_struct)
    /* negative test (check safety was displayed by using print_cb) */
    eina_log_print_cb_set(_eina_test_model_check_safety_null, &ck);
 
-   ck = EINA_FALSE;
    fail_if(eina_model_property_get(m, "non-existent", &outv));
-   fail_unless(ck == EINA_TRUE);
 
    ck = EINA_FALSE;
    fail_if(eina_model_property_get(m, NULL, &outv));
@@ -843,6 +841,11 @@ START_TEST(eina_model_test_struct)
 
    eina_value_flush(&inv);
 
+   s = eina_model_to_string(m);
+   fail_unless(s != NULL);
+   ck_assert_str_eq(s, "Eina_Model_Type_Struct({c: 33, i: 1234}, [])");
+   free(s);
+
    ck_assert_int_eq(eina_model_refcount(m), 1);
 
    eina_model_unref(m);