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         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

doxygen