From 99971df3bc82bba951a92defeba98baae4ea2baa Mon Sep 17 00:00:00 2001 From: barbieri Date: Wed, 25 Jan 2012 16:58:57 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@67538 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/include/eina_inline_value.x | 60 +++++++++++++++++++++++++++++++++++++++++ src/include/eina_value.h | 28 +++++++++++++++++++ src/tests/eina_test_value.c | 14 ++++++++++ 3 files changed, 102 insertions(+) diff --git a/src/include/eina_inline_value.x b/src/include/eina_inline_value.x index 05b11c9..edc57ae 100644 --- a/src/include/eina_inline_value.x +++ b/src/include/eina_inline_value.x @@ -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 diff --git a/src/include/eina_value.h b/src/include/eina_value.h index 4f04a1a..06f32c9 100644 --- a/src/include/eina_value.h +++ b/src/include/eina_value.h @@ -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); + + +/** * @} */ diff --git a/src/tests/eina_test_value.c b/src/tests/eina_test_value.c index 2d04c2f..3925d60 100644 --- a/src/tests/eina_test_value.c +++ b/src/tests/eina_test_value.c @@ -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); -- 2.7.4