forked from enlightenment/efl
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:
parent
794bbcbca8
commit
d63507446f
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue