$search
00001 00006 /***************************************************************************** 00007 ** Ifdefs 00008 *****************************************************************************/ 00009 00010 #ifndef ECL_UTILITIES_FLAGS_HPP_ 00011 #define ECL_UTILITIES_FLAGS_HPP_ 00012 00013 /***************************************************************************** 00014 ** Includes 00015 *****************************************************************************/ 00016 00017 /***************************************************************************** 00018 ** Namespaces 00019 *****************************************************************************/ 00020 00021 namespace ecl 00022 { 00023 00024 /***************************************************************************** 00025 ** Classes 00026 *****************************************************************************/ 00027 00028 enum Bits 00029 { 00030 Bit0 = 0x0000, Bit1 = 0x0001, Bit2 = 0x0002, Bit3 = 0x0004, Bit4 = 0x0008, Bit5 = 0x0010, Bit6 = 0x0020, 00031 Bit7 = 0x0040, Bit8 = 0x0080, Bit9 = 0x0100, Bit10 = 0x0200, Bit11 = 0x0400, Bit12 = 0x0800, Bit13 = 0x1000, 00032 Bit14 = 0x2000, Bit15 = 0x4000, Bit16 = 0x8000, 00033 }; 00064 template<typename Enum> 00065 class Flags 00066 { 00067 public: 00068 /********************* 00069 ** C&D 00070 **********************/ 00071 Flags() : value(0) {}; 00072 Flags(const Flags<Enum> & other) : value(other.value) {}; 00073 Flags(Enum flag) : value(flag) {}; 00074 ~Flags() { } 00075 ; 00076 00077 /********************* 00078 ** Utility 00079 **********************/ 00080 void clear() { value = 0; } 00084 bool testFlag(Enum flag) const 00085 { 00086 if ((value & flag) != 0) 00087 { 00088 return true; 00089 } 00090 else 00091 { 00092 if ( ( flag == 0 ) && ( value == 0 ) ) { 00093 return true; 00094 } else { 00095 return false; 00096 } 00097 } 00098 } 00099 ; 00100 00101 /********************* 00102 ** Type compatibility 00103 **********************/ 00104 operator int() const 00105 { 00106 return value; 00107 } 00108 ; 00110 /****************************************** 00111 ** Return new instance 00112 *******************************************/ 00117 Flags<Enum> operator&(int mask) const 00118 { 00119 Flags<Enum> f; 00120 f.value = value & mask; 00121 return f; 00122 } 00123 ; 00128 Flags<Enum> operator&(Enum flag) const 00129 { 00130 Flags<Enum> f; 00131 f.value = value & flag; 00132 return f; 00133 } 00134 ; 00139 Flags<Enum> operator|(Flags<Enum> other) const 00140 { 00141 Flags<Enum> f; 00142 f.value = value | other.value; 00143 return f; 00144 } 00145 ; 00150 Flags<Enum> operator|(Enum flag) const 00151 { 00152 Flags<Enum> f; 00153 f.value = value | flag; 00154 return f; 00155 } 00156 ; 00161 Flags<Enum> operator^(Flags<Enum> other) const 00162 { 00163 Flags<Enum> f; 00164 f.value = value ^ other.value; 00165 return f; 00166 } 00167 ; 00172 Flags<Enum> operator^(Enum flag) const 00173 { 00174 Flags<Enum> f; 00175 f.value = value ^ flag; 00176 return f; 00177 } 00178 ; 00183 Flags<Enum> operator~() const 00184 { 00185 Flags<Enum> f; 00186 f.value = ~value; 00187 return f; 00188 } 00189 ; 00190 00191 /****************************************** 00192 ** Update current instance 00193 *******************************************/ 00198 Flags<Enum> & operator=(const Flags<Enum> & other) 00199 { 00200 value = other.value; 00201 return *this; 00202 } 00203 ; 00208 Flags<Enum> & operator=(const Enum & flag) 00209 { 00210 value = static_cast<int>(flag); 00211 return *this; 00212 } 00213 ; 00218 Flags<Enum> & operator&=(int mask) 00219 { 00220 value &= mask; 00221 return *this; 00222 } 00223 ; 00228 Flags<Enum> & operator|=(Flags<Enum> other) 00229 { 00230 value |= other; 00231 return *this; 00232 } 00233 ; 00238 Flags<Enum> & operator|=(Enum flag) 00239 { 00240 value |= flag; 00241 return *this; 00242 } 00243 ; 00248 Flags<Enum> & operator^=(Flags<Enum> other) 00249 { 00250 value ^= other; 00251 return *this; 00252 } 00253 ; 00258 Flags<Enum> & operator^=(Enum flag) 00259 { 00260 value ^= flag; 00261 return *this; 00262 } 00263 ; 00264 00265 /********************* 00266 ** Helper Methods 00267 **********************/ 00272 friend inline Flags<Enum> operator|(Enum flag, Flags<Enum> flags) 00273 { 00274 return flags | flag; 00275 } 00276 private: 00277 int value; 00278 }; 00279 00280 } // namespace ecl 00281 00282 #endif /* ECL_UTILITIES_FLAGS_HPP_ */