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

  1. #ifndef __RWTBITVEC_H__
  2. #define __RWTBITVEC_H__
  3. pragma push_align_members(64);
  4.  
  5. /*
  6.  * RWTBitVec<N>: Parameterized bit vector of length N
  7.  *
  8.  * $Header:   E:/vcs/rw/tbitvec.h_v   1.0   02 Mar 1992 16:10:50   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, 1992. 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/tbitvec.h_v  $
  23.  * 
  24.  *    Rev 1.0   02 Mar 1992 16:10:50   KEFFER
  25.  * Initial revision.
  26.  */
  27.  
  28. /*
  29.  * Assumes 8 bits per byte.
  30.  *
  31.  * To use:
  32.  *
  33.  *   main() {
  34.  *     RWTBitVec<17> vc;    // Defines a bit vector 17 bits long
  35.  *     vc(3) = TRUE;        // Set bit 3 to TRUE
  36.  *     // ... etc.
  37.  *   }
  38.  *
  39.  */
  40.  
  41. //$DECLARE_TEMPLATE
  42.  
  43. #include "rw/bitref.h"
  44. STARTWRAP
  45. #include <assert.h>
  46. #ifdef NON_ANSI_HEADERS
  47. #  include <memory.h>        /* Looking for memcpy() */
  48. #else
  49. #  include <string.h>
  50. #endif
  51. ENDWRAP
  52.  
  53. #ifdef NO_INLINED_WHILES
  54.   extern void RWor(RWByte*, const RWByte*, unsigned);
  55.   extern void RWxor(RWByte*, const RWByte*, unsigned);
  56.   extern void RWand(RWByte*, const RWByte*, unsigned);
  57. #else
  58.   inline void RWor (RWByte* a, const RWByte* b, unsigned N)
  59.     { while (N--) *a++ |= *b++; }
  60.   inline void RWxor(RWByte* a, const RWByte* b, unsigned N)
  61.     { while (N--) *a++ ^= *b++; }
  62.   inline void RWand(RWByte* a, const RWByte* b, unsigned N)
  63.     { while (N--) *a++ &= *b++; }
  64. #endif
  65.  
  66. template <int N> class RWTBitVec {                            \
  67.   RWByte        vec[ (N+7) >> 3 ];
  68.   static const int    nfull;
  69.   static const RWByte    mask;
  70. public:
  71.   RWTBitVec()        { memset(vec, 0, sizeof(vec)); }
  72.   RWTBitVec(RWBoolean f){ memset(vec, f ? ~0 : 0, sizeof(vec)); }
  73.  
  74.   RWTBitVec&        operator=(const RWTBitVec& v)
  75.     { memcpy(vec,v.vec,sizeof(vec)); return *this; }
  76.   RWTBitVec&        operator=(RWBoolean f)
  77.     { memset(vec,f ? ~0 : 0,sizeof(vec)); return *this; }
  78.   RWTBitVec&        operator&=(const RWTBitVec& v)
  79.     { RWand(vec,v.vec,sizeof(vec)); return *this; }
  80.   RWTBitVec&        operator^=(const RWTBitVec& v)
  81.     { RWxor(vec,v.vec,sizeof(vec)); return *this; }
  82.   RWTBitVec&        operator|=(const RWTBitVec& v)
  83.     { RWor (vec,v.vec,sizeof(vec)); return *this; }
  84.  
  85.   RWBitRef        operator[](int i)
  86.     { assert(i>=0 && i<N); return RWBitRef(vec,i); }
  87.   RWBitRef        operator()(int i)
  88.     { return RWBitRef(vec,i); }
  89.   RWBoolean        operator==(RWBoolean b) const;
  90.   RWBoolean        operator!=(RWBoolean b) const
  91.     { return !operator==(b); }
  92.   RWBoolean        operator==(const RWTBitVec& v) const;
  93.   RWBoolean        operator!=(const RWTBitVec& v) const
  94.     { return !operator==(v); }
  95.  
  96.   friend RWTBitVec    operator&(const RWTBitVec& v1, const RWTBitVec& v2)
  97.     { RWTBitVec temp(v1); temp &= v2; return temp; }
  98.   friend RWTBitVec    operator^(const RWTBitVec& v1, const RWTBitVec& v2)
  99.     { RWTBitVec temp(v1); temp ^= v2; return temp; }
  100.   friend RWTBitVec    operator|(const RWTBitVec& v1, const RWTBitVec& v2)
  101.     { RWTBitVec temp(v1); temp |= v2; return temp; }
  102.  
  103.   void            clearBit(int i)
  104.     { vec[i>>3] &= ~(1 << (7&i)); }
  105.   const RWByte*        data() const
  106.     {return vec;}
  107.   void            setBit(int i)
  108.     { vec[i>>3] |=  (1 << (7&i)); }
  109.   RWBoolean        testBit(int i) const
  110.     { return (  vec[i>>3] & ( 1 << (7&i) )  ) != 0; }
  111. };
  112.  
  113.  
  114. //$IMPLEMENT_TEMPLATE
  115.  
  116. // Definitions for statics:
  117. template <int N> const int    RWTBitVec<N>::nfull = N >> 3;
  118. template <int N> const RWByte RWTBitVec<N>::mask = (1 << (N&7)) - 1;
  119.  
  120. template <int N> RWBoolean
  121. RWTBitVec<N>::operator==(RWBoolean b) const
  122. {
  123.   register RWByte val = b ? ~0 : 0;
  124.  
  125.   // Check the full bytes:
  126.   for (register i=0; i<nfull; i++) if (vec[i] != val) return FALSE;
  127.   
  128.   // Check the last (partially full) byte, if any:
  129.   return (nfull==sizeof(vec)) ? TRUE : (val & mask) == (vec[nfull] & mask);
  130. }
  131.  
  132. template <int N> RWBoolean
  133. RWTBitVec<N>::operator==(const RWTBitVec<N>& u) const
  134. {
  135.   // Check the full bytes:
  136.   for (register i=0; i<nfull; i++) if (vec[i] != u.vec[i]) return FALSE;
  137.  
  138.   // Check the last (partially full) byte, if any:
  139.   return (nfull==sizeof(vec)) ? TRUE : (vec[nfull] & mask) == (u.vec[nfull] & mask);
  140. }
  141.  
  142. pragma pop_align_members();
  143. #endif /* __RWTBITVEC_H__ */
  144.