libzypp  10.5.0
Solvable.h
Go to the documentation of this file.
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