/**************************************************************************** * [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