libzypp  10.5.0
Flags.h
Go to the documentation of this file.
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