eina: add eina_accessor_clone and update all Eina_Accessor to take advantage of it.

@feature.

Signed-off-by: Cedric Bail <cedric.bail@free.fr>
This commit is contained in:
Felipe Magno de Almeida 2014-02-25 17:22:28 -03:00 committed by Cedric Bail
parent 794bbcbca8
commit d63507446f
4 changed files with 74 additions and 1 deletions

View File

@ -167,6 +167,18 @@ eina_accessor_lock(Eina_Accessor *accessor)
return EINA_TRUE;
}
EAPI Eina_Accessor*
eina_accessor_clone(Eina_Accessor *accessor)
{
EINA_MAGIC_CHECK_ACCESSOR(accessor);
EINA_SAFETY_ON_NULL_RETURN_VAL(accessor, NULL);
if (accessor->clone)
return accessor->clone(accessor);
return NULL;
}
EAPI Eina_Bool
eina_accessor_unlock(Eina_Accessor *accessor)
{

View File

@ -145,6 +145,13 @@ typedef void (*Eina_Accessor_Free_Callback)(Eina_Accessor *it);
*/
typedef Eina_Bool (*Eina_Accessor_Lock_Callback)(Eina_Accessor *it);
/**
* @typedef Eina_Accessor_Clone_Callback
* Type for a callback that returns a clone for the accessor
* @since 1.10
*/
typedef Eina_Accessor* (*Eina_Accessor_Clone_Callback)(Eina_Accessor *it);
/**
* @struct _Eina_Accessor
* Type to provide random access to data structures.
@ -153,7 +160,7 @@ typedef Eina_Bool (*Eina_Accessor_Lock_Callback)(Eina_Accessor *it);
*/
struct _Eina_Accessor
{
#define EINA_ACCESSOR_VERSION 1
#define EINA_ACCESSOR_VERSION 2
int version; /**< Version of the Accessor API. */
Eina_Accessor_Get_At_Callback get_at EINA_ARG_NONNULL(1, 3) EINA_WARN_UNUSED_RESULT; /**< Callback called when a data element is requested. */
@ -165,6 +172,8 @@ struct _Eina_Accessor
#define EINA_MAGIC_ACCESSOR 0x98761232
EINA_MAGIC
Eina_Accessor_Clone_Callback clone EINA_WARN_UNUSED_RESULT; /**< Callback called when the container is to be cloned. @since 1.10 */
};
/**
@ -191,6 +200,13 @@ struct _Eina_Accessor
*/
#define FUNC_ACCESSOR_LOCK(Function) ((Eina_Accessor_Lock_Callback)Function)
/**
* @def FUNC_ACCESSOR_CLONE(Function)
* Helper macro to cast @p Function to a Eina_Iterator_Clone_Callback.
* @since 1.10
*/
#define FUNC_ACCESSOR_CLONE(Function) ((Eina_Accessor_Clone_Callback)Function)
/**
* @brief Free an accessor.
@ -267,6 +283,15 @@ EAPI void eina_accessor_over(Eina_Accessor *accessor,
*/
EAPI Eina_Bool eina_accessor_lock(Eina_Accessor *accessor) EINA_ARG_NONNULL(1);
/**
* @brief Clone the accessor.
*
* @param accessor The accessor.
* @return Another accessor
* @since 1.10
*/
EAPI Eina_Accessor* eina_accessor_clone(Eina_Accessor *accessor) EINA_ARG_NONNULL(1);
/**
* @brief Unlock the container of the accessor.
*

View File

@ -172,6 +172,22 @@ eina_array_accessor_free(Eina_Accessor_Array *it)
MAGIC_FREE(it);
}
static EAPI Eina_Accessor *
eina_array_accessor_clone(const Eina_Array *array)
{
Eina_Accessor_Array *ac;
EINA_SAFETY_ON_NULL_RETURN_VAL(array, NULL);
EINA_MAGIC_CHECK_ARRAY(array);
ac = calloc(1, sizeof (Eina_Accessor_Array));
if (!ac) return NULL;
memcpy(ac, array, sizeof(Eina_Accessor_Array));
return &ac->accessor;
}
/* used from eina_inline_array.x, thus a needed symbol */
EAPI Eina_Bool
eina_array_grow(Eina_Array *array)
@ -419,6 +435,8 @@ eina_array_accessor_new(const Eina_Array *array)
ac->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(
eina_array_accessor_get_container);
ac->accessor.free = FUNC_ACCESSOR_FREE(eina_array_accessor_free);
ac->accessor.clone = FUNC_ACCESSOR_CLONE(eina_array_accessor_clone);
return &ac->accessor;
}

View File

@ -385,6 +385,23 @@ eina_list_accessor_free(Eina_Accessor_List *it)
MAGIC_FREE(it);
}
static Eina_Accessor*
eina_list_accessor_clone(Eina_Accessor_List *list)
{
Eina_Accessor_List *ac;
EINA_MAGIC_CHECK_LIST_ACCESSOR(list, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL);
ac = calloc(1, sizeof (Eina_Accessor_List));
if (!ac) return NULL;
memcpy(ac, list, sizeof(Eina_Accessor_List));
return &ac->accessor;
}
static Eina_List *
eina_list_sort_rebuild_prev(Eina_List *list)
{
@ -1547,6 +1564,7 @@ eina_list_accessor_new(const Eina_List *list)
ac->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(
eina_list_accessor_get_container);
ac->accessor.free = FUNC_ACCESSOR_FREE(eina_list_accessor_free);
ac->accessor.clone = FUNC_ACCESSOR_CLONE(eina_list_accessor_clone);
return &ac->accessor;
}