X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fpset.h;h=059005f5392dc87efb733cf1ef3132ad5420c2c7;hb=6ddfdef22108fc17578388b6207e38bd2ba77b82;hp=d51f062b3705d57d56547a4c989b787021694686;hpb=efbeaff549fcc6015da255ed4d453a95937ff0fd;p=libfirm diff --git a/ir/adt/pset.h b/ir/adt/pset.h index d51f062b3..059005f53 100644 --- a/ir/adt/pset.h +++ b/ir/adt/pset.h @@ -1,32 +1,165 @@ -/* Declarations for pset. - Copyright (C) 1995, 1996 Markus Armbruster */ +/* + * Project: libFIRM + * File name: ir/adt/pset.h + * Purpose: Declarations for pset. + * Author: Markus Armbruster + * Modified by: + * Created: 1999 by getting from fiasco + * CVS-ID: $Id$ + * Copyright: (c) 1995, 1996 Markus Armbruster + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ #ifndef _PSET_H #define _PSET_H #include +/** + * The abstract type of a pset (Set of pointers). + * + * This kind of sets stores only pointer to elements, the elements itself + * must be stored somewere else. + * + * @see set + */ typedef struct pset pset; +/** The entry of a pset, representing an element pointer in the set and it's meta-information */ typedef struct { unsigned hash; void *dptr; } pset_entry; - -typedef int (*pset_cmp_fun) (const void *, const void *); - -pset *new_pset (pset_cmp_fun, int slots); -void del_pset (pset *); - -void *pset_find (pset *, const void *key, unsigned hash); -void *pset_insert (pset *, const void *key, unsigned hash); -pset_entry *pset_hinsert (pset *, const void *key, unsigned hash); -void *pset_remove (pset *, const void *key, unsigned hash); - -void *pset_first (pset *); -void *pset_next (pset *); -void pset_break (pset *); +/** + * The type of a set compare function. + * + * @param elt pointer to an element + * @param key pointer to another element + * + * @return + * 0 if the elements are identically, non-zero else + */ +typedef int (*pset_cmp_fun) (const void *elt, const void *key); + +/** + * Creates a new pset. + * + * @param func The compare function of this pset. + * @param slots Initial number of collision chains. I.e., #slots + * different keys can be hashed without collisions. + * + * @returns + * created pset + */ +pset *new_pset (pset_cmp_fun func, int slots); + +/** + * Deletes a pset. + * + * @param pset the pset + * + * @note + * This does NOT delete the elements of this pset, just it's pointers! + */ +void del_pset (pset *pset); + +/** + * Returns the number of elements in a pset. + * + * @param pset the pset + */ +int pset_count (pset *pset); + +/** + * Searches an element pointer in a pset. + * + * @param pset the pset to search in + * @param key the element to search + * @param hash the hash value of key + * + * @return + * the pointer of the found element in the pset of NULL if it was not found + */ +void *pset_find (pset *pset, const void *key, unsigned hash); + +/** + * Inserts an element pointer into a pset. + * + * @param pset the pset to insert in + * @param key a pointer to the element to be inserted + * @param hash the hash-value of the element + * + * @return a pointer to the inserted element + * + * @note + * It is not possible to insert on element more than once. If a element + * that should be inserted is already in the set, this functions does + * nothing but returning its already existing set_entry. + + */ +void *pset_insert (pset *pset, const void *key, unsigned hash); + +/** + * Inserts an element pointer into a pset and returns its pset_entry. + * + * @param pset the pset to insert in + * @param key a pointer to the element to be inserted + * @param hash the hash-value of the element + * + * @return a pointer to the pset_entry of the inserted element + * + * @note + * It is not possible to insert on element more than once. If a element + * that should be inserted is already in the pset, this functions does + * nothing but returning its pset_entry. + */ +pset_entry *pset_hinsert (pset *pset, const void *key, unsigned hash); + +/** + * Removes an element from a pset. + * + * @param pset the pset to insert in + * @param key a pointer to the element to be inserted + * @param hash the hash-value of the element + * + * @return + * the pointer to the removed element + * + * @remark + * The current implementation did not allow to remove non-existing elements. + * Further, it is allowed to remove elements during an iteration + * including the current one. + */ +void *pset_remove (pset *pset, const void *key, unsigned hash); + +/** + * Returns the first element of a pset. + * + * @param pset the pset to iterate + * + * @return a pointer to the element or NULL if the set is empty + */ +void *pset_first (pset *pset); + +/** + * Returns the next element of a pset. + * + * @param pset the pset to iterate + * + * @return a pointer to the next element or NULL if the + * iteration is finished + */ +void *pset_next (pset *pset); + +/** + * Breaks the iteration of a set. Must be called before + * the next pset_first() call if the iteration was NOT + * finished. + * + * @param pset the pset + */ +void pset_break (pset *pset); #define new_pset(cmp, slots) (PSET_TRACE (new_pset) ((cmp), (slots))) #define pset_find(pset, key, hash) \ @@ -37,12 +170,21 @@ void pset_break (pset *); ((pset_entry *)_pset_search ((pset), (key), (hash), _pset_hinsert)) #ifdef STATS -void pset_stats (pset *); +/** + * Prints statistics on a set to stdout. + * + * @param pset the pset + */ +void pset_stats (pset *pset); #else # define pset_stats(s) ((void)0) #endif #ifdef DEBUG +/** + * Describe a set by printing all elements + * to stdout. + */ void pset_describe (pset *); #endif