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
00087 Repository repository() const;
00088
00089 public:
00090
00100 std::string lookupStrAttribute( const SolvAttr & attr ) const;
00111 std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const;
00112
00117 unsigned lookupNumAttribute( const SolvAttr & attr ) const;
00118
00123 bool lookupBoolAttribute( const SolvAttr & attr ) const;
00124
00129 detail::IdType lookupIdAttribute( const SolvAttr & attr ) const;
00130
00135 CheckSum lookupCheckSumAttribute( const SolvAttr & attr ) const;
00136
00141 OnMediaLocation lookupLocation() const;
00142
00144 public:
00149 IdString ident() const;
00150
00151 ResKind kind() const;
00156 bool isKind( const ResKind & kind_r ) const;
00158 template<class _Res>
00159 bool isKind() const
00160 { return isKind( resKind<_Res>() ); }
00162 template<class _Iterator>
00163 bool isKind( _Iterator begin, _Iterator end )
00164 { for_( it, begin, end ) if ( isKind( *it ) ) return true; return false; }
00165
00166 std::string name() const;
00167 Edition edition() const;
00168 Arch arch() const;
00169
00170 IdString vendor() const;
00171
00175 bool multiversionInstall() const;
00176
00178 bool installOnly() const ZYPP_DEPRECATED;
00179
00187 std::string asString() const;
00188
00192 bool identical( Solvable rhs ) const;
00193
00195 bool sameNVRA( Solvable rhs ) const
00196 { return( ident() == rhs.ident() && edition() == rhs.edition() && arch() == rhs.arch() ); }
00197
00198 public:
00199
00205 Capabilities operator[]( Dep which_r ) const;
00206
00207 Capabilities provides() const;
00208 Capabilities requires() const;
00209 Capabilities conflicts() const;
00210 Capabilities obsoletes() const;
00211 Capabilities recommends() const;
00212 Capabilities suggests() const;
00213 Capabilities enhances() const;
00214 Capabilities supplements() const;
00215 Capabilities prerequires() const;
00216
00218 CapabilitySet providesNamespace( const std::string & namespace_r ) const;
00219
00227 CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const;
00229
00230 public:
00234 bool supportsLocales() const;
00236 bool supportsLocale( const Locale & locale_r ) const;
00238 bool supportsLocale( const LocaleSet & locales_r ) const;
00242 bool supportsRequestedLocales() const;
00244 void getSupportedLocales( LocaleSet & locales_r ) const;
00246 LocaleSet getSupportedLocales() const
00247 { LocaleSet ret; getSupportedLocales( ret ); return ret; }
00249
00250 public:
00252 Solvable nextInPool() const;
00254 Solvable nextInRepo() const;
00255
00261 class SplitIdent
00262 {
00263 public:
00264 SplitIdent() {}
00265 SplitIdent( IdString ident_r );
00266 SplitIdent( const char * ident_r );
00267 SplitIdent( const std::string & ident_r );
00268 SplitIdent( ResKind kind_r, IdString name_r );
00269 SplitIdent( ResKind kind_r, const C_Str & name_r );
00270
00271 IdString ident() const { return _ident; }
00272 ResKind kind() const { return _kind; }
00273 IdString name() const { return _name; }
00274
00279 static ResKind explicitKind( IdString ident_r ) { return explicitKind( ident_r.c_str() ); }
00280 static ResKind explicitKind( const char * ident_r );
00281 static ResKind explicitKind( const std::string & ident_r ) { return explicitKind( ident_r.c_str() ); }
00282
00283 private:
00284 IdString _ident;
00285 ResKind _kind;
00286 IdString _name;
00287 };
00288
00289 public:
00291 ::_Solvable * get() const;
00293 IdType id() const { return _id; }
00294 private:
00295 #ifndef SWIG // Swig treats it as syntax error
00296 friend base::SafeBool<Solvable>::operator bool_type() const;
00297 #endif
00298 bool boolTest() const { return get(); }
00299 private:
00300 IdType _id;
00301 };
00303
00305 std::ostream & operator<<( std::ostream & str, const Solvable & obj );
00306
00308 std::ostream & dumpOn( std::ostream & str, const Solvable & obj );
00309
00311 inline bool operator==( const Solvable & lhs, const Solvable & rhs )
00312 { return lhs.get() == rhs.get(); }
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 identical( Solvable lhs, Solvable rhs )
00324 { return lhs.identical( rhs ); }
00325
00327 inline bool sameNVRA( Solvable lhs, Solvable rhs )
00328 { return lhs.sameNVRA( rhs ); }
00329
00331 namespace detail
00332 {
00333
00334
00335
00336
00338 class SolvableIterator : public boost::iterator_adaptor<
00339 SolvableIterator
00340 , ::_Solvable*
00341 , const Solvable
00342 , boost::forward_traversal_tag
00343 , const Solvable
00344 >
00345 {
00346 public:
00347 SolvableIterator()
00348 : SolvableIterator::iterator_adaptor_( 0 )
00349 {}
00350
00351 explicit SolvableIterator( const Solvable & val_r )
00352 : SolvableIterator::iterator_adaptor_( 0 )
00353 { assignVal( val_r ); }
00354
00355 explicit SolvableIterator( SolvableIdType id_r )
00356 : SolvableIterator::iterator_adaptor_( 0 )
00357 { assignVal( Solvable( id_r ) ); }
00358
00359 private:
00360 friend class boost::iterator_core_access;
00361
00362 Solvable dereference() const
00363 { return _val; }
00364
00365 void increment()
00366 { assignVal( _val.nextInPool() ); }
00367
00368 private:
00369 void assignVal( const Solvable & val_r )
00370 { _val = val_r; base_reference() = _val.get(); }
00371
00372 Solvable _val;
00373 };
00376 }
00378
00380 }
00382
00384 template<class _Res>
00385 inline bool isKind( const sat::Solvable & solvable_r )
00386 { return solvable_r.isKind( ResTraits<_Res>::kind ); }
00387
00388 class PoolItem;
00390 namespace sat
00391 {
00392
00396 struct asSolvable
00397 {
00398 typedef Solvable result_type;
00399
00400 Solvable operator()( Solvable solv_r ) const
00401 { return solv_r; }
00402
00403 Solvable operator()( const PoolItem & pi_r ) const;
00404
00405 Solvable operator()( const ResObject_constPtr & res_r ) const;
00406 };
00408 }
00410
00412 }
00414
00415 ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable );
00416
00417 #endif // ZYPP_SAT_SOLVABLE_H