libzypp
10.5.0
|
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 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( Enum flag_r, bool newval_r ) 00093 { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); } 00094 00095 Flags & setFlag( Enum flag_r ) { _val |= flag_r; return *this; } 00096 Flags & unsetFlag( Enum flag_r ) { _val &= ~flag_r; return *this; } 00097 00098 bool testFlag( Enum flag_r ) const { return _val & flag_r; } 00099 00100 private: 00101 unsigned _val; 00102 }; 00104 00105 template<typename Enum> 00106 inline std::ostream & operator<<( std::ostream & str, const Flags<Enum> & obj ) 00107 { return str << str::hexstring(obj); } 00108 00110 #define ZYPP_DECLARE_FLAGS(Name,Enum) typedef zypp::base::Flags<Enum> Name 00111 00113 #define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) \ 00114 inline Name operator|( Name::enum_type lhs, Name::enum_type rhs ) { return Name( lhs ) |= rhs; } \ 00115 inline Name operator|( Name::enum_type lhs, Name rhs ) { return rhs |= lhs; } 00116 00118 #define ZYPP_DECLARE_FLAGS_AND_OPERATORS(Name,Enum) \ 00119 ZYPP_DECLARE_FLAGS(Name,Enum); \ 00120 ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) 00121 00123 } // namespace base 00126 } // namespace zypp 00128 #endif // ZYPP_BASE_FLAGS_H