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&=( 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   } // namespace base
00135 } // namespace zypp
00137 #endif // ZYPP_BASE_FLAGS_H

Generated on Tue May 5 14:43:15 2015 for libzypp by  doxygen 1.5.6