X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=include%2Flibfirm%2Fadt%2Fset.h;h=f2235bdb261473d1db3e29f3e7db2e65fbd6b303;hb=43b545e3269a432382c13559abc75c15ebde83e7;hp=67e9dd647ca954424091a58b3d63990cf6262c61;hpb=ce6161a7e42a48f7422b7babcc64d8ace18e2687;p=libfirm diff --git a/include/libfirm/adt/set.h b/include/libfirm/adt/set.h index 67e9dd647..f2235bdb2 100644 --- a/include/libfirm/adt/set.h +++ b/include/libfirm/adt/set.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -21,7 +21,6 @@ * @file * @brief hashset: datastructure containing objects accessible by their key * @author Markus Armbruster - * @version $Id$ */ #ifndef FIRM_ADT_SET_H #define FIRM_ADT_SET_H @@ -30,6 +29,14 @@ #include "../begin.h" +/** + * @ingroup adt + * @defgroup set Generic Hashset + * Generic Hashset + * @note This code has been deprecated. Use hashset for new code. + * @{ + */ + /** * The abstract type of a set. * @@ -40,12 +47,12 @@ */ typedef struct set set; -/** The entry of a set, representing an element in the set and it's meta-information */ +/** The entry of a set, representing an element in the set and its meta-information */ typedef struct set_entry { - unsigned hash; /**< the hash value of the element */ - size_t size; /**< the size of the element */ - int dptr[1]; /**< the element itself, data copied in must not need more - alignment than this */ + unsigned hash; /**< the hash value of the element */ + size_t size; /**< the size of the element */ + int dptr[1]; /**< the element itself, data copied in must not need more + alignment than this */ } set_entry; /** @@ -75,7 +82,7 @@ typedef int (*set_cmp_fun) (const void *elt, const void *key, size_t size); * @returns * created set */ -FIRM_API set *new_set(set_cmp_fun func, int slots); +FIRM_API set *new_set(set_cmp_fun func, size_t slots); /** * Deletes a set and all elements of it. @@ -89,7 +96,7 @@ FIRM_API void del_set(set *set); * * @param set the set */ -FIRM_API int set_count(set *set); +FIRM_API size_t set_count(set *set); /** * Searches an element in a set. @@ -164,6 +171,18 @@ FIRM_API set_entry *set_hinsert0(set *set, const void *key, size_t size, unsigne */ FIRM_API void *set_first(set *set); +/** + * Returns the first element of a set. + * This is a wrapper for set_first(set *set); It allows to express the + * intended type of the set elements (instead of weakly typed void*). + * + * @param set the set to iterate + * @param type type of the set elements + * + * @return a pointer to the element or NULL if the set is empty + */ +#define set_first(type, set) ((type*)set_first((set))) + /** * Returns the next element of a set. * @@ -174,6 +193,19 @@ FIRM_API void *set_first(set *set); */ FIRM_API void *set_next(set *set); +/** + * Returns the next element of a set. + * This is a wrapper for set_next(set *set); It allows to express the + * intended type of the set elements (instead of weakly typed void*). + * + * @param set the set to iterate + * @param type type of the set elements + * + * @return a pointer to the next element or NULL if the + * iteration is finished + */ +#define set_next(type, set) ((type*)set_next((set))) + /** * Breaks the iteration of a set. Must be called before * the next set_first() call if the iteration was NOT @@ -187,64 +219,31 @@ FIRM_API void set_break(set *set); * Iterates over an set. * * @param set the set + * @param type type of iterator variable * @param entry the iterator */ -#define foreach_set(set, type, entry) for (entry = (type) set_first(set); entry; entry = (type) set_next(set)) +#define foreach_set(set, type, entry) for (type *entry = set_first(type, set); entry; entry = set_next(type, set)) + +/** @cond PRIVATE */ /* implementation specific */ -#define new_set(cmp, slots) (SET_TRACE (new_set) ((cmp), (slots))) -#define set_find(set, key, size, hash) \ - _set_search ((set), (key), (size), (hash), _set_find) -#define set_insert(set, key, size, hash) \ - _set_search ((set), (key), (size), (hash), _set_insert) +#define new_set(cmp, slots) ((new_set) ((cmp), (slots))) +#define set_find(type, set, key, size, hash) \ + ((type*)_set_search((set), 1 ? (key) : (type*)0 /* type check */, (size), (hash), _set_find)) +#define set_insert(type, set, key, size, hash) \ + ((type*)_set_search((set), 1 ? (key) : (type*)0 /* type check */, (size), (hash), _set_insert)) #define set_hinsert(set, key, size, hash) \ ((set_entry *)_set_search ((set), (key), (size), (hash), _set_hinsert)) #define set_hinsert0(set, key, size, hash) \ ((set_entry *)_set_search ((set), (key), (size), (hash), _set_hinsert0)) -#define SET_VRFY(set) (void)0 - -#ifdef STATS -/** - * Prints statistics on a set to stdout. - * - * @param set the set - */ -void set_stats (set *set); -#else -# define set_stats(s) ((void)0) -#endif - -#ifdef DEBUG -/** - * Describe a set. - * - * 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 set the set - */ -FIRM_API void set_describe (set *set); -#endif - - -/* Private */ - typedef enum { _set_find, _set_insert, _set_hinsert, _set_hinsert0 } _set_action; FIRM_API void *_set_search(set *, const void *, size_t, unsigned, _set_action); -#if defined(DEBUG) && defined(HAVE_GNU_MALLOC) -extern const char *set_tag; -# ifdef SET_ID -# define SET_TRACE set_tag = SET_ID, -# else -# define SET_TRACE set_tag = __FILE__, -# endif -#else /* !(DEBUG && HAVE_GNU_MALLOC) */ -# define SET_TRACE -#endif /* !(DEBUG && HAVE_GNU_MALLOC) */ +/** @endcond */ + +/** @} */ #include "../end.h"