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