00001 #ifndef _MASK_H 00002 #define _MASK_H 00003 #include "osl/misc/bitOp.h" 00004 #include "osl/misc/cstdint.h" 00005 #include "osl/config.h" 00006 #include <cassert> 00007 #include <iosfwd> 00008 00009 namespace osl 00010 { 00011 namespace misc 00012 { 00013 template <class Integer> 00014 class GeneralMask 00015 { 00016 Integer mask; 00017 private: 00018 GeneralMask(Integer value) : mask(value) {} 00019 public: 00020 GeneralMask() : mask(0) {} 00021 static const GeneralMask makeDirect(Integer value) { return GeneralMask(value); } 00022 GeneralMask& operator&=(const GeneralMask& r) 00023 { 00024 mask &= r.mask; 00025 return *this; 00026 } 00027 GeneralMask& operator|=(const GeneralMask& r) 00028 { 00029 mask |= r.mask; 00030 return *this; 00031 } 00032 GeneralMask& operator^=(const GeneralMask& r) 00033 { 00034 mask ^= r.mask; 00035 return *this; 00036 } 00037 GeneralMask& operator-=(const GeneralMask& r) 00038 { 00039 mask -= r.mask; 00040 return *this; 00041 } 00042 GeneralMask& operator+=(const GeneralMask& r) 00043 { 00044 mask += r.mask; 00045 return *this; 00046 } 00047 GeneralMask& operator<<=(int shift) 00048 { 00049 mask <<= shift; 00050 return *this; 00051 } 00052 GeneralMask& operator>>=(int shift) 00053 { 00054 mask >>= shift; 00055 return *this; 00056 } 00057 const GeneralMask operator~() const { return GeneralMask(~mask); } 00058 00059 int bsf() const { return BitOp::bsf(mask); } 00060 int bsr() const { return BitOp::bsr(mask); } 00067 int takeOneBit() { return BitOp::takeOneBit(mask); } 00068 00074 bool hasMultipleBit() const { return BitOp::hasMultipleBit(mask); } 00080 int countBit2() const { 00081 assert(mask); 00082 return (mask & (mask-1)) ? 2 : 1; 00083 } 00088 int countBit() const { return BitOp::countBit(mask); } 00094 GeneralMask lowestBit() const { return BitOp::lowestBit(mask); } 00095 bool none() const { return mask == 0; } 00096 bool any() const { return ! none(); } 00097 Integer value() const { return mask; } 00098 }; 00099 00100 template <class Integer> inline 00101 bool operator==(const GeneralMask<Integer>& l, const GeneralMask<Integer>& r) 00102 { 00103 return l.value() == r.value(); 00104 } 00105 template <class Integer> inline 00106 bool operator!=(const GeneralMask<Integer>& l, const GeneralMask<Integer>& r) 00107 { 00108 return ! (l == r); 00109 } 00110 template <class Integer> inline 00111 bool operator<(const GeneralMask<Integer>& l, const GeneralMask<Integer>& r) 00112 { 00113 return l.value() < r.value(); 00114 } 00115 00116 template <class Integer> inline 00117 const GeneralMask<Integer> operator&(GeneralMask<Integer> l, 00118 GeneralMask<Integer> r) { 00119 GeneralMask<Integer> result = l; 00120 return result &= r; 00121 } 00122 template <class Integer> inline 00123 const GeneralMask<Integer> operator|(GeneralMask<Integer> l, 00124 GeneralMask<Integer> r) { 00125 GeneralMask<Integer> result = l; 00126 return result |= r; 00127 } 00128 template <class Integer> inline 00129 const GeneralMask<Integer> operator^(GeneralMask<Integer> l, 00130 GeneralMask<Integer> r) { 00131 GeneralMask<Integer> result = l; 00132 return result ^= r; 00133 } 00134 template <class Integer> inline 00135 const GeneralMask<Integer> operator<<(GeneralMask<Integer> m, int shift) { 00136 GeneralMask<Integer> result = m; 00137 return result <<= shift; 00138 } 00139 template <class Integer> inline 00140 const GeneralMask<Integer> operator>>(GeneralMask<Integer> m, int shift) { 00141 GeneralMask<Integer> result = m; 00142 return result >>= shift; 00143 } 00144 00145 typedef GeneralMask<unsigned long long> Mask64; 00146 typedef GeneralMask<unsigned int> Mask32; 00147 00148 00149 #if OSL_WORDSIZE == 64 00150 typedef unsigned long long mask_int_t; 00151 #elif OSL_WORDSIZE == 32 00152 typedef unsigned int mask_int_t; 00153 #endif 00154 typedef GeneralMask<mask_int_t> mask_t; 00155 00156 std::ostream& operator<<(std::ostream&, const mask_t&); 00157 } // namespace misc 00158 using misc::mask_int_t; 00159 using misc::mask_t; 00160 } // namespace osl 00161 00162 #endif 00163 // ;;; Local Variables: 00164 // ;;; mode:c++ 00165 // ;;; c-basic-offset:2 00166 // ;;; End: