00001 #ifndef _PIECE_MASK_H 00002 #define _PIECE_MASK_H 00003 #include "osl/config.h" 00004 #include "osl/bits/ptypeTraits.h" 00005 static_assert(OSL_WORDSIZE == 64, "word size"); 00006 #include "osl/bits/pieceMask64.h" 00007 00008 #include <iosfwd> 00009 00010 namespace osl 00011 { 00012 typedef PieceMask64 PieceMaskBase; 00013 00020 class PieceMask : public PieceMaskBase 00021 { 00022 public: 00023 PieceMask() {} 00024 PieceMask(const PieceMaskBase& base) : PieceMaskBase(base) {} 00025 static const mask_t numToMask(int num) { 00026 return mask_t::makeDirect(1) << PieceMask::numToOffset(num); 00027 } 00028 void setMask(int index,mask_t val) { 00029 mutableMask(index)=val; 00030 } 00031 private: 00032 mask_t& mutableMaskNum(int num) { 00033 return mutableMask(numToIndex(num)); 00034 } 00035 const mask_t getMaskNum(int num) const { 00036 return getMask(numToIndex(num)); 00037 } 00038 public: 00039 void xorMask(int index,mask_t val) { 00040 mutableMask(index)^=val; 00041 } 00042 void orMask(int index,mask_t val) { 00043 mutableMask(index)|=val; 00044 } 00045 bool test(int num) const { 00046 return (getMaskNum(num)&numToMask(num)).any(); 00047 } 00048 void set(int num) { 00049 mutableMaskNum(num)|=numToMask(num); 00050 } 00051 void flip(int num) { 00052 mutableMaskNum(num)^=numToMask(num); 00053 } 00054 void reset(int num) { 00055 mutableMaskNum(num)&= ~numToMask(num); 00056 } 00057 bool any() const { return ! none(); } 00058 00059 const mask_t getMask(int num) const { return PieceMaskBase::getMask(num); } 00061 template <Ptype PTYPE> 00062 const mask_t getMask() const { return getMask(PtypeFuns<PTYPE>::indexNum); } 00063 00065 template <Ptype PTYPE> 00066 const mask_t selectBit() const 00067 { 00068 mask_t mask = getMask<PTYPE>(); 00069 mask &= mask_t::makeDirect(PtypeFuns<PtypeFuns<PTYPE>::basicType>::indexMask); 00070 return mask; 00071 } 00073 template <Ptype PTYPE> 00074 void clearBit() 00075 { 00076 mask_t& mask = mutableMask(PtypeFuns<PTYPE>::indexNum); 00077 mask &= ~mask_t::makeDirect(PtypeFuns<PtypeFuns<PTYPE>::basicType>::indexMask); 00078 } 00080 template <Ptype PTYPE> 00081 void setBit() 00082 { 00083 mask_t& mask = mutableMask(PtypeFuns<PTYPE>::indexNum); 00084 mask |= mask_t::makeDirect(PtypeFuns<PtypeFuns<PTYPE>::basicType>::indexMask); 00085 } 00086 }; 00087 00088 inline const PieceMask operator&(const PieceMask &m1, const PieceMask &m2) { 00089 return PieceMask64(m1.getMask(0)&m2.getMask(0)); 00090 } 00091 inline const PieceMask operator|(const PieceMask &m1, const PieceMask &m2) { 00092 return PieceMask64(m1.getMask(0)|m2.getMask(0)); 00093 } 00094 inline const PieceMask operator~(const PieceMask &m1) { 00095 return PieceMask64(~m1.getMask(0)); 00096 } 00097 00098 inline bool operator==(const PieceMask &m1, const PieceMask &m2){ 00099 return m1.getMask(0)==m2.getMask(0) && m1.getMask(1)==m2.getMask(1); 00100 } 00101 inline bool operator!=(const PieceMask &m1, const PieceMask &m2) 00102 { 00103 return ! (m1 == m2); 00104 } 00105 std::ostream& operator<<(std::ostream& os,PieceMask const& pieceMask); 00106 } // namespace osl 00107 00108 00109 #endif /* _PIECE_MASK_H */ 00110 // ;;; Local Variables: 00111 // ;;; mode:c++ 00112 // ;;; c-basic-offset:2 00113 // ;;; End: