00001 #ifndef _MASK_H 00002 #define _MASK_H 00003 #include "osl/misc/bitOp.h" 00004 #include "osl/config.h" 00005 #include <stdint.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); } 00066 int takeOneBit() { return BitOp::takeOneBit(mask); } 00067 00073 bool hasMultipleBit() const { return BitOp::hasMultipleBit(mask); } 00079 int countBit2() const { 00080 assert(mask); 00081 return (mask & (mask-1)) ? 2 : 1; 00082 } 00087 int countBit() const { return BitOp::countBit(mask); } 00093 GeneralMask lowestBit() const { return BitOp::lowestBit(mask); } 00094 bool none() const { return mask == 0; } 00095 bool any() const { return ! none(); } 00096 Integer value() const { return mask; } 00097 }; 00098 00099 template <class Integer> inline 00100 bool operator==(const GeneralMask<Integer>& l, const GeneralMask<Integer>& r) 00101 { 00102 return l.value() == r.value(); 00103 } 00104 template <class Integer> inline 00105 bool operator!=(const GeneralMask<Integer>& l, const GeneralMask<Integer>& r) 00106 { 00107 return ! (l == r); 00108 } 00109 template <class Integer> inline 00110 bool operator<(const GeneralMask<Integer>& l, const GeneralMask<Integer>& r) 00111 { 00112 return l.value() < r.value(); 00113 } 00114 00115 template <class Integer> inline 00116 const GeneralMask<Integer> operator&(GeneralMask<Integer> l, 00117 GeneralMask<Integer> r) { 00118 GeneralMask<Integer> result = l; 00119 return result &= r; 00120 } 00121 template <class Integer> inline 00122 const GeneralMask<Integer> operator|(GeneralMask<Integer> l, 00123 GeneralMask<Integer> r) { 00124 GeneralMask<Integer> result = l; 00125 return result |= r; 00126 } 00127 template <class Integer> inline 00128 const GeneralMask<Integer> operator^(GeneralMask<Integer> l, 00129 GeneralMask<Integer> r) { 00130 GeneralMask<Integer> result = l; 00131 return result ^= r; 00132 } 00133 template <class Integer> inline 00134 const GeneralMask<Integer> operator<<(GeneralMask<Integer> m, int shift) { 00135 GeneralMask<Integer> result = m; 00136 return result <<= shift; 00137 } 00138 template <class Integer> inline 00139 const GeneralMask<Integer> operator>>(GeneralMask<Integer> m, int shift) { 00140 GeneralMask<Integer> result = m; 00141 return result >>= shift; 00142 } 00143 00144 typedef GeneralMask<unsigned long long> Mask64; 00145 typedef GeneralMask<unsigned int> Mask32; 00146 00147 00148 #if OSL_WORDSIZE == 64 00149 typedef unsigned long long mask_int_t; 00150 #elif OSL_WORDSIZE == 32 00151 typedef unsigned int mask_int_t; 00152 #endif 00153 typedef GeneralMask<mask_int_t> mask_t; 00154 00155 std::ostream& operator<<(std::ostream&, const mask_t&); 00156 } // namespace misc 00157 using misc::mask_int_t; 00158 using misc::mask_t; 00159 } // namespace osl 00160 00161 #endif 00162 // ;;; Local Variables: 00163 // ;;; mode:c++ 00164 // ;;; c-basic-offset:2 00165 // ;;; End: