libzypp  10.5.0
Capability.h
Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #ifndef ZYPP_CAPABILITY_H
00013 #define ZYPP_CAPABILITY_H
00014 
00015 #include <iosfwd>
00016 
00017 #include "zypp/base/SafeBool.h"
00018 #include "zypp/base/Deprecated.h"
00019 
00020 #include "zypp/sat/detail/PoolMember.h"
00021 
00022 #include "zypp/IdString.h"
00023 #include "zypp/Edition.h"
00024 #include "zypp/Rel.h"
00025 #include "zypp/ResTraits.h"
00026 
00027 #include "zypp/CapMatch.h"
00028 
00030 namespace zypp
00031 { 
00032 
00033   class Capability;
00034   class CapDetail;
00035   class Arch;
00036 
00037   typedef std::tr1::unordered_set<Capability> CapabilitySet;
00038 
00040   //
00041   //    CLASS NAME : Capability
00042   //
00061   class Capability: protected sat::detail::PoolMember,
00062                     private base::SafeBool<Capability>
00063   {
00064     public:
00065       enum CtorFlag { PARSED, UNPARSED };
00066 
00067     public:
00069       Capability() : _id( sat::detail::emptyId ) {}
00070 
00072       explicit Capability( sat::detail::IdType id_r ) : _id( id_r ) {}
00073 
00082       explicit Capability( const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00084       explicit Capability( const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00086       Capability( const Arch & arch_r, const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00088       Capability( const Arch & arch_r, const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED );
00089 
00091       Capability( const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00093       Capability( const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00095       Capability( const Arch & arch_r, const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00097       Capability( const Arch & arch_r, const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() );
00099 
00100 
00105       Capability( const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00107       Capability( const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00109       Capability( const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
00111 
00116       Capability( const std::string & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00118       Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00120       Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
00122       Capability( const Arch & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00124       Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() );
00126       Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() );
00128 
00129     public:
00131       static const Capability Null;
00132 
00134       static const Capability Empty;
00135 
00136     public:
00137 #ifndef SWIG // Swig treats it as syntax error
00138 
00139       using base::SafeBool<Capability>::operator bool_type;
00140 #endif
00141 
00144       bool empty() const
00145       { return( _id == sat::detail::emptyId || _id == sat::detail::noId ); }
00146 
00147     public:
00149       const char * c_str() const;
00150 
00152       std::string asString() const
00153       { return c_str(); }
00154 
00155     public:
00157       CapDetail detail() const;
00158 
00159     public:
00170       static CapMatch matches( const Capability & lhs,  const Capability & rhs )     { return _doMatch( lhs.id(), rhs.id() ); }
00171       static CapMatch matches( const Capability & lhs,  const IdString & rhs )       { return _doMatch( lhs.id(), rhs.id() ); }
00172       static CapMatch matches( const Capability & lhs,  const std::string & rhs )    { return _doMatch( lhs.id(), Capability(rhs).id() ); }
00173       static CapMatch matches( const Capability & lhs,  const char * rhs )           { return _doMatch( lhs.id(), Capability(rhs).id() );}
00174 
00175       static CapMatch matches( const IdString & lhs,    const Capability & rhs )     { return _doMatch( lhs.id(), rhs.id() ); }
00176       static CapMatch matches( const IdString & lhs,    const IdString & rhs )       { return _doMatch( lhs.id(), rhs.id() ); }
00177       static CapMatch matches( const IdString & lhs,    const std::string & rhs )    { return _doMatch( lhs.id(), Capability(rhs).id() ); }
00178       static CapMatch matches( const IdString & lhs,    const char * rhs )           { return _doMatch( lhs.id(), Capability(rhs).id() ); }
00179 
00180       static CapMatch matches( const std::string & lhs, const Capability & rhs )     { return _doMatch( Capability(lhs).id(), rhs.id() );}
00181       static CapMatch matches( const std::string & lhs, const IdString & rhs )       { return _doMatch( Capability(lhs).id(), rhs.id() ); }
00182       static CapMatch matches( const std::string & lhs, const std::string & rhs )    { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00183       static CapMatch matches( const std::string & lhs, const char * rhs )           { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00184 
00185       static CapMatch matches( const char * lhs,        const Capability & rhs )     { return _doMatch( Capability(lhs).id(), rhs.id() );}
00186       static CapMatch matches( const char * lhs,        const IdString & rhs )       { return _doMatch( Capability(lhs).id(), rhs.id() ); }
00187       static CapMatch matches( const char * lhs,        const std::string & rhs )    { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00188       static CapMatch matches( const char * lhs,        const char * rhs )           { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); }
00189 
00190       CapMatch matches( const Capability & rhs )  const { return _doMatch( id(), rhs.id() ); }
00191       CapMatch matches( const IdString & rhs )    const { return _doMatch( id(), rhs.id() ); }
00192       CapMatch matches( const std::string & rhs ) const { return _doMatch( id(), Capability(rhs).id() ); }
00193       CapMatch matches( const char * rhs )        const { return _doMatch( id(), Capability(rhs).id() ); }
00195 
00198       struct Matches: public std::binary_function<Capability,Capability,CapMatch>
00199       {
00200         CapMatch operator()( const Capability & lhs, const Capability & rhs ) const
00201         { return Capability::matches( lhs, rhs ); }
00202       };
00203 
00204     public:
00210       static bool isInterestingFileSpec( const IdString & name_r )    { return isInterestingFileSpec( name_r.c_str() ); }
00211       static bool isInterestingFileSpec( const std::string & name_r ) { return isInterestingFileSpec( name_r.c_str() ); }
00212       static bool isInterestingFileSpec( const char * name_r );
00213 
00238       static Capability guessPackageSpec( const std::string & str_r );
00243       static Capability guessPackageSpec( const std::string & str_r, bool & rewrote_r );
00244 
00245     public:
00247       sat::detail::IdType id() const
00248       { return _id; }
00249     private:
00251       static CapMatch _doMatch( sat::detail::IdType lhs,  sat::detail::IdType rhs );
00252     private:
00253 #ifndef SWIG // Swig treats it as syntax error
00254       friend base::SafeBool<Capability>::operator bool_type() const;
00255 #endif
00256       bool boolTest() const { return ! empty(); }
00257     private:
00258       sat::detail::IdType _id;
00259   };
00261 
00263   std::ostream & operator<<( std::ostream & str, const Capability & obj );
00264 
00266   std::ostream & dumpOn( std::ostream & str, const Capability & obj );
00267 
00269   inline bool operator==( const Capability & lhs, const Capability & rhs )
00270   { return lhs.id() == rhs.id(); }
00271 
00273   inline bool operator!=( const Capability & lhs, const Capability & rhs )
00274   { return lhs.id() != rhs.id(); }
00275 
00277   inline bool operator<( const Capability & lhs, const Capability & rhs )
00278   { return lhs.id() < rhs.id(); }
00279 
00281   //
00282   //    CLASS NAME : CapDetail
00283   //
00297   class CapDetail: protected sat::detail::PoolMember
00298   {
00299     public:
00300       enum Kind
00301       {
00302         NOCAP      = 0x00,
00303         NAMED      = 0x01,
00304         VERSIONED  = 0x02,
00305         EXPRESSION = 0x04
00306       };
00307 
00311       enum CapRel
00312       {
00313         REL_NONE      = 0,
00314         CAP_AND       = 16,
00315         CAP_OR        = 17,
00316         CAP_WITH      = 18,
00317         CAP_NAMESPACE = 19,
00318         CAP_ARCH      = 20
00319       };
00320 
00321     public:
00322       CapDetail()
00323       : _kind( NOCAP ), _lhs( 0 ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
00324       {}
00325       explicit CapDetail( const Capability & cap_r )
00326       : _kind( NOCAP ), _lhs( cap_r.id() ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
00327       { _init(); }
00328       explicit CapDetail( sat::detail::IdType id_r )
00329       : _kind( NOCAP ), _lhs( id_r ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 )
00330       { _init(); }
00331 
00332     public:
00333       Kind kind()         const { return _kind; }
00334       bool isNull()       const { return _kind == NOCAP; }
00335       bool isNamed()      const { return _kind == NAMED; }
00336       bool isVersioned()  const { return _kind == VERSIONED; }
00337       bool isSimple()     const { return _kind & (NAMED|VERSIONED); }
00338       bool isExpression() const { return _kind == EXPRESSION; }
00339 
00342       bool     hasArch()  const { return _archIfSimple; }
00343       IdString arch()     const { return _archIfSimple ? IdString( _archIfSimple ) : IdString(); }
00344       IdString name()     const { return isSimple()    ? IdString( _lhs ) : IdString(); }
00345       Rel      op()       const { return isVersioned() ? Rel( _flag )     : Rel::ANY; }
00346       Edition  ed()       const { return isVersioned() ? Edition( _rhs )  : Edition(); }
00348 
00351       Capability lhs()    const { return isExpression() ? Capability( _lhs ) : Capability::Null; }
00352       CapRel     capRel() const { return isExpression() ? CapRel(_flag)      : REL_NONE; }
00353       Capability rhs()    const { return isExpression() ? Capability( _rhs ) : Capability::Null; }
00355 
00356     private:
00357       void _init();
00358     private:
00359       Kind                _kind;
00360       sat::detail::IdType _lhs;
00361       sat::detail::IdType _rhs;
00362       unsigned            _flag;
00363       sat::detail::IdType _archIfSimple;
00364   };
00366 
00368   std::ostream & operator<<( std::ostream & str, const CapDetail & obj );
00369 
00371   std::ostream & operator<<( std::ostream & str, CapDetail::Kind obj );
00372 
00374   std::ostream & operator<<( std::ostream & str, CapDetail::CapRel obj );
00375 
00377 
00378   inline CapDetail Capability::detail() const { return CapDetail( _id ); }
00379 
00381 } // namespace zypp
00383 
00384 ZYPP_DEFINE_ID_HASHABLE( ::zypp::Capability );
00385 
00386 #endif // ZYPP_CAPABILITY_H