Solvable.h
Go to the documentation of this file.00001
00002
00003
00004
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
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
00340
00342 class SolvableIterator : public boost::iterator_adaptor<
00343 SolvableIterator
00344 , ::_Solvable*
00345 , const Solvable
00346 , boost::forward_traversal_tag
00347 , const Solvable
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 }
00382
00384 }
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 }
00414
00416 }
00418
00419 ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable );
00420
00421 #endif // ZYPP_SAT_SOLVABLE_H