home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / owlsrc.pak / BITSET.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-24  |  2.7 KB  |  144 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1993, 1994 by Borland International, All Rights Reserved
  4. //
  5. //----------------------------------------------------------------------------
  6. #include <owl/owlpch.h>
  7. #include <owl/bitset.h>
  8. #include <classlib/objstrm.h>
  9.  
  10. uint8 near TBitSet::Masks[8] = {
  11.   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
  12. };
  13.  
  14. TBitSet::TBitSet()
  15. {
  16.   for (int i = 0; i < 32; i++)
  17.     Bits[i] = 0;
  18. }
  19.  
  20. TBitSet::TBitSet(const TBitSet& bs)
  21. {
  22.   for (int i = 0; i < 32; i++)
  23.     Bits[i] = bs.Bits[i];
  24. }
  25.  
  26. int
  27. TBitSet::Has(uint8 item)
  28. {
  29.   return (Bits[Loc(item)] & Mask(item)) != 0;
  30. }
  31.  
  32. TBitSet
  33. TBitSet::operator ~() const
  34. {
  35.   TBitSet temp;
  36.   for (int i = 0; i < 32; i++)
  37.     temp.Bits[i] = uint8(~Bits[i]);
  38.   return temp;  
  39. }
  40.  
  41. void
  42. TBitSet::DisableItem(uint8 item)
  43. {
  44.   Bits[Loc(item)] &= uint8(~Mask(item));
  45. }
  46.  
  47. void
  48. TBitSet::EnableItem(const TBitSet& bs)
  49. {
  50.   for (int i = 0; i < 32; i++)
  51.     Bits[i] |= bs.Bits[i];
  52. }
  53.  
  54. void
  55. TBitSet::DisableItem(const TBitSet& bs)
  56. {
  57.   for (int i = 0; i < 32; i++)
  58.     Bits[i] &= uint8(~(bs.Bits[i]));
  59. }
  60.  
  61. void
  62. TBitSet::EnableItem(uint8 item)
  63. {
  64.   Bits[Loc(item)] |= Mask(item);
  65. }
  66.  
  67. TBitSet&
  68. TBitSet::operator &=(const TBitSet& bs)
  69. {
  70.   for (int i = 0; i < 32; i++)
  71.     Bits[i] &= bs.Bits[i];
  72.   return *this;
  73. }
  74.  
  75. TBitSet
  76. operator &(const TBitSet& bs1, const TBitSet& bs2)
  77. {
  78.   TBitSet temp(bs1);
  79.   temp &= bs2;
  80.   return temp;
  81. }
  82.  
  83. TBitSet
  84. operator |(const TBitSet& bs1, const TBitSet& bs2)
  85. {
  86.   TBitSet temp(bs1);
  87.   temp |= bs2;
  88.   return temp;
  89. }
  90.  
  91. int
  92. TBitSet::IsEmpty()
  93. {
  94.   for (int i = 0; i < 32; i++)
  95.     if (Bits[i] != 0)
  96.       return false;
  97.   return true;
  98. }
  99.  
  100. int
  101. operator ==(const TBitSet& bs1, const TBitSet& bs2)
  102. {
  103.   for (int i = 0; i < 32; i++)
  104.     if (bs1.Bits[i] != bs2.Bits[i])
  105.       return false;
  106.   return true;
  107. }
  108.  
  109. opstream& operator <<(opstream& out, const TBitSet& bs)
  110. {
  111.   out.fwriteBytes(bs.Bits, sizeof(bs.Bits));
  112.   return out;
  113. }
  114.  
  115. ipstream& operator >>(ipstream& in, TBitSet& bs)
  116. {
  117.   in.freadBytes(bs.Bits, sizeof(bs.Bits));
  118.   return in;
  119. }
  120.  
  121. //----------------------------------------------------------------------------
  122.  
  123. TCharSet::TCharSet() : TBitSet()
  124. {
  125. }
  126.  
  127. TCharSet::TCharSet(const TCharSet& cs) : TBitSet(cs)
  128. {
  129. }
  130.  
  131. TCharSet::TCharSet(const char far* str) : TBitSet()
  132. {
  133.   for (const char far* p = str; *p; p++) {
  134.     if (*p == '\\')
  135.       p++;
  136.     else if (*p == '-' && p > str && p[1]) {  // handle "A-Z" type shorthands
  137.       p++;
  138.       for (char c = char(p[-2]+1); c < *p; c++) // replace "-" with "B..Y"
  139.         EnableItem(c);
  140.     }
  141.     EnableItem(*p);
  142.   }
  143. }
  144.