X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fplist.h;h=d5ec0823f740d42b795c4c9909851140aa7631dd;hb=5e1c8846ddf3b79a916b19b030bc03b5062d94e0;hp=4941169dbe27abfcb8cb83f51d1018b36ce62052;hpb=b658d7e61aef08fabe1d682a67c4142daed3efbd;p=libfirm diff --git a/ir/adt/plist.h b/ir/adt/plist.h index 4941169db..d5ec0823f 100644 --- a/ir/adt/plist.h +++ b/ir/adt/plist.h @@ -5,7 +5,8 @@ * This list uses an obstack and a free-list to efficiently manage its * elements. * @author Kimon Hoffmann - * @date 14.07.2005 + * @date 14.07.2005 + * @cvs-id $Id$ * @note Until now the code is entirely untested so it probably contains * plenty of errors. */ @@ -15,58 +16,73 @@ #include #include "obst.h" -typedef struct PListElement PListElement; -typedef struct PList PList; +typedef struct _plist_element plist_element_t; +typedef struct _plist plist_t; /** - * The Plist data type. + * The plist data type. */ -struct PList { +struct _plist { /** * The obstack used for all allocations. */ - struct obstack obst; + struct obstack *obst; + + /* Set to 1 if plist uses a foreign obstack */ + unsigned foreign_obstack : 1; + /** * First element in the list. */ - PListElement* firstElement; + plist_element_t *first_element; + /** * Last element in the list. */ - PListElement* lastElement; + plist_element_t *last_element; + /** * Current number of elements in the list. */ - int elementCount; + int element_count; + /** * First element in the free list. * Please note that the free list is a single linked list and all back * references are invalid. */ - PListElement* firstFreeElement; + plist_element_t* first_free_element; }; /** * An element in the pointer list. */ -struct PListElement { - PListElement* next; - PListElement* prev; - void* data; +struct _plist_element { + plist_element_t *next; + plist_element_t *prev; + void *data; }; /** * Creates a new pointer list and initializes it. * @return The newly created pointer list. */ -PList* plist_new(void); +plist_t *plist_new(void); + +/** + * Creates a new pointer list and initializes it. + * Uses the given obstack instead of creating one. + * @param obst The obstack to use + * @return The newly created pointer list. + */ +plist_t *plist_obstack_new(struct obstack *obst); /** * Frees the passed pointer list. * After a call to this function all references to the list and any of * its elements are invalid. */ -void plist_free(PList* list); +void plist_free(plist_t *list); /** * Returns the number of elements in a pointer list. @@ -74,21 +90,21 @@ void plist_free(PList* list); * @return The number of elements in a pointer list. */ #define plist_count(list) \ - ((list)->elementCount) + ((list)->element_count) /** * Inserts an element at the back of a pointer list. * @param list the pointer list to append the new element to. * @param value the element value to append. */ -void plist_insert_back(PList* list, void* value); +void plist_insert_back(plist_t *list, void *value); /** * Inserts an element at the front of a pointer list. * @param list the pointer list to prepend the new element to. * @param value the element value to prepend. */ -void plist_insert_front(PList* list, void* value); +void plist_insert_front(plist_t *list, void *value); /** * Inserts an element into a pointer list before the specified element, @@ -98,7 +114,7 @@ void plist_insert_front(PList* list, void* value); * be inserted. This element must be a part of @p list. * @param value the element value to insert. */ -void plist_insert_before(PList* list, PListElement* element, void* value); +void plist_insert_before(plist_t *list, plist_element_t *element, void *value); /** * Inserts an element into a pointer list after the specified element, @@ -108,21 +124,37 @@ void plist_insert_before(PList* list, PListElement* element, void* value); * be inserted. This element must be a part of @p list. * @param value the element value to insert. */ -void plist_insert_after(PList* list, PListElement* element, void* value); +void plist_insert_after(plist_t *list, plist_element_t *element, void *value); + +/** + * Checks if list has an element with the given data pointer. + * @param list the list to check + * @param value the data pointer to look for + * @return 1 if element with data pointer found, 0 otherwise + */ +int plist_has_value(plist_t *list, void *value); + +/** + * Tries to find list element associated to the given data pointer. + * @param list the list to check + * @param value the data pointer to look for + * @return The first list element associated to data pointer if found, NULL otherwise + */ +plist_element_t *plist_find_value(plist_t *list, void *value); /** * Erases the specified element from the pointer list. - * @param list the pointer list from which the lement should be erased. + * @param list the pointer list from which the element should be erased. * @param element the list element to erase. This element must be a part * of @p list. */ -void plist_erase(PList* list, PListElement* element); +void plist_erase(plist_t *list, plist_element_t *element); /** * Erases all elements from the specified pointer list. - * @param list the pointer list that should be cleard. + * @param list the pointer list that should be cleared. */ -void plist_clear(PList* list); +void plist_clear(plist_t *list); /** * Returns the first element of a pointer list. @@ -130,7 +162,7 @@ void plist_clear(PList* list); * @return a pointer to the element or NULL if the list is empty */ #define plist_first(list) \ - ((list)->firstElement) + ((list)->first_element) /** * Returns the last element of a pointer list. @@ -138,11 +170,11 @@ void plist_clear(PList* list); * @return a pointer to the element or NULL if the list is empty */ #define plist_last(list) \ - ((list)->lastElement) + ((list)->last_element) /** * Checks whether a pointer list element has a successor or not. - * @param element the list element that should be queried for existance + * @param element the list element that should be queried for existence * of a successor. * @return TRUE if @p element has a successor, otherwise FALSE. */ @@ -151,7 +183,7 @@ void plist_clear(PList* list); /** * Checks whether a pointer list element has a predecessor or not. - * @param element the list element that should be queried for existance + * @param element the list element that should be queried for existence * of a predecessor. * @return TRUE if @p element has a successor, otherwise FALSE. */ @@ -184,4 +216,10 @@ void plist_clear(PList* list); #define plist_element_get_value(element) \ ((element)->data) +/** + * Convenience macro to iterate over a plist. + */ +#define foreach_plist(list, el) \ + for (el = plist_first(list); el; el = plist_element_get_next(el)) + #endif /*_PLIST_H_*/