X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fadt%2Fpset.h;h=ad1931c2724398139811f88912dc8568ab730309;hb=1a06a5a742509e6027ed64b8b28f95e22c00a006;hp=620a44d514dc276e9a381e58e34cb7e70a619c15;hpb=ffe4c677aa8e6bac4fe345dd0c92d54792f013bf;p=libfirm diff --git a/ir/adt/pset.h b/ir/adt/pset.h index 620a44d51..ad1931c27 100644 --- a/ir/adt/pset.h +++ b/ir/adt/pset.h @@ -15,6 +15,17 @@ #include +#include "hashptr.h" +#include "iterator.h" + +/** + * The default comparison function for pointers. + * @param x A pointer. + * @param y A pointer. + * @return 0 if @p x and @p y are equal. Some value != 0 otherwise. + */ +int pset_default_ptr_cmp(const void *x, const void *y); + /** * The abstract type of a pset (Set of pointers). * @@ -25,6 +36,16 @@ */ typedef struct pset pset; +/* + * Define some convenience macros using the predefined hash function. + */ +#define pset_insert_ptr(set,key) pset_insert(set, key, HASH_PTR(key)) +#define pset_hinsert_ptr(set,key) pset_hinsert(set, key, HASH_PTR(key)) +#define pset_remove_ptr(set,key) pset_remove(set, key, HASH_PTR(key)) +#define pset_find_ptr(set,key) pset_find(set, key, HASH_PTR(key)) +#define pset_new_ptr(slots) new_pset(pset_default_ptr_cmp, slots) +#define pset_new_ptr_default() pset_new_ptr(64) + /** The entry of a pset, representing an element pointer in the set and it's meta-information */ typedef struct { unsigned hash; @@ -45,8 +66,9 @@ 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 number of initial slots + * @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 @@ -56,6 +78,8 @@ 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! */ @@ -72,11 +96,11 @@ int pset_count (pset *pset); * Searches an element pointer in a pset. * * @param pset the pset to search in - * @param key the element to is searched + * @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 + * the pointer of the found element in the pset or NULL if it was not found */ void *pset_find (pset *pset, const void *key, unsigned hash); @@ -90,9 +114,9 @@ void *pset_find (pset *pset, const void *key, unsigned hash); * @return a pointer to the inserted element * * @note - * It is not possible to insert on element more than once. If a element + * It is not possible to insert an element more than once. If an element * that should be inserted is already in the set, this functions does - * nothing but returning its set_entry. + * nothing but returning its already existing set_entry. */ void *pset_insert (pset *pset, const void *key, unsigned hash); @@ -107,7 +131,7 @@ void *pset_insert (pset *pset, const void *key, unsigned hash); * @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 + * It is not possible to insert an element more than once. If an element * that should be inserted is already in the pset, this functions does * nothing but returning its pset_entry. */ @@ -116,8 +140,8 @@ 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 pset the pset to delete in + * @param key a pointer to the element to be deleted * @param hash the hash-value of the element * * @return @@ -125,6 +149,7 @@ pset_entry *pset_hinsert (pset *pset, const void *key, unsigned hash); * * @remark * The current implementation did not allow to remove non-existing elements. + * @@@ so, does it do now? * Further, it is allowed to remove elements during an iteration * including the current one. */ @@ -158,6 +183,15 @@ void *pset_next (pset *pset); */ void pset_break (pset *pset); +/** + * Inserts all elements of the pointer set src into + * the set target (union). + * + * @param target the target set, will contain the union + * @param src a set, will not be changed + */ +void pset_insert_pset_ptr(pset *target, pset *src); + #define new_pset(cmp, slots) (PSET_TRACE (new_pset) ((cmp), (slots))) #define pset_find(pset, key, hash) \ _pset_search ((pset), (key), (hash), _pset_find) @@ -179,10 +213,15 @@ void pset_stats (pset *pset); #ifdef DEBUG /** - * Describe a set by printing all elements - * to stdout. + * Describe a pset. + * + * Writes a description of a set to stdout. The description includes: + * - a header telling how many elements (nkey) and segments (nseg) are in use + * - for every collision chain the number of element with its hash values + * + * @param pset the pset */ -void pset_describe (pset *); +void pset_describe (pset *pset); #endif /* @@@ NYI */