home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 6.ddi / MWHC.006 / 71 < prev    next >
Encoding:
Text File  |  1992-06-07  |  4.0 KB  |  126 lines

  1. #ifndef __RWGBITVEC_H__
  2. #define __RWGBITVEC_H__
  3. pragma push_align_members(64);
  4.  
  5. /*
  6.  * Generic bit vector.
  7.  *
  8.  * $Header:   E:/vcs/rw/gbitvec.h_v   1.3   18 Feb 1992 19:22:32   KEFFER  $
  9.  *
  10.  ****************************************************************************
  11.  *
  12.  * Rogue Wave 
  13.  * P.O. Box 2328
  14.  * Corvallis, OR 97339
  15.  * Voice: (503) 754-3010    FAX: (503) 757-6650
  16.  *
  17.  * Copyright (C) 1989, 1990, 1991. This software is subject to copyright 
  18.  * protection under the laws of the United States and other countries.
  19.  *
  20.  ***************************************************************************
  21.  *
  22.  * $Log:   E:/vcs/rw/gbitvec.h_v  $
  23.  * 
  24.  *    Rev 1.3   18 Feb 1992 19:22:32   KEFFER
  25.  * Now includes "rw/generic.h".
  26.  * Class tag is now RWExport instead of huge.
  27.  * 
  28.  *    Rev 1.2   28 Oct 1991 09:08:14   keffer
  29.  * Changed inclusions to <rw/xxx.h>
  30.  * 
  31.  *    Rev 1.1   09 Oct 1991 18:34:32   keffer
  32.  * Ported to Zortech V3.0
  33.  * 
  34.  *    Rev 1.0   28 Jul 1991 08:11:18   keffer
  35.  * Tools.h++ V4.0.5 PVCS baseline version
  36.  *
  37.  */
  38.  
  39. /*
  40.  * Assumes 8 bits per byte.
  41.  *
  42.  * To use:
  43.  *
  44.  *   declare(GBitVec,17) // Declares a bitvector 17 elements long
  45.  *
  46.  *   main() {
  47.  *     GBitVec(17) vc;    // Defines a bitvec with name vc, all bits off
  48.  *     vc(3) = TRUE;    // Set bit 3 to TRUE
  49.  *     // ... etc.
  50.  *   }
  51.  *
  52.  */
  53.  
  54. #include "rw/bitref.h"
  55. #include "rw/generic.h"
  56. STARTWRAP
  57. #include <assert.h>
  58. #if defined(BSD)
  59. #  include <memory.h>        /* Looking for memcpy() */
  60. #else
  61. #  include <string.h>
  62. #endif
  63. ENDWRAP
  64.  
  65. #ifdef NO_INLINED_WHILES
  66.   extern void RWor(RWByte*, const RWByte*, unsigned);
  67.   extern void RWxor(RWByte*, const RWByte*, unsigned);
  68.   extern void RWand(RWByte*, const RWByte*, unsigned);
  69. #else
  70.   inline void RWor (RWByte* a, const RWByte* b, unsigned N)
  71.     { while(N--) *a++ |= *b++; }
  72.   inline void RWxor(RWByte* a, const RWByte* b, unsigned N)
  73.     { while(N--) *a++ ^= *b++; }
  74.   inline void RWand(RWByte* a, const RWByte* b, unsigned N)
  75.     { while(N--) *a++ &= *b++; }
  76. #endif
  77.  
  78. #define GBitVec(sz) name2(GBitVec,sz)
  79.  
  80. #define GBitVecdeclare(sz)                            \
  81. class RWExport GBitVec(sz) {                            \
  82.   RWByte    vec[ (sz+7) >> 3 ];                        \
  83. public:                                        \
  84.   GBitVec(sz)() { memset(vec,0,sizeof(vec)); }                    \
  85.   GBitVec(sz)(RWBoolean f) { memset(vec, f ? ~0 : 0,sizeof(vec)); }        \
  86.                                         \
  87.   GBitVec(sz)&        operator=(const GBitVec(sz)& v)                \
  88.     { memcpy(vec,v.vec,sizeof(vec)); return *this; }                \
  89.   GBitVec(sz)&        operator=(RWBoolean f)                    \
  90.     { memset(vec,f ? ~0 : 0,sizeof(vec)); return *this; }            \
  91.   GBitVec(sz)&        operator&=(const GBitVec(sz)& v)            \
  92.     { RWand(vec,v.vec,sizeof(vec)); return *this; }                \
  93.   GBitVec(sz)&        operator^=(const GBitVec(sz)& v)            \
  94.     { RWxor(vec,v.vec,sizeof(vec)); return *this; }                \
  95.   GBitVec(sz)&        operator|=(const GBitVec(sz)& v)            \
  96.     { RWor (vec,v.vec,sizeof(vec)); return *this; }                \
  97.                                         \
  98.   RWBitRef        operator[](int i)                    \
  99.     { assert(i<sz); return RWBitRef(vec,i); }                    \
  100.   RWBitRef        operator()(int i)                    \
  101.     { return RWBitRef(vec,i); }                            \
  102.   RWBoolean        operator==(const GBitVec(sz)& v) const            \
  103.     { return !memcmp(vec,v.vec,sizeof(vec)); }                        \
  104.   RWBoolean        operator!=(const GBitVec(sz)& v) const            \
  105.     { return !operator==(v); }                            \
  106.                                         \
  107.   friend GBitVec(sz)    operator&(const GBitVec(sz)& v1, const GBitVec(sz)& v2)    \
  108.     { GBitVec(sz) temp(v1); temp &= v2; return temp; }                \
  109.   friend GBitVec(sz)    operator^(const GBitVec(sz)& v1, const GBitVec(sz)& v2)    \
  110.     { GBitVec(sz) temp(v1); temp ^= v2; return temp; }                \
  111.   friend GBitVec(sz)    operator|(const GBitVec(sz)& v1, const GBitVec(sz)& v2)    \
  112.     { GBitVec(sz) temp(v1); temp |= v2; return temp; }                \
  113.                                         \
  114.   void            clearBit(int i)                        \
  115.     { vec[i>>3] &= ~(1 << (7&i)); }                        \
  116.   const RWByte*        data() const                        \
  117.     {return vec;}                                \
  118.   void            setBit(int i)                        \
  119.     { vec[i>>3] |=  (1 << (7&i)); }                        \
  120.   RWBoolean        testBit(int i) const                    \
  121.     { return (  vec[i>>3] & ( 1 << (7&i) )  ) != 0; }                \
  122. };
  123.  
  124. pragma pop_align_members();
  125. #endif /* __RWGBITVEC_H__ */
  126.