/*
* set.h from the Set of Integers example,
* Ch. 7, C: A Reference Manual 5/e
* Samuel P. Harbison III and Guy L. Steele Jr.
*
* A set package, suitable for sets of small integers in the range 0 to N-1,
* where N is the number of bits in an unsigned int type.
* Each integer is represented by a bit position; bit i is 1 if and only if
* i is in the set. The low-order bit is bit 0.
*/
#include /* defines CHAR_BIT */
/* Type SET is used to represent sets. */
typedef unsigned int SET;
/* SET_BITS: Maximum bits per set. */
#define SET_BITS (sizeof(SET)*CHAR_BIT)
/* check(i): True if i can be a set element. */
#define check(i) (((unsigned) (i)) < SET_BITS)
/* emptyset: A set with no elements. */
#define emptyset ((SET) 0)
/* add(s,i): Add a single integer to a set. */
#define add(set,i) ((set) | singleset (i))
/* singleset(i): Return a set with one element in it. */
#define singleset(i) (((SET) 1) << (i))
/* intersect: Return intersection of two sets. */
#define intersect(set1,set2) ((set1) & (set2))
/* union: Return the union of two sets. */
#define union(set1,set2) ((set1) | (set2))
/* setdiff: Return a set of those elements in set1 or set2,
but not both. */
#define setdiff(set1,set2) ((set1) ^ (set2))
/* element: True if i is in set. */
#define element(i,set) (singleset((i)) & (set))
/* forallelements: Perform the following statement once for
every element of the set s, with the variable j set to
that element. To print all the elements in s, just write
int j;
forallelements(j, s)
printf("%d ", j);
*/
#define forallelements(j,s) \
for ((j)=0; (j)