2 * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
3 * All rights reserved. The file named COPYRIGHT specifies the terms
4 * and conditions for redistribution.
11 * $Id: pset.h,v 1.2 2003/03/09 19:27:08 steveg Exp $
16 typedef void *__pset_pointer ;
21 __pset_pointer *ptrs ; /* void Pointer to a Pointer */
31 typedef struct __pset *pset_h ;
33 pset_h pset_create( unsigned alloc_start, unsigned alloc_step );
34 void pset_destroy( pset_h pset );
36 void pset_delete( pset_h pset, const __pset_pointer ptr );
37 __pset_pointer pset_add( pset_h pset, const __pset_pointer ptr );
39 /* These 2 are in ops.c */
40 void pset_compact( pset_h pset );
41 void pset_apply( pset_h pset, void (*func)(), void *arg );
47 #define pset_remove( pset, ptr ) pset_delete( pset, (__pset_pointer)(ptr) )
49 #define pset_remove_index( pset, i ) \
51 if ( ((unsigned)i) < (pset)->count ) \
52 pset_delete(pset, (pset)->ptrs[ (unsigned)(i) ]); \
55 #define pset_clear( pset ) (pset)->count = 0
56 #define pset_count( pset ) (pset)->count
57 #define pset_pointer( pset, i ) (pset)->ptrs[ (unsigned)(i) ]
59 #define pset_sort( pset, compfunc ) \
60 (void) qsort( (char *) &pset_pointer( pset, 0 ), \
61 pset_count( pset ), sizeof( __pset_pointer ), compfunc )
66 * Note that the iterators do NOT use any knowledge about the internals
69 struct __pset_iterator
76 typedef struct __pset_iterator *psi_h ;
77 void psi_remove( psi_h iter );
79 #define __psi_current( iter ) \
80 ( (iter)->current < pset_count( (iter)->pset ) \
81 ? pset_pointer( (iter)->pset, (iter)->current ) \
84 #define psi_start( iter ) \
85 ( (iter)->current = 0, (iter)->step = 1, \
86 __psi_current( iter ) )
88 #define psi_next( iter ) \
89 ( (iter)->current += (iter)->step, (iter)->step = 1, \
90 __psi_current( iter ) )
92 #define psi_destroy( iter ) free( (char *) iter )
94 psi_h psi_create( pset_h pset );