pieceMask32.h
Go to the documentation of this file.
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& mutableMask(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     PieceMask32& operator+=(const PieceMask32& o)
00061     {
00062       mask[0] += o.mask[0];
00063       mask[1] += o.mask[1];
00064       return *this;
00065     }
00066     void resetAll()
00067     {
00068       mask[0]=mask[1]=misc::Mask32::makeDirect(0u);
00069     }
00070     void setAll()
00071     {
00072       mask[0]=misc::Mask32::makeDirect(0xffffffffu); 
00073       mask[1]=misc::Mask32::makeDirect(0xffu);
00074     }
00075     bool none() const
00076     {  
00077       return (mask[0]|mask[1]).none();
00078     }
00079     bool hasMultipleBit() const
00080     {
00081       if (none()) 
00082         return false;
00083       if (! mask[0].any()) 
00084         return mask[1].hasMultipleBit();
00085       if (! mask[1].any())
00086         return mask[0].hasMultipleBit();
00087       return true;
00088     }
00093     int countBit2() const 
00094     {
00095       if (none()) 
00096         return 0;
00097       if (! mask[0].any()) 
00098         return mask[1].countBit2();
00099       if (! mask[1].any()) 
00100         return mask[0].countBit2();
00101       return 2;
00102     }
00103     int countBit() const 
00104     {
00105       return mask[0].countBit() + mask[1].countBit();
00106     }
00107     int takeOneBit()
00108     {
00109       assert(!none());
00110       if(! mask[0].none())
00111         return mask[0].takeOneBit();
00112       return mask[1].takeOneBit()+32;
00113     }
00114   };
00115 } // namespace container
00116   using container::PieceMask32;
00117 } // namespace osl
00118 
00119 
00120 #endif /* PIECEMASK32_H */
00121 // ;;; Local Variables:
00122 // ;;; mode:c++
00123 // ;;; c-basic-offset:2
00124 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines