123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /* $Id$
- *
- * Copyright 2001-2003, Meiosys (www.meiosys.com). All rights reserved.
- *
- * See the COPYING file for the terms of usage and distribution.
- */
- #ifndef __sd_list_h
- #define __sd_list_h
- /**
- * @file list.h @ingroup sd
- *
- * @brief Generic list object. It is implemented as an array of doubly-linked
- * lists of iterators. The index within the array is computed by a efficient
- * list function.
- */
- #include <stddef.h>
- #include <sd/defs.h>
- __SD_BEGIN_DECLS
- /**
- * This is the list object.
- */
- typedef struct __sd_list sd_list_t;
- struct __sd_list_iter {
- void* data;
- struct __sd_list* list;
- struct __sd_list_iter* __next;
- struct __sd_list_iter* __prev;
- int __foreach;
- };
- /**
- * This is the elementary container for storing data into the list object.
- */
- typedef struct __sd_list_iter sd_list_iter_t;
- /**
- * Signature of a "foreach" function.
- */
- typedef unsigned int (*sd_list_func_t)(void* a_data, void* a_userdata);
- /**
- * Creates a list.
- * @param a_capacity initial number of preallocated iterators
- * @return the list object.
- */
- extern sd_list_t* sd_list_new(size_t a_capacity);
- /**
- * Destroys the list object.
- * @todo need a function parameter to destroy list elements.
- */
- extern void sd_list_delete(sd_list_t* a_this);
- /**
- * Adds the given_data at the head of the list.
- */
- extern sd_list_iter_t* sd_list_prepend(sd_list_t* a_this, void* a_data);
- /**
- * Adds the given data at the tail of the list.
- */
- extern sd_list_iter_t* sd_list_append(sd_list_t* a_this, void* a_data);
- /**
- * Looks for the iterator associated to the given data in the list object.
- * @param a_data the data to find
- * @return a pointer to the found iterator or NULL.
- */
- extern sd_list_iter_t* sd_list_lookup(sd_list_t* a_this, void* a_data);
- /**
- * Looks for the iterator associated to the given data in the list object and
- * creates it if doesn't exist, using @c sd_list_add().
- * @param a_data the data to find/add
- * @return a pointer to the found iterator or NULL.
- */
- extern sd_list_iter_t* sd_list_lookadd(sd_list_t* a_this, void* a_data);
- /**
- * Adds the given data into the list object. If the data already exists,
- * the associated iterator is returned.
- * @warning the element is added at the begining of the list.
- * @param a_data the data to add
- * @return a pointer to the created or found iterator.
- */
- extern sd_list_iter_t* sd_list_add(sd_list_t* a_this, void* a_data);
- /**
- * Applies the given function to all list elements, starting from the
- * first one. As soon as the function returns a non-null value, the
- * given data is inserted in the list (before the element).
- * @param a_func the "sort" function.
- * @param a_data the data to add
- * @return a pointer to the created iterator.
- */
- extern sd_list_iter_t* sd_list_sortadd(sd_list_t* a_this,
- sd_list_func_t a_func,
- void* a_data);
- /**
- * Removes an iterator from the list object.
- * @param a_data the data associated to the iterator.
- */
- extern int sd_list_del(sd_list_t* a_this, void* a_data);
- /**
- * clears the list object.
- */
- extern void sd_list_clear(sd_list_t* a_this);
- /**
- * Calls \a a_func for each element of the list object, as long as \a a_func
- * returns 0.
- * @param a_func the "foreach" function.
- * @param a_data the user data passed to \a a_func.
- */
- extern void sd_list_foreach(sd_list_t* a_this, sd_list_func_t a_func,
- void* a_userdata);
- /**
- * Calls \a a_func for each element of the list object, as long as \a a_func
- * returns 0.
- * Same as sd_list_foreach but from tail to head of list.
- * @param a_func the "foreach" function.
- * @param a_data the user data passed to \a a_func.
- */
- extern void sd_list_rforeach(sd_list_t* a_this, sd_list_func_t a_func,
- void* a_userdata);
- /**
- * Gets the number of iterators.
- */
- extern size_t sd_list_get_nelem(sd_list_t* a_this);
- /**
- * Gets the iterator pointing to the first element of the list.
- */
- extern sd_list_iter_t* sd_list_begin(sd_list_t* a_this);
- /**
- * Gets the past-the-last-element iterator of the list.
- */
- extern sd_list_iter_t* sd_list_end(sd_list_t* a_this);
- /**
- * Gets the iterator pointing to the last element of the list.
- */
- extern sd_list_iter_t* sd_list_rbegin(sd_list_t* a_this);
- /**
- * Gets the before-the-first-element iterator of the list.
- */
- extern sd_list_iter_t* sd_list_rend(sd_list_t* a_this);
- /**
- * Gets a pointer to the next iterator.
- */
- extern sd_list_iter_t* sd_list_iter_next(sd_list_iter_t* a_this);
- /**
- * Gets a pointer to the previous iterator.
- */
- extern sd_list_iter_t* sd_list_iter_prev(sd_list_iter_t* a_this);
- /**
- * Deletes the iterator from the list.
- */
- extern void sd_list_iter_del(sd_list_iter_t* a_this);
- /**
- * Deletes the iterator from the list.
- */
- extern void sd_list_iter_del(sd_list_iter_t* a_this);
- /**
- * Creates a new iterator and inserts it before @a a_this.
- * @param a_data the data associated to the iterator.
- */
- extern sd_list_iter_t* sd_list_iter_insert(sd_list_iter_t* a_this,
- void* a_data);
- __SD_END_DECLS
- #endif
|