home *** CD-ROM | disk | FTP | other *** search
- #ifndef __RWGBITVEC_H__
- #define __RWGBITVEC_H__
- pragma push_align_members(64);
-
- /*
- * Generic bit vector.
- *
- * $Header: E:/vcs/rw/gbitvec.h_v 1.3 18 Feb 1992 19:22:32 KEFFER $
- *
- ****************************************************************************
- *
- * Rogue Wave
- * P.O. Box 2328
- * Corvallis, OR 97339
- * Voice: (503) 754-3010 FAX: (503) 757-6650
- *
- * Copyright (C) 1989, 1990, 1991. This software is subject to copyright
- * protection under the laws of the United States and other countries.
- *
- ***************************************************************************
- *
- * $Log: E:/vcs/rw/gbitvec.h_v $
- *
- * Rev 1.3 18 Feb 1992 19:22:32 KEFFER
- * Now includes "rw/generic.h".
- * Class tag is now RWExport instead of huge.
- *
- * Rev 1.2 28 Oct 1991 09:08:14 keffer
- * Changed inclusions to <rw/xxx.h>
- *
- * Rev 1.1 09 Oct 1991 18:34:32 keffer
- * Ported to Zortech V3.0
- *
- * Rev 1.0 28 Jul 1991 08:11:18 keffer
- * Tools.h++ V4.0.5 PVCS baseline version
- *
- */
-
- /*
- * Assumes 8 bits per byte.
- *
- * To use:
- *
- * declare(GBitVec,17) // Declares a bitvector 17 elements long
- *
- * main() {
- * GBitVec(17) vc; // Defines a bitvec with name vc, all bits off
- * vc(3) = TRUE; // Set bit 3 to TRUE
- * // ... etc.
- * }
- *
- */
-
- #include "rw/bitref.h"
- #include "rw/generic.h"
- STARTWRAP
- #include <assert.h>
- #if defined(BSD)
- # 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
-
- #define GBitVec(sz) name2(GBitVec,sz)
-
- #define GBitVecdeclare(sz) \
- class RWExport GBitVec(sz) { \
- RWByte vec[ (sz+7) >> 3 ]; \
- public: \
- GBitVec(sz)() { memset(vec,0,sizeof(vec)); } \
- GBitVec(sz)(RWBoolean f) { memset(vec, f ? ~0 : 0,sizeof(vec)); } \
- \
- GBitVec(sz)& operator=(const GBitVec(sz)& v) \
- { memcpy(vec,v.vec,sizeof(vec)); return *this; } \
- GBitVec(sz)& operator=(RWBoolean f) \
- { memset(vec,f ? ~0 : 0,sizeof(vec)); return *this; } \
- GBitVec(sz)& operator&=(const GBitVec(sz)& v) \
- { RWand(vec,v.vec,sizeof(vec)); return *this; } \
- GBitVec(sz)& operator^=(const GBitVec(sz)& v) \
- { RWxor(vec,v.vec,sizeof(vec)); return *this; } \
- GBitVec(sz)& operator|=(const GBitVec(sz)& v) \
- { RWor (vec,v.vec,sizeof(vec)); return *this; } \
- \
- RWBitRef operator[](int i) \
- { assert(i<sz); return RWBitRef(vec,i); } \
- RWBitRef operator()(int i) \
- { return RWBitRef(vec,i); } \
- RWBoolean operator==(const GBitVec(sz)& v) const \
- { return !memcmp(vec,v.vec,sizeof(vec)); } \
- RWBoolean operator!=(const GBitVec(sz)& v) const \
- { return !operator==(v); } \
- \
- friend GBitVec(sz) operator&(const GBitVec(sz)& v1, const GBitVec(sz)& v2) \
- { GBitVec(sz) temp(v1); temp &= v2; return temp; } \
- friend GBitVec(sz) operator^(const GBitVec(sz)& v1, const GBitVec(sz)& v2) \
- { GBitVec(sz) temp(v1); temp ^= v2; return temp; } \
- friend GBitVec(sz) operator|(const GBitVec(sz)& v1, const GBitVec(sz)& v2) \
- { GBitVec(sz) 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; } \
- };
-
- pragma pop_align_members();
- #endif /* __RWGBITVEC_H__ */
-