SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 *			    Bit Vectors Interface file									*
 ***************************************************************************/

#ifndef	BITVECTOR_H
#define	BITVECTOR_H

extern	int		ConvertBvToBit (int bv);

class CIntVector {
public:
			CIntVector () { Empty (); }
	void	Empty () { bits = 0; }
	BOOL	IsEmpty () { return bits == 0; }
	BOOL	IsSet (UINT bit) const
			{ ASSERT (bit < 32); return (bits & (1 << bit)) != 0; }
	void	SetBit (UINT bit)
			{ ASSERT (bit < 32); bits |= (1 << bit); }
	void	ClrBit (UINT bit)
			{ ASSERT (bit < 32); bits &= ~(1 << bit); }
	void	ToggleBit (UINT bit)
			{ ASSERT (bit < 32); bits ^= (1 << bit); }
	CString	PrintVector () { CString s; s.Format ("%d", bits); return s; }

	BOOL	operator== (CIntVector& in) const { return bits == in.bits; }
	BOOL	operator!= (CIntVector& in) const { return bits != in.bits; }

	const CIntVector& operator= (int v) { bits = v; return *this; }
	const CIntVector& operator= (CIntVector& in)
			{ bits = in.bits; return *this; }

	int		bits;
};


class CBitVector {
public:
			CBitVector () { Empty (); }
			CBitVector (int b) { Empty (); bits [0] = b; }
			CBitVector (const CBitVector& in) { *this = in; }
	void	Empty () { memset (bits, 0, sizeof (bits)); }
	BOOL	IsEmpty () const
			{ for (int i=0; i<4; ++i) if (bits[i]) return FALSE; return TRUE; }
	void	SetBits (const CBitVector& in);
	void	ClearBits (const CBitVector& in);
	
	BOOL	IsSet (UINT bit) const
			{ ASSERT (bit < 128); return (bits [bit/32] & (1 << (bit % 32))) != 0; }
	void	Set (UINT bit, BOOL f) { if (f) SetBit (bit); else ClrBit (bit); }
	void	SetBit (UINT bit)
			{ ASSERT (bit < 128); bits [bit/32] |= (1 << (bit % 32)); }
	void	ClrBit (UINT bit)
			{ ASSERT (bit < 128); bits [bit/32] &= ~(1 << (bit % 32)); }
	void	ToggleBit (UINT bit)
			{ ASSERT (bit < 128); bits [bit/32] ^= (1 << (bit % 32)); }
	void	SetOnly (int bit) { Empty (); SetBit (bit); }
	CString	PrintVector () const;
	CString	PrintString (const char* names [], int size) const;
	void	Parse (char*& pLine);
	void	ParseString (char*& pLine, const char* names [], int size);

	BOOL	operator== (const CBitVector& in) const;
	BOOL	operator!= (const CBitVector& in) const { return ! (*this == in); }
	const CBitVector& operator= (const CBitVector& in);
	
private:
	int		bits [4];
};

#endif