libzypp 8.13.6
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 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 // CLASS NAME : Flags<Enum> 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&=( unsigned rhs ) { _val &= rhs; return *this; } 00069 Flags & operator&=( Flags rhs ) { _val &= rhs._val; return *this; } 00070 Flags & operator&=( Enum rhs ) { _val &= rhs; return *this; } 00071 00072 Flags & operator|=( Flags rhs ) { _val |= rhs._val; return *this; } 00073 Flags & operator|=( Enum rhs ) { _val |= rhs; return *this; } 00074 00075 Flags & operator^=( Flags rhs ) { _val ^= rhs._val; return *this; } 00076 Flags & operator^=( Enum rhs ) { _val ^= rhs; return *this; } 00077 00078 public: 00079 operator unsigned() const { return _val; } 00080 00081 Flags operator&( unsigned rhs ) const { return Flags( *this ) &= rhs; } 00082 Flags operator&( Flags rhs ) const { return Flags( *this ) &= rhs; } 00083 Flags operator&( Enum rhs ) const { return Flags( *this ) &= rhs; } 00084 00085 Flags operator|( Flags rhs ) const { return Flags( *this ) |= rhs; } 00086 Flags operator|( Enum rhs ) const { return Flags( *this ) |= rhs; } 00087 00088 Flags operator^( Flags rhs ) const { return Flags( *this ) ^= rhs; } 00089 Flags operator^( Enum rhs ) const { return Flags( *this ) ^= rhs; } 00090 00091 Flags operator~() const { return ~_val; } 00092 00093 public: 00094 Flags & setFlag( Enum flag_r, bool newval_r ) 00095 { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); } 00096 00097 Flags & setFlag( Enum flag_r ) { _val |= flag_r; return *this; } 00098 Flags & unsetFlag( Enum flag_r ) { _val &= ~flag_r; return *this; } 00099 00100 bool testFlag( Enum flag_r ) const { return _val & flag_r; } 00101 00102 private: 00103 unsigned _val; 00104 }; 00106 00107 template<typename Enum> 00108 inline std::ostream & operator<<( std::ostream & str, const Flags<Enum> & obj ) 00109 { return str << str::hexstring(obj); } 00110 00112 #define ZYPP_DECLARE_FLAGS(Name,Enum) typedef zypp::base::Flags<Enum> Name 00113 00115 #define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) \ 00116 inline Name operator|( Name::enum_type lhs, Name::enum_type rhs ) { return Name( lhs ) |= rhs; } \ 00117 inline Name operator|( Name::enum_type lhs, Name rhs ) { return rhs |= lhs; } 00118 00120 #define ZYPP_DECLARE_FLAGS_AND_OPERATORS(Name,Enum) \ 00121 ZYPP_DECLARE_FLAGS(Name,Enum); \ 00122 ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) 00123 00125 } // namespace base 00128 } // namespace zypp 00130 #endif // ZYPP_BASE_FLAGS_H