Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / sat / detail / PoolImpl.h
index 243a0a6..77ced71 100644 (file)
@@ -21,9 +21,10 @@ extern "C"
 }
 #include <iosfwd>
 
-#include "zypp/base/Tr1hash.h"
+#include "zypp/base/Hash.h"
 #include "zypp/base/NonCopyable.h"
 #include "zypp/base/SerialNumber.h"
+#include "zypp/base/SetTracker.h"
 #include "zypp/sat/detail/PoolMember.h"
 #include "zypp/sat/Queue.h"
 #include "zypp/RepoInfo.h"
@@ -37,6 +38,7 @@ namespace zypp
   ///////////////////////////////////////////////////////////////////
   namespace sat
   { /////////////////////////////////////////////////////////////////
+    class SolvableSet;
     ///////////////////////////////////////////////////////////////////
     namespace detail
     { /////////////////////////////////////////////////////////////////
@@ -68,8 +70,6 @@ namespace zypp
            * \todo actually requires a watcher.
            */
           void prepare() const;
-         /** \ref prepare plus some expensive checks done before solving only. */
-         void prepareForSolving() const;
 
         private:
           /** Invalidate housekeeping data (e.g. whatprovides) if the
@@ -77,6 +77,10 @@ namespace zypp
            */
           void setDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
 
+          /** Invalidate locale related housekeeping data.
+           */
+          void localeSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
+
           /** Invalidate housekeeping data (e.g. whatprovides) if dependencies changed.
            */
           void depSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
@@ -119,7 +123,7 @@ namespace zypp
           /** Creating a new repo named \a name_r. */
           CRepo * _createRepo( const std::string & name_r );
 
-          /** Creating a new repo named \a name_r. */
+          /** Delete repo \a repo_r from pool. */
           void _deleteRepo( CRepo * repo_r );
 
           /** Adding solv file to a repo.
@@ -216,22 +220,45 @@ namespace zypp
           { prepare(); return ::pool_whatprovides( _pool, cap_r.id() ); }
 
         public:
-          /** \name Requested locales. */
+          /// \name Requested locales.
+         /// The requested LocaleSets managed in _requestedLocalesTracker
+         /// are unexpanded; i.e. they contain just the pure user selection.
+         /// The resolver however uses expanded sets ('de_DE' will also
+         /// include its fallback locales 'de', (en); here in the namespace:
+         /// callback and in the Resolver itself).
           //@{
+         /** */
          void setTextLocale( const Locale & locale_r );
-          void setRequestedLocales( const LocaleSet & locales_r );
-          bool addRequestedLocale( const Locale & locale_r );
-          bool eraseRequestedLocale( const Locale & locale_r );
 
+
+         /** Start tracking changes based on this \a locales_r.
+          * Usually called on TargetInit.
+          */
+         void initRequestedLocales( const LocaleSet & locales_r );
+
+          /** Added since last initRequestedLocales. */
+          const LocaleSet & getAddedRequestedLocales() const
+          { return _requestedLocalesTracker.added(); }
+
+          /** Removed since last initRequestedLocales. */
+          const LocaleSet & getRemovedRequestedLocales() const
+          { return _requestedLocalesTracker.removed(); }
+
+          /** Current set of requested Locales. */
           const LocaleSet & getRequestedLocales() const
-          { return _requestedLocales; }
+          { return _requestedLocalesTracker.current(); }
 
           bool isRequestedLocale( const Locale & locale_r ) const
-          {
-            LocaleSet::const_iterator it( _requestedLocales.find( locale_r ) );
-            return it != _requestedLocales.end();
-          }
+          { return _requestedLocalesTracker.contains( locale_r ); }
 
+          /** User change (tracked). */
+          void setRequestedLocales( const LocaleSet & locales_r );
+          /** User change (tracked). */
+          bool addRequestedLocale( const Locale & locale_r );
+          /** User change (tracked). */
+          bool eraseRequestedLocale( const Locale & locale_r );
+
+         /** All Locales occurring in any repo. */
           const LocaleSet & getAvailableLocales() const;
 
           bool isAvailableLocale( const Locale & locale_r ) const
@@ -240,25 +267,23 @@ namespace zypp
             LocaleSet::const_iterator it( avl.find( locale_r ) );
             return it != avl.end();
           }
+
+          typedef base::SetTracker<IdStringSet> TrackedLocaleIds;
+
+          /** Expanded _requestedLocalesTracker for solver.*/
+          const TrackedLocaleIds & trackedLocaleIds() const;
           //@}
 
         public:
           /** \name Multiversion install. */
           //@{
-          typedef IdStringSet MultiversionList;
+          typedef SolvableSet MultiversionList;
 
-          const MultiversionList & multiversionList() const
-          {
-            if ( ! _multiversionListPtr )
-              multiversionListInit();
-            return *_multiversionListPtr;
-          }
+          const MultiversionList & multiversionList() const;
 
-          bool isMultiversion( IdString ident_r ) const
-          {
-            const MultiversionList & l( multiversionList() );
-            return l.find( ident_r ) != l.end();
-          }
+          bool isMultiversion( const Solvable & solv_r ) const;
+
+         void multiversionSpecChanged();
           //@}
 
         public:
@@ -291,9 +316,10 @@ namespace zypp
           std::map<RepoIdType,RepoInfo> _repoinfos;
 
           /**  */
-          LocaleSet _requestedLocales;
+         base::SetTracker<LocaleSet> _requestedLocalesTracker;
+         mutable scoped_ptr<TrackedLocaleIds> _trackedLocaleIdsPtr;
+
           mutable scoped_ptr<LocaleSet> _availableLocalesPtr;
-          mutable std::tr1::unordered_set<IdString> _locale2Solver;
 
           /**  */
           void multiversionListInit() const;