Imported Upstream version 17.23.0
[platform/upstream/libzypp.git] / zypp / ResPool.h
index a8d37d9..572151f 100644 (file)
@@ -43,6 +43,18 @@ namespace zypp
    * an ordinary filter iterator. Do not provide filter iterators
    * here, if there is no index table for it.
    *
+   * For most (*Begin,*End) iterator-pairs there's also an \ref Iterable
+   * provided, so you can use then in range-based for loops:
+   * \code
+   *   // classic:
+   *   for_( it, pool.filterBegin(myfilter), pool.filterEnd(myfilter) )
+   *   { ... }
+   *
+   *   // range based:
+   *   for ( const PoolItem & pi : pool.filter(myfilter) )
+   *   { ... }
+   * \endcode
+   *
    * \include n_ResPool_nomorenameiter
   */
   class ResPool
@@ -101,15 +113,19 @@ namespace zypp
       { return( resolvable_r ? find( resolvable_r->satSolvable() ) : PoolItem() ); }
 
     public:
-      /** \name Iterate over all PoolItems matching a \c _Filter. */
+      /** \name Iterate over all PoolItems matching a \c TFilter. */
       //@{
-      template<class _Filter>
-      filter_iterator<_Filter,const_iterator> filterBegin( const _Filter & filter_r ) const
+      template<class TFilter>
+      filter_iterator<TFilter,const_iterator> filterBegin( const TFilter & filter_r ) const
       { return make_filter_begin( filter_r, *this ); }
 
-      template<class _Filter>
-      filter_iterator<_Filter,const_iterator> filterEnd( const _Filter & filter_r ) const
+      template<class TFilter>
+      filter_iterator<TFilter,const_iterator> filterEnd( const TFilter & filter_r ) const
       { return make_filter_end( filter_r, *this ); }
+
+      template<class TFilter>
+      Iterable<filter_iterator<TFilter,const_iterator> > filter( const TFilter & filter_r ) const
+      { return makeIterable( filterBegin( filter_r ), filterEnd( filter_r ) ); }
       //@}
 
       /** \name Iterate over all PoolItems by status.
@@ -136,6 +152,9 @@ namespace zypp
 
       filter_iterator<filter::ByStatus,const_iterator> byStatusEnd( const filter::ByStatus & filter_r ) const
       { return make_filter_end( filter_r, *this ); }
+
+      Iterable<filter_iterator<filter::ByStatus,const_iterator> > byStatus( const filter::ByStatus & filter_r ) const
+      { return makeIterable( byStatusBegin( filter_r ), byStatusEnd( filter_r ) ); }
       //@}
 
     public:
@@ -156,13 +175,13 @@ namespace zypp
       byIdent_iterator byIdentBegin( ResKind kind_r, const C_Str & name_r ) const
       { return byIdentBegin( ByIdent(kind_r,name_r) ); }
 
-      template<class _Res>
+      template<class TRes>
       byIdent_iterator byIdentBegin( IdString name_r ) const
-      { return byIdentBegin( ByIdent(ResTraits<_Res>::kind,name_r) ); }
+      { return byIdentBegin( ByIdent(ResTraits<TRes>::kind,name_r) ); }
 
-      template<class _Res>
+      template<class TRes>
       byIdent_iterator byIdentBegin( const C_Str & name_r ) const
-      { return byIdentBegin( ByIdent(ResTraits<_Res>::kind,name_r) ); }
+      { return byIdentBegin( ByIdent(ResTraits<TRes>::kind,name_r) ); }
 
       /** Derive name and kind from \ref PoolItem. */
       byIdent_iterator byIdentBegin( const PoolItem & pi_r ) const
@@ -187,13 +206,13 @@ namespace zypp
       byIdent_iterator byIdentEnd( ResKind kind_r, const C_Str & name_r ) const
       { return byIdentEnd( ByIdent(kind_r,name_r) ); }
 
