summaryrefslogtreecommitdiff
path: root/src/include/eina_inline_value.x
diff options
context:
space:
mode:
authorGustavo Sverzut Barbieri <barbieri@gmail.com>2012-01-24 22:56:17 +0000
committerGustavo Sverzut Barbieri <barbieri@gmail.com>2012-01-24 22:56:17 +0000
commit80428af942e72ed714d44814161d54a8a81afb0d (patch)
treeb8fa103d35095109a85c59db59ff825a4005ba56 /src/include/eina_inline_value.x
parent9481db86a26766fe316960b384dc58e30a3037e2 (diff)
downloadeina-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.x75
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