Flags.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_BASE_FLAGS_H
00013 #define ZYPP_BASE_FLAGS_H
00014
00015 #include "zypp/base/String.h"
00016
00018 namespace zypp
00019 {
00020
00021 namespace base
00022 {
00023
00025
00026
00027
00057 template<typename Enum>
00058 class Flags
00059 {
00060 public:
00061 typedef Enum enum_type;
00062
00063 public:
00064 Flags() : _val( 0 ) {}
00065 Flags( Enum flag_r ) : _val( flag_r ) {}
00066 explicit Flags( unsigned flag_r ) : _val( flag_r ) {}
00067
00068 Flags & operator&=( Flags rhs ) { _val &= rhs._val; return *this; }
00069 Flags & operator&=( Enum rhs ) { _val &= rhs; return *this; }
00070
00071 Flags & operator|=( Flags rhs ) { _val |= rhs._val; return *this; }
00072 Flags & operator|=( Enum rhs ) { _val |= rhs; return *this; }
00073
00074 Flags & operator^=( Flags rhs ) { _val ^= rhs._val; return *this; }
00075 Flags & operator^=( Enum rhs ) { _val ^= rhs; return *this; }
00076
00077 public:
00078 operator unsigned() const { return _val; }
00079
00080 Flags operator&( Flags rhs ) const { return Flags( *this ) &= rhs; }
00081 Flags operator&( Enum rhs ) const { return Flags( *this ) &= rhs; }
00082
00083 Flags operator|( Flags rhs ) const { return Flags( *this ) |= rhs; }
00084 Flags operator|( Enum rhs ) const { return Flags( *this ) |= rhs; }
00085
00086 Flags operator^( Flags rhs ) const { return Flags( *this ) ^= rhs; }
00087 Flags operator^( Enum rhs ) const { return Flags( *this ) ^= rhs; }
00088
00089 Flags operator~() const { return Flags( ~_val ); }
00090
00091 public:
00092 Flags & setFlag( Flags flag_r, bool newval_r ) { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); }
00093 Flags & setFlag( Enum flag_r, bool newval_r ) { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); }
00094
00095 Flags & setFlag( Flags flag_r ) { _val |= flag_r; return *this; }
00096 Flags & setFlag( Enum flag_r ) { _val |= flag_r; return *this; }
00097
00098 Flags & unsetFlag( Flags flag_r ) { _val &= ~flag_r; return *this; }
00099 Flags & unsetFlag( Enum flag_r ) { _val &= ~flag_r; return *this; }
00100
00101 bool testFlag( Flags flag_r ) const { return unsigned( _val & flag_r ) == unsigned(flag_r); }
00102 bool testFlag( Enum flag_r ) const { return unsigned( _val & flag_r ) == unsigned(flag_r); }
00103
00104 private:
00105 unsigned _val;
00106 };
00108
00109 template<typename Enum>
00110 inline std::ostream & operator<<( std::ostream & str, const Flags<Enum> & obj )
00111 { return str << str::hexstring(obj); }
00112
00114 #define ZYPP_DECLARE_FLAGS(Name,Enum) typedef zypp::base::Flags<Enum> Name
00115
00117 #define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) \
00118 inline Name operator&( Name::enum_type lhs, Name::enum_type rhs ) { return Name( lhs ) &= rhs; } \
00119 inline Name operator&( Name::enum_type lhs, Name rhs ) { return rhs &= lhs; } \
00120 inline Name operator|( Name::enum_type lhs, Name::enum_type rhs ) { return Name( lhs ) |= rhs; } \
00121 inline Name operator|( Name::enum_type lhs, Name rhs ) { return rhs |= lhs; } \
00122 inline Name operator^( Name::enum_type lhs, Name::enum_type rhs ) { return Name( lhs ) ^= rhs; } \
00123 inline Name operator^( Name::enum_type lhs, Name rhs ) { return rhs ^= lhs; } \
00124 inline Name operator~( Name::enum_type lhs ) { return ~Name( lhs ); }
00125
00127 #define ZYPP_DECLARE_FLAGS_AND_OPERATORS(Name,Enum) \
00128 ZYPP_DECLARE_FLAGS(Name,Enum); \
00129 ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name)
00130
00132 }
00135 }
00137 #endif // ZYPP_BASE_FLAGS_H