home *** CD-ROM | disk | FTP | other *** search
- #ifndef __RWTBITVEC_H__
- #define __RWTBITVEC_H__
- pragma push_align_members(64);
-
- /*
- * RWTBitVec<N>: Parameterized bit vector of length N
- *
- * $Header: E:/vcs/rw/tbitvec.h_v 1.0 02 Mar 1992 16:10:50 KEFFER $
- *
- ****************************************************************************
- *
- * Rogue Wave
- * P.O. Box 2328
- * Corvallis, OR 97339
- * Voice: (503) 754-3010 FAX: (503) 757-6650
- *
- * Copyright (C) 1989, 1990, 1991, 1992. This software is subject to copyright
- * protection under the laws of the United States and other countries.
- *
- ***************************************************************************
- *
- * $Log: E:/vcs/rw/tbitvec.h_v $
- *
- * Rev 1.0 02 Mar 1992 16:10:50 KEFFER
- * Initial revision.
- */
-
- /*
- * Assumes 8 bits per byte.
- *
- * To use:
- *
- * main() {
- * RWTBitVec<17> vc; // Defines a bit vector 17 bits long
- * vc(3) = TRUE; // Set bit 3 to TRUE
- * // ... etc.
- * }
- *
- */
-
- //$DECLARE_TEMPLATE
-
- #include "rw/bitref.h"
- STARTWRAP
- #include <assert.h>
- #ifdef NON_ANSI_HEADERS
- # include <memory.h> /* Looking for memcpy() */
- #else
- # include <string.h>
- #endif
- ENDWRAP
-
- #ifdef NO_INLINED_WHILES
- extern void RWor(RWByte*, const RWByte*, unsigned);
- extern void RWxor(RWByte*, const RWByte*, unsigned);
- extern void RWand(RWByte*, const RWByte*, unsigned);
- #else
- inline void RWor (RWByte* a, const RWByte* b, unsigned N)
- { while (N--) *a++ |= *b++; }
- inline void RWxor(RWByte* a, const RWByte* b, unsigned N)
- { while (N--) *a++ ^= *b++; }
- inline void RWand(RWByte* a, const RWByte* b, unsigned N)
- { while (N--) *a++ &= *b++; }
- #endif
-
- template <int N> class RWTBitVec { \
- RWByte vec[ (N+7) >> 3 ];
- static const int nfull;
- static const RWByte mask;
- public:
- RWTBitVec() { memset(vec, 0, sizeof(vec)); }
- RWTBitVec(RWBoolean f){ memset(vec, f ? ~0 : 0, sizeof(vec)); }
-
- RWTBitVec& operator=(const RWTBitVec& v)
- { memcpy(vec,v.vec,sizeof(vec)); return *this; }
- RWTBitVec& operator=(RWBoolean f)
- { memset(vec,f ? ~0 : 0,sizeof(vec)); return *this; }
- RWTBitVec& operator&=(const RWTBitVec& v)
- { RWand(vec,v.vec,sizeof(vec)); return *this; }
- RWTBitVec& operator^=(const RWTBitVec& v)
- { RWxor(vec,v.vec,sizeof(vec)); return *this; }
- RWTBitVec& operator|=(const RWTBitVec& v)
- { RWor (vec,v.vec,sizeof(vec)); return *this; }
-
- RWBitRef operator[](int i)
- { assert(i>=0 && i<N); return RWBitRef(vec,i); }
- RWBitRef operator()(int i)
- { return RWBitRef(vec,i); }
- RWBoolean operator==(RWBoolean b) const;
- RWBoolean operator!=(RWBoolean b) const
- { return !operator==(b); }
- RWBoolean operator==(const RWTBitVec& v) const;
- RWBoolean operator!=(const RWTBitVec& v) const
- { return !operator==(v); }
-
- friend RWTBitVec operator&(const RWTBitVec& v1, const RWTBitVec& v2)
- { RWTBitVec temp(v1); temp &= v2; return temp; }
- friend RWTBitVec operator^(const RWTBitVec& v1, const RWTBitVec& v2)
- { RWTBitVec temp(v1); temp ^= v2; return temp; }
- friend RWTBitVec operator|(const RWTBitVec& v1, const RWTBitVec& v2)
- { RWTBitVec temp(v1); temp |= v2; return temp; }
-
- void clearBit(int i)
- { vec[i>>3] &= ~(1 << (7&i)); }
- const RWByte* data() const
- {return vec;}
- void setBit(int i)
- { vec[i>>3] |= (1 << (7&i)); }
- RWBoolean testBit(int i) const
- { return ( vec[i>>3] & ( 1 << (7&i) ) ) != 0; }
- };
-
-
- //$IMPLEMENT_TEMPLATE
-
- // Definitions for statics:
- template <int N> const int RWTBitVec<N>::nfull = N >> 3;
- template <int N> const RWByte RWTBitVec<N>::mask = (1 << (N&7)) - 1;
-
- template <int N> RWBoolean
- RWTBitVec<N>::operator==(RWBoolean b) const
- {
- register RWByte val = b ? ~0 : 0;
-
- // Check the full bytes:
- for (register i=0; i<nfull; i++) if (vec[i] != val) return FALSE;
-
- // Check the last (partially full) byte, if any:
- return (nfull==sizeof(vec)) ? TRUE : (val & mask) == (vec[nfull] & mask);
- }
-
- template <int N> RWBoolean
- RWTBitVec<N>::operator==(const RWTBitVec<N>& u) const
- {
- // Check the full bytes:
- for (register i=0; i<nfull; i++) if (vec[i] != u.vec[i]) return FALSE;
-
- // Check the last (partially full) byte, if any:
- return (nfull==sizeof(vec)) ? TRUE : (vec[nfull] & mask) == (u.vec[nfull] & mask);
- }
-
- pragma pop_align_members();
- #endif /* __RWTBITVEC_H__ */
-