-      template<class _Res>
+      template<class TRes>
       byIdent_iterator byIdentEnd( IdString name_r ) const
-      { return byIdentEnd( ByIdent(ResTraits<_Res>::kind,name_r) ); }
+      { return byIdentEnd( ByIdent(ResTraits<TRes>::kind,name_r) ); }
 
-      template<class _Res>
+      template<class TRes>
       byIdent_iterator byIdentEnd( const C_Str & name_r ) const
-      { return byIdentEnd( ByIdent(ResTraits<_Res>::kind,name_r) ); }
+      { return byIdentEnd( ByIdent(ResTraits<TRes>::kind,name_r) ); }
 
       /** Derive name and kind from \ref PoolItem. */
       byIdent_iterator byIdentEnd( const PoolItem & pi_r ) const
@@ -204,6 +223,33 @@ namespace zypp
       /** Takes a \ref sat::Solvable::ident string. */
       byIdent_iterator byIdentEnd( IdString ident_r ) const
       { return byIdentEnd( ByIdent(ident_r) ); }
+
+
+      Iterable<byIdent_iterator> byIdent( const ByIdent & ident_r ) const
+      { return makeIterable( byIdentBegin( ident_r ), byIdentEnd( ident_r ) ); }
+
+      Iterable<byIdent_iterator> byIdent( ResKind kind_r, IdString name_r ) const
+      { return makeIterable( byIdentBegin( kind_r, name_r ), byIdentEnd(  kind_r, name_r ) ); }
+
+      Iterable<byIdent_iterator> byIdent( ResKind kind_r, const C_Str & name_r ) const
+      { return makeIterable( byIdentBegin(  kind_r, name_r ), byIdentEnd(  kind_r, name_r ) ); }
+
+      template<class TRes>
+      Iterable<byIdent_iterator> byIdent( IdString name_r ) const
+      { return makeIterable( byIdentBegin<TRes>( name_r ), byIdentEnd<TRes>( name_r ) ); }
+
+      template<class TRes>
+      Iterable<byIdent_iterator> byIdent( const C_Str & name_r ) const
+      { return makeIterable( byIdentBegin<TRes>( name_r ), byIdentEnd<TRes>( name_r ) ); }
+
+      Iterable<byIdent_iterator> byIdent( const PoolItem & pi_r ) const
+      { return makeIterable( byIdentBegin( pi_r ), byIdentEnd( pi_r ) ); }
+
+      Iterable<byIdent_iterator> byIdent(sat::Solvable slv_r ) const
+      { return makeIterable( byIdentBegin( slv_r ), byIdentEnd( slv_r ) ); }
+
+      Iterable<byIdent_iterator> byIdent( IdString ident_r ) const
+      { return makeIterable( byIdentBegin( ident_r ), byIdentEnd( ident_r ) ); }
      //@}
 
     public:
@@ -215,16 +261,23 @@ namespace zypp
       byKind_iterator byKindBegin( const ResKind & kind_r ) const
       { return make_filter_begin( ByKind(kind_r), *this ); }
 
-      template<class _Res>
+      template<class TRes>
           byKind_iterator byKindBegin() const
-      { return make_filter_begin( resfilter::byKind<_Res>(), *this ); }
+      { return make_filter_begin( resfilter::byKind<TRes>(), *this ); }
 
       byKind_iterator byKindEnd( const ResKind & kind_r ) const
       { return make_filter_end( ByKind(kind_r), *this ); }
 
-      template<class _Res>
+      template<class TRes>
           byKind_iterator byKindEnd() const
-      { return make_filter_end( resfilter::byKind<_Res>(), *this ); }
+      { return make_filter_end( resfilter::byKind<TRes>(), *this ); }
+
+      Iterable<byKind_iterator> byKind( const ResKind & kind_r ) const
+      { return makeIterable( byKindBegin( kind_r ), byKindEnd( kind_r ) ); }
+
+      template<class TRes>
+      Iterable<byKind_iterator> byKind() const
+      { return makeIterable( byKindBegin<TRes>(), byKindEnd<TRes>() ); }
       //@}
 
     public:
