/* Copyright 1989, 1990 by James Aspnes, David Applegate, and Bennet Yee */
/* See the file COPYING for distribution information */
#ifndef _SET_H
#define _SET_H
#include "alist.h"
typedef struct _set {
alist list; /* list of elements */
alist names; /* list of elements by names */
} *set;
#define empty_set() ((set) 0)
#define set_count(s) (alist_count((s)->list))
#define set_empty(s) ((s) == 0)
extern int member (set, datum);
extern set add_member (set, datum);
extern set del_member (set, datum);
extern set copy_set (set);
extern void free_set (set);
/* mass set operations */
extern set add_members (set, set);
extern set del_members (set, set);
/* don't use this yourself */
extern void set_clear_name_list (set);
extern void set_build_name_list (set);
/* always call this before using an object's name list (i.e. never) */
extern void object_build_name_list (datum);
#define SET_FOREACH(set, var) \
{ \
if(set) { \
datum _SET_FOREACH_dummy; \
FOREACH((set)->list, var, _SET_FOREACH_dummy)
#define SET_FOREACH_MATCH(set, key, var) \
{ \
if(set) { \
if(isempty((set)->names)) set_build_name_list(set); \
FOREACH_MATCH((set)->names, key, var) \
#define END_SET_FOREACH END_FOREACH }}
typedef alist_iterator set_iterator;
extern datum set_first (set, set_iterator *);
extern datum set_next (set, set_iterator *);
extern datum set_first_match (set, set_iterator *, datum key);
extern datum set_next_match (set, set_iterator *);
#endif /* _SET_H */