From 90e2259b6f6311634c34534f74d59f21d24ff2b9 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Thu, 12 Jan 2012 17:45:51 +0000 Subject: [PATCH] eina_value: improve docs and add blob operations helper. SVN revision: 67149 --- legacy/eina/src/include/eina_value.h | 21 ++++++++++ legacy/eina/src/lib/eina_value.c | 60 +++++++++++++++------------- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/legacy/eina/src/include/eina_value.h b/legacy/eina/src/include/eina_value.h index 97fbee9c7a..faf4de4da6 100644 --- a/legacy/eina/src/include/eina_value.h +++ b/legacy/eina/src/include/eina_value.h @@ -287,6 +287,16 @@ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_TIMEVAL; /** * @var EINA_VALUE_TYPE_BLOB * manages blob of bytes type, see @ref Eina_Value_Blob + * + * eina_value_set() takes an #Eina_Value_Blob + * eina_value_pset() takes a pointer to #Eina_Value_Blob. + * + * eina_value_get() and eina_value_pget() takes a pointer to + * #Eina_Value_Blob and it's an exact copy of value, no allocations + * are made. + * + * Memory is untouched unless you provide @c ops (operations) pointer. + * * @since 1.2 */ EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_BLOB; @@ -2370,6 +2380,17 @@ struct _Eina_Value_Blob_Operations char *(*to_string)(const Eina_Value_Blob_Operations *ops, const void *memory, size_t size); }; +/** + * @var EINA_VALUE_BLOB_OPERATIONS_MALLOC + * + * Assumes @c memory was create with malloc() and applies free() to it + * during flush (Eina_Value_Blob_Operations::free). Copy is done with + * malloc() as well. + * + * No compare or to_string are provided, defaults will be used. + */ +EAPI extern const Eina_Value_Blob_Operations *EINA_VALUE_BLOB_OPERATIONS_MALLOC; + /** * @typedef Eina_Value_Blob * @since 1.2 diff --git a/legacy/eina/src/lib/eina_value.c b/legacy/eina/src/lib/eina_value.c index 99528b8977..8d02a8fc0d 100644 --- a/legacy/eina/src/lib/eina_value.c +++ b/legacy/eina/src/lib/eina_value.c @@ -3690,33 +3690,6 @@ _eina_value_type_blob_convert_to(const Eina_Value_Type *type __UNUSED__, const E } } -static void -_eina_value_type_blob_converted_ops_free(const Eina_Value_Blob_Operations *ops __UNUSED__, void *memory, size_t size __UNUSED__) -{ - free(memory); -} - -static void * -_eina_value_type_blob_converted_ops_copy(const Eina_Value_Blob_Operations *ops __UNUSED__, const void *memory, size_t size) -{ - void *ret = malloc(size); - if (!ret) - { - eina_error_set(EINA_ERROR_OUT_OF_MEMORY); - return NULL; - } - memcpy(ret, memory, size); - return ret; -} - -static const Eina_Value_Blob_Operations _eina_value_type_blob_converted_ops = { - EINA_VALUE_BLOB_OPERATIONS_VERSION, - _eina_value_type_blob_converted_ops_free, - _eina_value_type_blob_converted_ops_copy, - NULL, /* default compare */ - NULL, /* default to_string */ -}; - static Eina_Bool _eina_value_type_blob_convert_from(const Eina_Value_Type *type, const Eina_Value_Type *convert, void *type_mem, const void *convert_mem) { @@ -3732,7 +3705,7 @@ _eina_value_type_blob_convert_from(const Eina_Value_Type *type, const Eina_Value if (!eina_value_type_pget(convert, convert_mem, buf)) return EINA_FALSE; - desc.ops = &_eina_value_type_blob_converted_ops; + desc.ops = EINA_VALUE_BLOB_OPERATIONS_MALLOC; desc.memory = buf; desc.size = convert->value_size; return eina_value_type_pset(type, type_mem, &desc); @@ -3987,6 +3960,33 @@ static const Eina_Value_Type _EINA_VALUE_TYPE_BASICS[] = { } }; +static void +_eina_value_blob_operations_malloc_free(const Eina_Value_Blob_Operations *ops __UNUSED__, void *memory, size_t size __UNUSED__) +{ + free(memory); +} + +static void * +_eina_value_blob_operations_malloc_copy(const Eina_Value_Blob_Operations *ops __UNUSED__, const void *memory, size_t size) +{ + void *ret = malloc(size); + if (!ret) + { + eina_error_set(EINA_ERROR_OUT_OF_MEMORY); + return NULL; + } + memcpy(ret, memory, size); + return ret; +} + +static const Eina_Value_Blob_Operations _EINA_VALUE_BLOB_OPERATIONS_MALLOC = { + EINA_VALUE_BLOB_OPERATIONS_VERSION, + _eina_value_blob_operations_malloc_free, + _eina_value_blob_operations_malloc_copy, + NULL, + NULL +}; + /** * @endcond */ @@ -4045,6 +4045,8 @@ eina_value_init(void) EINA_VALUE_TYPE_TIMEVAL = &_EINA_VALUE_TYPE_TIMEVAL; EINA_VALUE_TYPE_BLOB = &_EINA_VALUE_TYPE_BLOB; + EINA_VALUE_BLOB_OPERATIONS_MALLOC = &_EINA_VALUE_BLOB_OPERATIONS_MALLOC; + return EINA_TRUE; } @@ -4098,6 +4100,8 @@ EAPI const Eina_Value_Type *EINA_VALUE_TYPE_HASH = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_TIMEVAL = NULL; EAPI const Eina_Value_Type *EINA_VALUE_TYPE_BLOB = NULL; +EAPI const Eina_Value_Blob_Operations *EINA_VALUE_BLOB_OPERATIONS_MALLOC = NULL; + EAPI Eina_Error EINA_ERROR_VALUE_FAILED = 0; EAPI const unsigned int eina_prime_table[] =