Go to the documentation of this file.00001
00006
00007
00008
00009
00010 #ifndef ECL_UTILITIES_FLAGS_HPP_
00011 #define ECL_UTILITIES_FLAGS_HPP_
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 namespace ecl
00022 {
00023
00024
00025
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
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
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
00103
00104 operator int() const
00105 {
00106 return value;
00107 }
00108 ;
00110
00111
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
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
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 }
00281
00282 #endif