home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c083 / 11.ddi / OWLSRC.PAK / BITSET.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-02  |  2.7 KB  |  143 lines

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