@@ -238,12 +291,63 @@ namespace zypp
 
       byName_iterator byNameEnd( const std::string & name_r ) const
       { return make_filter_end( ByName(name_r), *this ); }
+
+      Iterable<byName_iterator> byName( const std::string & name_r ) const
+      { return makeIterable( byNameBegin( name_r ), byNameEnd( name_r ) ); }
       //@}
 
     public:
-      /** \name Special iterators. */
+      /** \name Misc Data. */
       //@{
+      ///////////////////////////////////////////////////////////////////
+      /// A copy of the Pools initial ValidateValues of pseudo installed items.
+      ///
+      /// AKA Patch status. Whenever the Pools content changes, the status
+      /// of pseudo installed items (like Patches) is computed (roughly whether
+      /// their dependencies are broken or satisfied) and remembered.
+      ///
+      /// Comparing the items established state against it's current state
+      /// tells how the current transaction would influence the item (break
+      /// or repair a Patch).
+      ///
+      class EstablishedStates
+      {
+      public:
+       ~EstablishedStates();
+       /** Map holding pseudo installed items where current and established status differ. */
+       typedef std::map<PoolItem,ResStatus::ValidateValue> ChangedPseudoInstalled;
+       /** Return all pseudo installed items whose current state differs from the established one */
+       ChangedPseudoInstalled changedPseudoInstalled() const;
+      private:
+       class Impl;
+       RW_pointer<Impl> _pimpl;
+      private:
+       friend class pool::PoolImpl;
+       /** Factory: \ref ResPool::establishedStates */
+       EstablishedStates( shared_ptr<Impl> pimpl_r )
+       : _pimpl { pimpl_r }
+       {}
+      };
+      ///////////////////////////////////////////////////////////////////
+
+      /** Factory for \ref EstablishedStates.
+       * A few internal algorithms benefit from keeping an instance across pool
+       * content changes. User code usually want's to call \ref changedPseudoInstalled
+       * directly.
+       */
+      EstablishedStates establishedStates() const;
+
+      /** Map holding pseudo installed items where current and established status differ. */
+      typedef EstablishedStates::ChangedPseudoInstalled ChangedPseudoInstalled;
 
+      /** Return all pseudo installed items whose current state differs from their initial one.
+       * E.g. a Patch may become SATISFIED by updating the packages it refers to.
+       * For this to happen it does not matter whether you selected the Patch or
+       * whether you selected the individual Packages.
+       * A Patches status is computed and updated with every solver run.
+       */
+      ChangedPseudoInstalled changedPseudoInstalled() const
+      { return establishedStates().changedPseudoInstalled(); }
       //@}
    public:
       /** \name Iterate over all Repositories that contribute ResObjects.
@@ -256,9 +360,12 @@ namespace zypp
       repository_iterator knownRepositoriesEnd() const;
 
       /** Find a \ref Repository named \c alias_r.
-       * Returns \ref Repository::norepository if there is no such \ref Repository.
+       * Returns \ref Repository::noRepository if there is no such \ref Repository.
        */
       Repository reposFind( const std::string & alias_r ) const;
+
+      Iterable<repository_iterator> knownRepositories() const
+      { return makeIterable( knownRepositoriesBegin(), knownRepositoriesEnd() ); }
       //@}
 
     public:
@@ -336,6 +443,9 @@ namespace zypp
       hardLockQueries_iterator hardLockQueriesBegin() const;
       hardLockQueries_iterator hardLockQueriesEnd() const;
 
+      Iterable<hardLockQueries_iterator> hardLockQueries() const
+      { return makeIterable( hardLockQueriesBegin(), hardLockQueriesEnd() ); }
+
       /** Set a new set of queries.
        * The hard-locks of existing PoolItems are adjusted according
        * to the queries. (usually called on target load)