/* EINA - EFL data type library * Copyright (C) 2008 Cedric Bail * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; * if not, see . */ #ifndef EINA_ARRAY_H_ #define EINA_ARRAY_H_ #include #include "eina_types.h" #include "eina_error.h" #include "eina_iterator.h" #include "eina_accessor.h" #include "eina_magic.h" /** * @addtogroup Eina_Data_Types_Group Data Types * * @{ */ /** * @addtogroup Eina_Containers_Group Containers * * @{ */ /** * @defgroup Eina_Array_Group Array * * @{ */ /** * @typedef Eina_Array * Type for a generic vector. */ typedef struct _Eina_Array Eina_Array; /** * @typedef Eina_Array_Iterator * Type for an iterator on arrays, used with #EINA_ARRAY_ITER_NEXT. */ typedef void **Eina_Array_Iterator; /** * @struct _Eina_Array * Type for an array of data. */ struct _Eina_Array { EINA_MAGIC; void **data; /**< Pointer to a vector of pointer to payload */ unsigned int total; /**< Total number of slot in the vector */ unsigned int count; /**< Number of activ slot in the vector */ unsigned int step; /**< How much must we grow the vector when it is full */ }; EAPI int eina_array_init (void); EAPI int eina_array_shutdown (void); EAPI Eina_Array *eina_array_new (unsigned int step); EAPI void eina_array_free (Eina_Array *array); EAPI void eina_array_step_set (Eina_Array *array, unsigned int step); EAPI void eina_array_clean (Eina_Array *array); EAPI void eina_array_flush (Eina_Array *array); EAPI Eina_Bool eina_array_remove (Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata); static inline Eina_Bool eina_array_push (Eina_Array *array, const void *data); static inline void *eina_array_pop (Eina_Array *array); static inline void *eina_array_data_get (const Eina_Array *array, unsigned int index); static inline unsigned int eina_array_count_get (const Eina_Array *array); EAPI Eina_Iterator *eina_array_iterator_new (const Eina_Array *array); EAPI Eina_Accessor *eina_array_accessor_new (const Eina_Array *array); /** * @def EINA_ARRAY_ITER_NEXT * @brief Macro to iterate over an array easily. * * @param array The array to iterate over. * @param index The integer number that is increased while itareting. * @param item The data * @param iterator The iterator * * This macro allow the iteration over @p array in an easy way. It * iterates from the first element to the last one. @p index is an * integer that increase from 0 to the number of elements. @p item is * the data of each element of @p array, so it is a pointer to a type * chosen by the user. @p iterator is of type #Eina_Array_Iterator. * * This macro can be used for freeing the data of an array, like in * the following example: * * @code * Eina_Array *array; * char *item; * Eina_Array_Iterator *iterator; * unsigned int i; * * // array is already filled, * // its elements are just duplicated strings, * // EINA_ARRAY_ITER_NEXT will be used to free those strings * * EINA_ARRAY_ITER_NEXT(array, i, item, iterator) * free(item); * @endcode */ #define EINA_ARRAY_ITER_NEXT(array, index, item, iterator) \ for (index = 0, iterator = (array)->data, item = iterator != NULL ? *(iterator) : NULL; \ index < eina_array_count_get(array); \ ++(index), item = *(++(iterator))) #include "eina_inline_array.x" /** * @} */ /** * @} */ /** * @} */ #endif