1 /* 2 * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis 3 * All rights reserved. The file named COPYRIGHT specifies the terms 4 * and conditions for redistribution. 5 */ 6 7 #ifndef __PSET_H 8 #define __PSET_H 9 10 /* 11 * $Id: pset.h,v 1.2 2003-03-09 19:27:08 steveg Exp $ 12 */ 13 14 #include <stdlib.h> 15 16 typedef void *__pset_pointer ; 17 18 struct __pset 19 { 20 unsigned alloc_step ; 21 __pset_pointer *ptrs ; /* void Pointer to a Pointer */ 22 unsigned max ; 23 unsigned count ; 24 } ; 25 26 27 /* 28 * INTERFACE 29 */ 30 31 typedef struct __pset *pset_h ; 32 33 pset_h pset_create( unsigned alloc_start, unsigned alloc_step ); 34 void pset_destroy( pset_h pset ); 35 36 void pset_delete( pset_h pset, const __pset_pointer ptr ); 37 __pset_pointer pset_add( pset_h pset, const __pset_pointer ptr ); 38 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 ); 42 43 /* 44 * Macros 45 */ 46 47 #define pset_remove( pset, ptr ) pset_delete( pset, (__pset_pointer)(ptr) ) 48 49 #define pset_remove_index( pset, i ) \ 50 { \ 51 if ( ((unsigned)i) < (pset)->count ) \ 52 pset_delete(pset, (pset)->ptrs[ (unsigned)(i) ]); \ 53 } 54 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) ] 58 59 #define pset_sort( pset, compfunc ) \ 60 (void) qsort( (char *) &pset_pointer( pset, 0 ), \ 61 pset_count( pset ), sizeof( __pset_pointer ), compfunc ) 62 63 /* 64 * PSET iterators 65 * 66 * Note that the iterators do NOT use any knowledge about the internals 67 * of pset's. 68 */ 69 struct __pset_iterator 70 { 71 pset_h pset ; 72 unsigned current ; 73 int step ; 74 } ; 75 76 typedef struct __pset_iterator *psi_h ; 77 void psi_remove( psi_h iter ); 78 79 #define __psi_current( iter ) \ 80 ( (iter)->current < pset_count( (iter)->pset ) \ 81 ? pset_pointer( (iter)->pset, (iter)->current ) \ 82 : NULL ) 83 84 #define psi_start( iter ) \ 85 ( (iter)->current = 0, (iter)->step = 1, \ 86 __psi_current( iter ) ) 87 88 #define psi_next( iter ) \ 89 ( (iter)->current += (iter)->step, (iter)->step = 1, \ 90 __psi_current( iter ) ) 91 92 #define psi_destroy( iter ) free( (char *) iter ) 93 94 psi_h psi_create( pset_h pset ); 95 96 #endif /* __PSET_H */ 97