Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.2 9/18/84; site watcgl.UUCP
Path: utzoo!watmath!watcgl!kdmoen
From: kdmoen@watcgl.UUCP (Doug Moen)
Newsgroups: net.lang.c
Subject: Re: places where sets are useful
Message-ID: <1378@watcgl.UUCP>
Date: Wed, 27-Feb-85 12:34:10 EST
Article-I.D.: watcgl.1378
Posted: Wed Feb 27 12:34:10 1985
Date-Received: Tue, 5-Mar-85 14:21:58 EST
References: <10983@watmath.UUCP> <21000020@uiucuxc.UUCP>
Reply-To: kdmoen@watcgl.UUCP (Doug Moen)
Organization: U of Waterloo, Ontario
Lines: 28
Summary: 

> type
> 	mymodes = (insert, error, append, ...);
> var
> 	status = set of mymodes;
> begin
> ...
> if (status * [insert, append]) <> [] then begin....
> ...
> end
> ...
> end.
> 
> Is much more readable and therefore less likely to get mangled in software
> rewrites then is the exhaustive "if" phrasing.

I agree.  Here's how I would write this in C:

enum {insert, error, append, ... };
#define elem(n) (1 << (int)(n))
short status;
...
	if (status & (elem(insert) | elem(append))) {
		...
	/* add 'error' to set 'status' */
	status |= elem(error);

	/* remove 'error' from set 'status' */
	status &= ~elem(error);