libzypp
10.5.0
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 00005 | / /__ | | | | | | | 00006 | /_____||_| |_| |_| | 00007 | | 00008 \---------------------------------------------------------------------*/ 00012 #ifndef ZYPP_SAT_SOLVABLE_H 00013 #define ZYPP_SAT_SOLVABLE_H 00014 00015 #include <iosfwd> 00016 00017 #include "zypp/base/SafeBool.h" 00018 00019 #include "zypp/sat/detail/PoolMember.h" 00020 #include "zypp/sat/SolvAttr.h" 00021 #include "zypp/ResTraits.h" 00022 #include "zypp/IdString.h" 00023 #include "zypp/Edition.h" 00024 #include "zypp/Arch.h" 00025 #include "zypp/Dep.h" 00026 #include "zypp/Capabilities.h" 00027 #include "zypp/Capability.h" 00028 #include "zypp/Locale.h" 00029 00031 namespace zypp 00032 { 00033 00034 class CheckSum; 00035 class OnMediaLocation; 00036 00038 namespace sat 00039 { 00040 00042 // 00043 // CLASS NAME : Solvable 00044 // 00057 class Solvable : protected detail::PoolMember, 00058 private base::SafeBool<Solvable> 00059 { 00060 public: 00061 typedef sat::detail::SolvableIdType IdType; 00062 00063 public: 00065 Solvable() 00066 : _id( detail::noSolvableId ) {} 00067 00069 explicit Solvable( IdType id_r ) 00070 : _id( id_r ) {} 00071 00072 public: 00074 static const Solvable noSolvable; 00075 00076 #ifndef SWIG // Swig treats it as syntax error 00077 00078 using base::SafeBool<Solvable>::operator bool_type; 00079 #endif 00080 00084 bool isSystem() const; 00085 00091 bool onSystemByUser() const; 00092 00094 Repository repository() const; 00095 00096 public: 00097 00107 std::string lookupStrAttribute( const SolvAttr & attr ) const; 00118 std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const; 00119 00124 unsigned lookupNumAttribute( const SolvAttr & attr ) const; 00125 00130 bool lookupBoolAttribute( const SolvAttr & attr ) const; 00131 00136 detail::IdType lookupIdAttribute( const SolvAttr & attr ) const; 00137 00142 CheckSum lookupCheckSumAttribute( const SolvAttr & attr ) const; 00143 00148 OnMediaLocation lookupLocation() const; 00149 00151 public: 00156 IdString ident() const; 00157 00158 ResKind kind() const; 00163 bool isKind( const ResKind & kind_r ) const; 00165 template<class _Res> 00166 bool isKind() const 00167 { return isKind( resKind<_Res>() ); } 00169 template<class _Iterator> 00170 bool isKind( _Iterator begin, _Iterator end ) 00171 { for_( it, begin, end ) if ( isKind( *it ) ) return true; return false; } 00172 00173 std::string name() const; 00174 Edition edition() const; 00175 Arch arch() const; 00176 00177 IdString vendor() const; 00178 00182 bool multiversionInstall() const; 00183 00191 std::string asString() const; 00192 00196 bool identical( Solvable rhs ) const; 00197 00199 bool sameNVRA( Solvable rhs ) const 00200 { return( ident() == rhs.ident() && edition() == rhs.edition() && arch() == rhs.arch() ); } 00201 00202 public: 00203 00209 Capabilities operator[]( Dep which_r ) const; 00210 00211 Capabilities provides() const; 00212 Capabilities requires() const; 00213 Capabilities conflicts() const; 00214 Capabilities obsoletes() const; 00215 Capabilities recommends() const; 00216 Capabilities suggests() const; 00217 Capabilities enhances() const; 00218 Capabilities supplements() const; 00219 Capabilities prerequires() const; 00220 00222 CapabilitySet providesNamespace( const std::string & namespace_r ) const; 00223 00231 CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const; 00233 00234 public: 00238 bool supportsLocales() const; 00240 bool supportsLocale( const Locale & locale_r ) const; 00242 bool supportsLocale( const LocaleSet & locales_r ) const; 00246 bool supportsRequestedLocales() const; 00248 void getSupportedLocales( LocaleSet & locales_r ) const; 00250 LocaleSet getSupportedLocales() const 00251 { LocaleSet ret; getSupportedLocales( ret ); return ret; } 00253 00254 public: 00256 Solvable nextInPool() const; 00258 Solvable nextInRepo() const; 00259 00265 class SplitIdent 00266 { 00267 public: 00268 SplitIdent() {} 00269 SplitIdent( IdString ident_r ); 00270 SplitIdent( const char * ident_r ); 00271 SplitIdent( const std::string & ident_r ); 00272 SplitIdent( ResKind kind_r, IdString name_r ); 00273 SplitIdent( ResKind kind_r, const C_Str & name_r ); 00274 00275 IdString ident() const { return _ident; } 00276 ResKind kind() const { return _kind; } 00277 IdString name() const { return _name; } 00278 00283 static ResKind explicitKind( IdString ident_r ) { return explicitKind( ident_r.c_str() ); } 00284 static ResKind explicitKind( const char * ident_r ); 00285 static ResKind explicitKind( const std::string & ident_r ) { return explicitKind( ident_r.c_str() ); } 00286 00287 private: 00288 IdString _ident; 00289 ResKind _kind; 00290 IdString _name; 00291 }; 00292 00293 public: 00295 ::_Solvable * get() const; 00297 IdType id() const { return _id; } 00298 private: 00299 #ifndef SWIG // Swig treats it as syntax error 00300 friend base::SafeBool<Solvable>::operator bool_type() const; 00301 #endif 00302 bool boolTest() const { return get(); } 00303 private: 00304 IdType _id; 00305 }; 00307 00309 std::ostream & operator<<( std::ostream & str, const Solvable & obj ); 00310 00312 std::ostream & dumpOn( std::ostream & str, const Solvable & obj ); 00313 00315 inline bool operator==( const Solvable & lhs, const Solvable & rhs ) 00316 { return lhs.get() == rhs.get(); } 00317 00319 inline bool operator!=( const Solvable & lhs, const Solvable & rhs ) 00320 { return lhs.get() != rhs.get(); } 00321 00323 inline bool operator<( const Solvable & lhs, const Solvable & rhs ) 00324 { return lhs.get() < rhs.get(); } 00325 00327 inline bool identical( Solvable lhs, Solvable rhs ) 00328 { return lhs.identical( rhs ); } 00329 00331 inline bool sameNVRA( Solvable lhs, Solvable rhs ) 00332 { return lhs.sameNVRA( rhs ); } 00333 00335 namespace detail 00336 { 00337 00338 // 00339 // CLASS NAME : SolvableIterator 00340 // 00342 class SolvableIterator : public boost::iterator_adaptor< 00343 SolvableIterator // Derived 00344 , ::_Solvable* // Base 00345 , const Solvable // Value 00346 , boost::forward_traversal_tag // CategoryOrTraversal 00347 , const Solvable // Reference 00348 > 00349 { 00350 public: 00351 SolvableIterator() 00352 : SolvableIterator::iterator_adaptor_( 0 ) 00353 {} 00354 00355 explicit SolvableIterator( const Solvable & val_r ) 00356 : SolvableIterator::iterator_adaptor_( 0 ) 00357 { assignVal( val_r ); } 00358 00359 explicit SolvableIterator( SolvableIdType id_r ) 00360 : SolvableIterator::iterator_adaptor_( 0 ) 00361 { assignVal( Solvable( id_r ) ); } 00362 00363 private: 00364 friend class boost::iterator_core_access; 00365 00366 Solvable dereference() const 00367 { return _val; } 00368 00369 void increment() 00370 { assignVal( _val.nextInPool() ); } 00371 00372 private: 00373 void assignVal( const Solvable & val_r ) 00374 { _val = val_r; base_reference() = _val.get(); } 00375 00376 Solvable _val; 00377 }; 00380 } // namespace detail 00382 00384 } // namespace sat 00386 00388 template<class _Res> 00389 inline bool isKind( const sat::Solvable & solvable_r ) 00390 { return solvable_r.isKind( ResTraits<_Res>::kind ); } 00391 00392 class PoolItem; 00394 namespace sat 00395 { 00396 00400 struct asSolvable 00401 { 00402 typedef Solvable result_type; 00403 00404 Solvable operator()( Solvable solv_r ) const 00405 { return solv_r; } 00406 00407 Solvable operator()( const PoolItem & pi_r ) const; 00408 00409 Solvable operator()( const ResObject_constPtr & res_r ) const; 00410 }; 00412 } // namespace sat 00414 00416 } // namespace zypp 00418 00419 ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable ); 00420 00421 #endif // ZYPP_SAT_SOLVABLE_H