eina_value_struct_member_value: helper to be used by esql and possibly others.

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
This commit is contained in:
Gustavo Sverzut Barbieri 2012-01-25 16:58:57 +00:00
parent 664e6939fb
commit 3683b0e719
3 changed files with 102 additions and 0 deletions

View 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

View File

@ -2973,6 +2973,34 @@ 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);
/**
* @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);
/**
* @}
*/

View 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);