#ifndef SET_H
#define SET_H
//*****************************************************************************
//
// set.h
//
// a non-ordered container that has constant lookup time.
//
//*****************************************************************************
typedef struct set_data SET;
typedef struct set_iterator SET_ITERATOR;
SET *newSet (void);
void deleteSet (SET *set);
void setPut (SET *set, void *elem);
void setRemove (SET *set, void *elem);
int setIn (SET *set, const void *elem);
int setSize (SET *set);
LIST *setCollect (SET *set);
SET *setCopy (SET *set);
SET *setUnion (SET *set1, SET *set2);
SET *setIntersection(SET *set1, SET *set2);
void setChangeHashing(SET *set, void *cmp_func, void *hash_func);
//*****************************************************************************
//
// set iterator
//
// we may sometimes want to iterate across all of the elements in a set.
// this lets us do so.
//
//*****************************************************************************
// iterate across all the elements in a set
#define ITERATE_SET(elem, it) \
for(elem = setIteratorCurrent(it); \
elem != NULL; \
setIteratorNext(it), elem = setIteratorCurrent(it))
SET_ITERATOR *newSetIterator (SET *S);
void deleteSetIterator (SET_ITERATOR *I);
void setIteratorReset (SET_ITERATOR *I);
void *setIteratorNext (SET_ITERATOR *I);
void *setIteratorCurrent(SET_ITERATOR *I);
#endif // SET_H