eina_value_struct_member_value: helper to be used by esql and possibly others.
authorGustavo Sverzut Barbieri <barbieri@gmail.com>
Wed, 25 Jan 2012 16:58:57 +0000 (16:58 +0000)
committerGustavo Sverzut Barbieri <barbieri@gmail.com>
Wed, 25 Jan 2012 16:58:57 +0000 (16:58 +0000)
It is common to already known the member, then no need to query
it. This provides optimized retrieval for people that can manage it.

SVN revision: 67538

legacy/eina/src/include/eina_inline_value.x
legacy/eina/src/include/eina_value.h
legacy/eina/src/tests/eina_test_value.c

index 05b11c9..edc57ae 100644 (file)
@@ -1657,6 +1657,66 @@ eina_value_struct_value_set(Eina_Value *dst, const char *name, const Eina_Value
    return EINA_FALSE;
 }
 
+static inline Eina_Bool
+eina_value_struct_member_value_get(const Eina_Value *src, const Eina_Value_Struct_Member *member, Eina_Value *dst)
+{
+   const Eina_Value_Struct *st;
+   const void *mem;
+
+   EINA_VALUE_TYPE_STRUCT_CHECK_RETURN_VAL(src, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(member, 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;
+   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_member_value_set(Eina_Value *dst, const Eina_Value_Struct_Member *member, const Eina_Value *src)
+{
+   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(member, 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;
+   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 4f04a1a..06f32c9 100644 (file)
@@ -2974,6 +2974,34 @@ static inline Eina_Bool eina_value_struct_value_set(Eina_Value *dst,
                                                     const Eina_Value *src) EINA_ARG_NONNULL(1, 2, 3);
 
 /**
+ * @brief Get the member as Eina_Value copy given its member description.
+ * @param src source value object
+ * @param member the member description to use
+ * @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_member_value_get(const Eina_Value *src,
+                                                           const Eina_Value_Struct_Member *member,
+                                                           Eina_Value *dst) EINA_ARG_NONNULL(1, 2, 3);
+
+/**
+ * @brief Set the member from Eina_Value source
+ * @param dst destination value object
+ * @param member the member description to use
+ * @param src source value
+ *
+ * @since 1.2
+ */
+static inline Eina_Bool eina_value_struct_member_value_set(Eina_Value *dst,
+                                                           const Eina_Value_Struct_Member *member,
+                                                           const Eina_Value *src) EINA_ARG_NONNULL(1, 2, 3);
+
+
+/**
  * @}
  */
 
index 2d04c2f..3925d60 100644 (file)
@@ -1606,6 +1606,20 @@ START_TEST(eina_value_test_struct)
    fail_unless(eina_value_struct_get(value, "c", &c));
    fail_unless(c == 0xf);
 
+   fail_unless(eina_value_struct_member_value_get
+               (value, myst_members + 0, &other));
+   fail_unless(other.type == EINA_VALUE_TYPE_INT);
+   fail_unless(eina_value_get(&other, &i));
+   fail_unless(i == 5678);
+   eina_value_flush(&other);
+
+   fail_unless(eina_value_struct_member_value_get
+               (value, myst_members + 1, &other));
+   fail_unless(other.type == EINA_VALUE_TYPE_CHAR);
+   fail_unless(eina_value_get(&other, &c));
+   fail_unless(c = 0xf);
+   eina_value_flush(&other);
+
    str = eina_value_to_string(value);
    fail_unless(str != NULL);
    fail_unless(strcmp(str, "{i: 5678, c: 15}") == 0);