X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Fadt%2Fset.h;h=f2235bdb261473d1db3e29f3e7db2e65fbd6b303;hb=8b9cffd15955b08311c41c37cd06acd7db3bd7f4;hp=6d736dff6e3c2a47d8dd47421158560c05f4d4b5;hpb=47d3710a0ef90ab130f160aa690b9d8b4bba98f1;p=libfirm diff --git a/include/libfirm/adt/set.h b/include/libfirm/adt/set.h index 6d736dff6..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,13 +21,22 @@ * @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 #include +#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. * @@ -38,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; /** @@ -67,25 +76,27 @@ typedef int (*set_cmp_fun) (const void *elt, const void *key, size_t size); * Creates a new set. * * @param func The compare function of this set. - * @param slots Initial number of collision chains. I.e., #slots + * @param slots Initial number of collision chains. I.e., \#slots * different keys can be hashed without collisions. * * @returns * created set */ -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. + * + * @param set the set to delete */ -void del_set (set *set); +FIRM_API void del_set(set *set); /** * Returns the number of elements in a set. * * @param set the set */ -int set_count (set *set); +FIRM_API size_t set_count(set *set); /** * Searches an element in a set. @@ -98,7 +109,7 @@ int set_count (set *set); * @return * The address of the found element in the set or NULL if it was not found. */ -void *set_find (set *set, const void *key, size_t size, unsigned hash); +FIRM_API void *set_find(set *set, const void *key, size_t size, unsigned hash); /** * Inserts an element into a set. @@ -115,7 +126,7 @@ void *set_find (set *set, const void *key, size_t size, unsigned hash); * that should be inserted is already in the set, this functions does * nothing but returning its pointer. */ -void *set_insert (set *set, const void *key, size_t size, unsigned hash); +FIRM_API void *set_insert(set *set, const void *key, size_t size, unsigned hash); /** * Inserts an element into a set and returns its set_entry. @@ -132,7 +143,7 @@ void *set_insert (set *set, const void *key, size_t size, unsigned hash); * that should be inserted is already in the set, this functions does * nothing but returning its set_entry. */ -set_entry *set_hinsert (set *set, const void *key, size_t size, unsigned hash); +FIRM_API set_entry *set_hinsert(set *set, const void *key, size_t size, unsigned hash); /** * Inserts an element into a set, zero-terminate it and returns its set_entry. @@ -149,7 +160,7 @@ set_entry *set_hinsert (set *set, const void *key, size_t size, unsigned hash); * that should be inserted is already in the set, this functions does * nothing but returning its set_entry. */ -set_entry *set_hinsert0 (set *set, const void *key, size_t size, unsigned hash); +FIRM_API set_entry *set_hinsert0(set *set, const void *key, size_t size, unsigned hash); /** * Returns the first element of a set. @@ -158,17 +169,42 @@ set_entry *set_hinsert0 (set *set, const void *key, size_t size, unsigned hash); * * @return a pointer to the element or NULL if the set is empty */ -void *set_first (set *set); +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. + * + * @param set the set to iterate + * + * @return a pointer to the next element or NULL if the + * iteration is finished + */ +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 */ -void *set_next (set *set); +#define set_next(type, set) ((type*)set_next((set))) /** * Breaks the iteration of a set. Must be called before @@ -177,69 +213,38 @@ void *set_next (set *set); * * @param set the set */ -void set_break (set *set); +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, entry) for (entry = set_first(set); entry; entry = 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 - */ -void set_describe (set *set); -#endif +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); -/* Private */ +/** @endcond */ -typedef enum { _set_find, _set_insert, _set_hinsert, _set_hinsert0 } _set_action; +/** @} */ -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) */ +#include "../end.h" #endif