diff options
author | Gustavo Sverzut Barbieri <barbieri@gmail.com> | 2012-01-24 22:56:17 +0000 |
---|---|---|
committer | Gustavo Sverzut Barbieri <barbieri@gmail.com> | 2012-01-24 22:56:17 +0000 |
commit | 80428af942e72ed714d44814161d54a8a81afb0d (patch) | |
tree | b8fa103d35095109a85c59db59ff825a4005ba56 /src/include/eina_inline_value.x | |
parent | 9481db86a26766fe316960b384dc58e30a3037e2 (diff) | |
download | eina-80428af942e72ed714d44814161d54a8a81afb0d.tar.gz |
value got the helper, will be useful in other cases as well.
SVN revision: 67518
Diffstat (limited to 'src/include/eina_inline_value.x')
-rw-r--r-- | src/include/eina_inline_value.x | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/src/include/eina_inline_value.x b/src/include/eina_inline_value.x index 5dc0c55..05b11c9 100644 --- a/src/include/eina_inline_value.x +++ b/src/include/eina_inline_value.x @@ -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 |