00001 /* pieceMask32.h 00002 */ 00003 #ifndef PIECEMASK32_H 00004 #define PIECEMASK32_H 00005 00006 #include "osl/misc/mask.h" 00007 #include "osl/misc/carray.h" 00008 00009 namespace osl 00010 { 00011 namespace container 00012 { 00013 class PieceMask32 00014 { 00015 protected: 00016 CArray<misc::Mask32,2> mask; 00017 public: 00018 static int numToIndex(int num) { return num>>5; } 00019 static int numToOffset(int num) { return num&31; } 00020 00021 PieceMask32() 00022 { 00023 resetAll(); 00024 } 00025 PieceMask32(const misc::Mask32& m1,const misc::Mask32& m2) 00026 { 00027 mask[0]=m1; mask[1]=m2; 00028 } 00029 protected: 00030 misc::Mask32& writableMask(int index) { return mask[index]; } 00031 public: 00032 const misc::Mask32& getMask(int index) const 00033 { 00034 return mask[index]; 00035 } 00036 PieceMask32& operator^=(const PieceMask32& o) 00037 { 00038 mask[0] ^= o.mask[0]; 00039 mask[1] ^= o.mask[1]; 00040 return *this; 00041 } 00042 PieceMask32& operator&=(const PieceMask32& o) 00043 { 00044 mask[0] &= o.mask[0]; 00045 mask[1] &= o.mask[1]; 00046 return *this; 00047 } 00048 PieceMask32& operator-=(const PieceMask32& o) 00049 { 00050 mask[0] -= o.mask[0]; 00051 mask[1] -= o.mask[1]; 00052 return *this; 00053 } 00054 PieceMask32& operator+=(const PieceMask32& o) 00055 { 00056 mask[0] += o.mask[0]; 00057 mask[1] += o.mask[1]; 00058 return *this; 00059 } 00060 void resetAll() 00061 { 00062 mask[0]=mask[1]=misc::Mask32::makeDirect(0u); 00063 } 00064 void setAll() 00065 { 00066 mask[0]=misc::Mask32::makeDirect(0xffffffffu); 00067 mask[1]=misc::Mask32::makeDirect(0xffu); 00068 } 00069 bool none() const 00070 { 00071 return (mask[0]|mask[1]).none(); 00072 } 00073 bool hasMultipleBit() const 00074 { 00075 if (none()) 00076 return false; 00077 if (! mask[0].any()) 00078 return mask[1].hasMultipleBit(); 00079 if (! mask[1].any()) 00080 return mask[0].hasMultipleBit(); 00081 return true; 00082 } 00087 int countBit2() const 00088 { 00089 if (none()) 00090 return 0; 00091 if (! mask[0].any()) 00092 return mask[1].countBit2(); 00093 if (! mask[1].any()) 00094 return mask[0].countBit2(); 00095 return 2; 00096 } 00097 int countBit() const 00098 { 00099 return mask[0].countBit() + mask[1].countBit(); 00100 } 00101 int takeOneBit() 00102 { 00103 assert(!none()); 00104 if(! mask[0].none()) 00105 return mask[0].takeOneBit(); 00106 return mask[1].takeOneBit()+32; 00107 } 00108 }; 00109 } // namespace container 00110 using container::PieceMask32; 00111 } // namespace osl 00112 00113 00114 #endif /* PIECEMASK32_H */ 00115 // ;;; Local Variables: 00116 // ;;; mode:c++ 00117 // ;;; c-basic-offset:2 00118 // ;;; End: