Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / sat / Solvable.h
index 2702333..2113b42 100644 (file)
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
-{
-  class ByteCount;
+{ /////////////////////////////////////////////////////////////////
+
   class CheckSum;
-  class CpeId;
-  class Date;
   class OnMediaLocation;
+
   ///////////////////////////////////////////////////////////////////
   namespace sat
-  {
-    ///////////////////////////////////////////////////////////////////
-    /// \class Solvable
-    /// \brief  A \ref Solvable object within the sat \ref Pool.
-    ///
-    /// \note Unfortunately libsolv combines the objects kind and
-    /// name in a single identifier \c "pattern:kde_multimedia",
-    /// \b except for packages and source packes. They are not prefixed
-    /// by any kind string. Instead the architecture is abused to store
-    /// \c "src" and \c "nosrc" values.
-    ///
-    /// \ref Solvable will hide this inconsistency by treating source
-    /// packages as an own kind of solvable and map their arch to
-    /// \ref Arch_noarch.
+  { /////////////////////////////////////////////////////////////////
+
     ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : Solvable
+    //
+    /** A \ref Solvable object within the sat \ref Pool.
+     *
+     * \note Unfortunately libsolv combines the objects kind and
+     * name in a single identifier \c "pattern:kde_multimedia",
+     * \b except for packages and source packes. They are not prefixed
+     * by any kind string. Instead the architecture is abused to store
+     * \c "src" and \c "nosrc" values.
+     *
+     * \ref Solvable will hide this inconsistency by treating source
+     * packages as an own kind of solvable and map their arch to
+     * \ref Arch_noarch.
+     */
     class Solvable : protected detail::PoolMember
     {
-    public:
-      typedef sat::detail::SolvableIdType IdType;
-
-    public:
-      /** Default ctor creates \ref noSolvable.*/
-      Solvable()
-      : _id( detail::noSolvableId )
-      {}
-
-      /** \ref PoolImpl ctor. */
-      explicit Solvable( IdType id_r )
-      : _id( id_r )
-      {}
-
-    public:
-      /** Represents no \ref Solvable. */
-      static const Solvable noSolvable;
-
-      /** Evaluate \ref Solvable in a boolean context (\c != \c noSolvable). */
-      explicit operator bool() const
-      { return get(); }
-
-    public:
-      /** The identifier.
-       * This is the solvables \ref name, \b except for packages and
-       * source packes, prefixed by it's \ref kind.
-       */
-      IdString ident()const;
-
-      /** The Solvables ResKind. */
-      ResKind kind()const;
-
-      /** Test whether a Solvable is of a certain \ref ResKind.
-       * The test is far cheaper than actually retrieving and
-       * comparing the \ref kind.
-       */
-      bool isKind( const ResKind & kind_r ) const;
-      /** \overload */
-      template<class TRes>
-      bool isKind() const
-      { return isKind( resKind<TRes>() ); }
-      /** \overload Extend the test to a range of \ref ResKind. */
-      template<class TIterator>
-      bool isKind( TIterator begin, TIterator end ) const
-      { for_( it, begin, end ) if ( isKind( *it ) ) return true; return false; }
-
-      /** The name (without any ResKind prefix). */
-      std::string name() const;
-
-      /** The edition (version-release). */
-      Edition edition() const;
-
-      /** The architecture. */
-      Arch arch() const;
-
-      /** The vendor. */
-      IdString vendor() const;
-
-      /** The \ref Repository this \ref Solvable belongs to. */
-      Repository repository() const;
-      /** The repositories \ref RepoInfo. */
-      RepoInfo repoInfo() const;
-
-      /** Return whether this \ref Solvable belongs to the system repo.
-       * \note This includes the otherwise hidden systemSolvable.
-       */
-      bool isSystem() const;
-
-      /** Whether this is known to be installed on behalf of a user request.
-       * \note This is a hint guessed by evaluating an available install history.
-       * Returns \c false for non-system (uninstalled) solvables, or if no history
-       * is available.
-       */
-      bool onSystemByUser() const;
-
-      /** Whether different versions of this package can be installed at the same time.
-       * Per default \c false. \see also \ref ZConfig::multiversion.
-       */
-      bool multiversionInstall() const;
-
-      /** The items build time. */
-      Date buildtime() const;
-
-      /** The items install time (\c false if not installed). */
-      Date installtime() const;
-
-    public:
-      /** String representation <tt>"ident-edition.arch"</tt> or \c "noSolvable"
-       * \code
-       *   product:openSUSE-11.1.x86_64
-       *   autoyast2-2.16.19-0.1.src
-       *   noSolvable
-       * \endcode
-       */
-      std::string asString() const;
-
-      /** String representation <tt>"ident-edition.arch(repo)"</tt> or \c "noSolvable" */
-      std::string asUserString() const;
-
-      /** Test whether two Solvables have the same content.
-       * Basically the same name, edition, arch, vendor and buildtime.
-       */
-      bool identical( const Solvable & rhs ) const;
-
-      /** Test for same name-version-release.arch */
-      bool sameNVRA( const Solvable & rhs ) const
-      { return( get() == rhs.get() || ( ident() == rhs.ident() && edition() == rhs.edition() && arch() == rhs.arch() ) ); }
-
-    public:
-      /** \name Access to the \ref Solvable dependencies.
-       *
-       * \note Prerequires are a subset of requires.
-       */
-      //@{
-      Capabilities provides()    const;
-      Capabilities requires()    const;
-      Capabilities conflicts()   const;
-      Capabilities obsoletes()   const;
-      Capabilities recommends()  const;
-      Capabilities suggests()    const;
-      Capabilities enhances()    const;
-      Capabilities supplements() const;
-      Capabilities prerequires() const;
-
-      /** Return \ref Capabilities selected by \ref Dep constant. */
-      Capabilities dep( Dep which_r ) const
-      {
-       switch( which_r.inSwitch() )
-       {
-         case Dep::PROVIDES_e:    return provides();    break;
-         case Dep::REQUIRES_e:    return requires();    break;
-         case Dep::CONFLICTS_e:   return conflicts();   break;
-         case Dep::OBSOLETES_e:   return obsoletes();   break;
-         case Dep::RECOMMENDS_e:  return recommends();  break;
-         case Dep::SUGGESTS_e:    return suggests();    break;
-         case Dep::ENHANCES_e:    return enhances();    break;
-         case Dep::SUPPLEMENTS_e: return supplements(); break;
-         case Dep::PREREQUIRES_e: return prerequires(); break;
-       }
-       return Capabilities();
-      }
-      /** \overload operator[] */
-      Capabilities operator[]( Dep which_r ) const
-      { return dep( which_r ); }
-
-
-      /** Return the namespaced provides <tt>'namespace([value])[ op edition]'</tt> of this Solvable. */
-      CapabilitySet providesNamespace( const std::string & namespace_r ) const;
-
-      /** Return <tt>'value[ op edition]'</tt> for namespaced provides <tt>'namespace(value)[ op edition]'</tt>.
-       * Similar to \ref providesNamespace, but the namespace is stripped from the
-       * dependencies. This is convenient if the namespace denotes packages that
-       * should be looked up. E.g. the \c weakremover namespace used in a products
-       * release package denotes the packages that were dropped from the distribution.
-       * \see \ref Product::droplist
-       */
-      CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const;
-      //@}
-
-    public:
-      /** \name Locale support. */
-      //@{
-      /** Whether this \c Solvable claims to support locales. */
-      bool supportsLocales() const;
-      /** Whether this \c Solvable supports a specific \ref Locale. */
-      bool supportsLocale( const Locale & locale_r ) const;
-      /** Whether this \c Solvable supports at least one of the specified locales. */
-      bool supportsLocale( const LocaleSet & locales_r ) const;
-      /** Whether this \c Solvable supports at least one requested locale.
-       * \see \ref Pool::setRequestedLocales
-       */
-      bool supportsRequestedLocales() const;
-      /** Return the supported locales. */
-      LocaleSet getSupportedLocales() const;
-      /** \overload Legacy return via arg \a locales_r */
-      void getSupportedLocales( LocaleSet & locales_r ) const
-      { locales_r = getSupportedLocales(); }
-      //@}
-
-    public:
-      /** The solvables CpeId if available. */
-      CpeId cpeId() const;
-
-      /** Media number the solvable is located on (\c 0 if no media access required). */
-      unsigned mediaNr() const;
-
-      /** Installed (unpacked) size.
-       * This is just a total number. Many objects provide even more detailed
-       * disk usage data. You can use \ref DiskUsageCounter to find out
-       * how objects data are distributed across partitions/directories.
-       * \code
-       *   // Load directory set into ducounter
-       *   DiskUsageCounter ducounter( { "/", "/usr", "/var" } );
-       *
-       *   // see how noch space the packages use
-       *   for ( const PoolItem & pi : pool )
-       *   {
-       *     cout << pi << ducounter.disk_usage( pi ) << endl;
-       *     // I__s_(7)GeoIP-1.4.8-3.1.2.x86_64(@System) {
-       *     // dir:[/] [ bs: 0 B ts: 0 B us: 0 B (+-: 1.0 KiB)]
-       *     // dir:[/usr] [ bs: 0 B ts: 0 B us: 0 B (+-: 133.0 KiB)]
-       *     // dir:[/var] [ bs: 0 B ts: 0 B us: 0 B (+-: 1.1 MiB)]
-       *     // }
-       *   }
-       * \endcode
-       * \see \ref DiskUsageCounter
-       */
-      ByteCount installSize() const;
-
-      /** Download size. */
-      ByteCount downloadSize() const;
-
-      /** The distribution string. */
-      std::string distribution() const;
-
-      /** Short (singleline) text describing the solvable (opt. translated). */
-      std::string summary( const Locale & lang_r = Locale() ) const;
-
-      /** Long (multiline) text describing the solvable (opt. translated). */
-      std::string description( const Locale & lang_r = Locale() ) const;
-
-      /** UI hint text when selecting the solvable for install (opt. translated). */
-      std::string insnotify( const Locale & lang_r = Locale() ) const;
-      /** UI hint text when selecting the solvable for uninstall (opt. translated).*/
-      std::string delnotify( const Locale & lang_r = Locale() ) const;
-
-      /** License or agreement to accept before installing the solvable (opt. translated). */
-      std::string licenseToConfirm( const Locale & lang_r = Locale() ) const;
-      /** \c True except for well known exceptions (i.e show license but no need to accept it). */
-      bool needToAcceptLicense() const;
-
-    public:
-      /** Helper that splits an identifier into kind and name or vice versa.
-       * \note In case \c name_r is preceded by a well known kind spec, the
-       * \c kind_r argument is ignored, and kind is derived from name.
-       * \see \ref ident
-       */
-      class SplitIdent
-      {
       public:
-       SplitIdent() {}
-       SplitIdent( IdString ident_r );
-       SplitIdent( const char * ident_r );
-       SplitIdent( const std::string & ident_r );
-       SplitIdent( ResKind kind_r, IdString name_r );
-       SplitIdent( ResKind kind_r, const C_Str & name_r );
+        typedef sat::detail::SolvableIdType IdType;
 
-       IdString ident() const { return _ident; }
-       ResKind  kind()  const { return _kind; }
-       IdString name()  const { return _name; }
+      public:
+        /** Default ctor creates \ref noSolvable.*/
+        Solvable()
+        : _id( detail::noSolvableId ) {}
 
-      private:
-       IdString  _ident;
-       ResKind   _kind;
-       IdString  _name;
-      };
+        /** \ref PoolImpl ctor. */
+        explicit Solvable( IdType id_r )
+        : _id( id_r ) {}
+
+      public:
+        /** Represents no \ref Solvable. */
+        static const Solvable noSolvable;
+
+        /** Evaluate \ref Solvable in a boolean context (\c != \c noSolvable). */
+        explicit operator bool() const
+        { return get(); }
+
+        /** Return whether this \ref Solvable belongs to the system repo.
+         * \note This includes the otherwise hidden systemSolvable.
+        */
+        bool isSystem() const;
+
+       /** Whether this is known to be installed on behalf of a user request.
+        * \note This is a hint guessed by evaluating an available install history.
+        * Returns \c false for non-system (uninstalled) solvables, or if no history
+        * is available.
+        */
+       bool onSystemByUser() const;
+
+        /** The \ref Repository this \ref Solvable belongs to. */
+        Repository repository() const;
 
-    public:
-      /** \name Attribute lookup.
-       * \see \ref LookupAttr and  \ref ArrayAttr providing a general, more
-       * query like interface for attribute retrieval.
-       */
-      //@{
-      /**
-       * returns the string attribute value for \ref attr
-       * or an empty string if it does not exists.
-       */
-      std::string lookupStrAttribute( const SolvAttr & attr ) const;
-      /** \overload Trying to look up a translated string attribute.
-       *
-       * Returns the translation for \c lang_r.
-       *
-       * Passing an empty \ref Locale will return the string for the
-       * current default locale (\see \ref ZConfig::TextLocale),
-       * \b considering all fallback locales.
-       *
-       * Returns an empty string if no translation is available.
-       */
-      std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const;
-
-      /**
-       * returns the numeric attribute value for \ref attr
-       * or 0 if it does not exists.
-       */
-      unsigned long long lookupNumAttribute( const SolvAttr & attr ) const;
-      /** \overload returning custom notfound_r value */
-      unsigned long long lookupNumAttribute( const SolvAttr & attr, unsigned long long notfound_r ) const;
-
-      /**
-       * returns the boolean attribute value for \ref attr
-       * or \c false if it does not exists.
-       */
-      bool lookupBoolAttribute( const SolvAttr & attr ) const;
-
-      /**
-       * returns the id attribute value for \ref attr
-       * or \ref detail::noId if it does not exists.
-       */
-      detail::IdType lookupIdAttribute( const SolvAttr & attr ) const;
-
-      /**
-       * returns the CheckSum attribute value for \ref attr
-       * or an empty CheckSum if ir does not exist.
-       */
-      CheckSum lookupCheckSumAttribute( const SolvAttr & attr ) const;
-
-      /**
-       * returns OnMediaLocation data: This is everything we need to
-       * download e.g. an rpm (path, checksum, downloadsize, etc.).
-       */
-      OnMediaLocation lookupLocation() const;
-      //@}
-
-    public:
-      /** Return next Solvable in \ref Pool (or \ref noSolvable). */
-      Solvable nextInPool() const;
-      /** Return next Solvable in \ref Repo (or \ref noSolvable). */
-      Solvable nextInRepo() const;
-      /** Expert backdoor. */
-      detail::CSolvable * get() const;
-      /** Expert backdoor. */
-      IdType id() const { return _id; }
-
-    private:
-      IdType _id;
+      public:
+
+        /** \name Attribute lookup.
+         * \see \ref LookupAttr and  \ref ArrayAttr providing a general, more
+         * query like interface for attribute retrieval.
+        */
+        //@{
+        /**
+         * returns the string attribute value for \ref attr
+         * or an empty string if it does not exists.
+         */
+        std::string lookupStrAttribute( const SolvAttr & attr ) const;
+        /** \overload Trying to look up a translated string attribute.
+         *
+         * Returns the translation for \c lang_r.
+         *
+         * Passing an empty \ref Locale will return the string for the
+         * current default locale (\see \ref ZConfig::TextLocale),
+         * \b considering all fallback locales.
+         *
+         * Returns an empty string if no translation is available.
+        */
+        std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const;
+
+        /**
+         * returns the numeric attribute value for \ref attr
+         * or 0 if it does not exists.
+         */
+        unsigned long long lookupNumAttribute( const SolvAttr & attr ) const;
+
+        /**
+         * returns the boolean attribute value for \ref attr
+         * or \c false if it does not exists.
+         */
+        bool lookupBoolAttribute( const SolvAttr & attr ) const;
+
+       /**
+         * returns the id attribute value for \ref attr
+         * or \ref detail::noId if it does not exists.
+         */
+        detail::IdType lookupIdAttribute( const SolvAttr & attr ) const;
+
+       /**
+         * returns the CheckSum attribute value for \ref attr
+         * or an empty CheckSum if ir does not exist.
+         */
+        CheckSum lookupCheckSumAttribute( const SolvAttr & attr ) const;
+
+        /**
+         * returns OnMediaLocation data: This is everything we need to
+         * download e.g. an rpm (path, checksum, downloadsize, etc.).
+         */
+        OnMediaLocation lookupLocation() const;
+
+        //@}
+      public:
+        /** The identifier.
+         * This is the solvables \ref name, \b except for packages and
+         * source packes, prefixed by it's \ref kind.
+         */
+        IdString     ident()    const;
+
+        ResKind      kind()     const;
+        /** Test whether a Solvable is of a certain \ref ResKind.
+        * The test is far cheaper than actually retriveing and
+         * comparing the \ref kind.
+        */
+        bool isKind( const ResKind & kind_r ) const;
+        /** \overload */
+        template<class _Res>
+        bool isKind() const
+        { return isKind( resKind<_Res>() ); }
+        /** \overload Extend the test to a range of \ref ResKind. */
+        template<class _Iterator>
+        bool isKind( _Iterator begin, _Iterator end )
+        { for_( it, begin, end ) if ( isKind( *it ) ) return true; return false; }
+
+        std::string  name()     const;
+        Edition      edition()  const;
+        Arch         arch()     const;
+
+        IdString     vendor()   const;
+
+        /** Whether different versions of this package can be installed at the same time.
+         * Per default \c false. \see also \ref ZConfig::multiversion.
+         */
+        bool         multiversionInstall() const;
+
+        /** String representation <tt>"ident-edition.arch"</tt> or \c "noSolvable"
+         * \code
+         *   product:openSUSE-11.1.x86_64
+         *   autoyast2-2.16.19-0.1.src
+         *   noSolvable
+         * \endcode
+        */
+        std::string asString() const;
+
+       /** String representation <tt>"ident-edition.arch(repo)"</tt> or \c "noSolvable" */
+        std::string asUserString() const;
+
+        /** Test whether two Solvables have the same content.
+         * Basically the same name, edition, arch, vendor and buildtime.
+         */
+        bool identical( Solvable rhs ) const;
+
+        /** Test for same name-version-release.arch */
+        bool sameNVRA( Solvable rhs ) const
+        { return( ident() == rhs.ident() && edition() == rhs.edition() && arch() == rhs.arch() ); }
+
+     public:
+
+        /** \name Access to the \ref Solvable dependencies.
+         *
+         * \note Prerequires are a subset of requires.
+         */
+        //@{
+        Capabilities operator[]( Dep which_r ) const;
+
+        Capabilities provides()    const;
+        Capabilities requires()    const;
+        Capabilities conflicts()   const;
+        Capabilities obsoletes()   const;
+        Capabilities recommends()  const;
+        Capabilities suggests()    const;
+        Capabilities enhances()    const;
+        Capabilities supplements() const;
+        Capabilities prerequires() const;
+
+        /** Return the namespaced provides <tt>'namespace([value])[ op edition]'</tt> of this Solvable. */
+        CapabilitySet providesNamespace( const std::string & namespace_r ) const;
+
+        /** Return <tt>'value[ op edition]'</tt> for namespaced provides <tt>'namespace(value)[ op edition]'</tt>.
+         * Similar to \ref providesNamespace, but the namespace is stripped from the
+         * dependencies. This is convenient if the namespace denotes packages that
+         * should be looked up. E.g. the \c weakremover namespace used in a products
+         * release package denotes the packages that were dropped from the distribution.
+         * \see \ref Product::droplist
+         */
+        CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const;
+        //@}
+
+      public:
+        /** \name Locale support. */
+        //@{
+        /** Whether this \c Solvable claims to support locales. */
+        bool supportsLocales() const;
+        /** Whether this \c Solvable supports a specific \ref Locale. */
+        bool supportsLocale( const Locale & locale_r ) const;
+        /** Whether this \c Solvable supports at least one of the specified locales. */
+        bool supportsLocale( const LocaleSet & locales_r ) const;
+        /** Whether this \c Solvable supports at least one requested locale.
+         * \see \ref Pool::setRequestedLocales
+        */
+        bool supportsRequestedLocales() const;
+        /** Return the supported locales via locales_r. */
+        void getSupportedLocales( LocaleSet & locales_r ) const;
+        /** \overload */
+        LocaleSet getSupportedLocales() const
+        { LocaleSet ret; getSupportedLocales( ret ); return ret; }
+        //@}
+
+      public:
+        /** Return next Solvable in \ref Pool (or \ref noSolvable). */
+        Solvable nextInPool() const;
+        /** Return next Solvable in \ref Repo (or \ref noSolvable). */
+        Solvable nextInRepo() const;
+
+        /** Helper that splits an identifier into kind and name or vice versa.
+        * \note In case \c name_r is preceded by a well known kind spec, the
+        * \c kind_r argument is ignored, and kind is derived from name.
+         * \see \ref ident
+         */
+        class SplitIdent
+        {
+          public:
+            SplitIdent() {}
+            SplitIdent( IdString ident_r );
+            SplitIdent( const char * ident_r );
+            SplitIdent( const std::string & ident_r );
+            SplitIdent( ResKind kind_r, IdString name_r );
+            SplitIdent( ResKind kind_r, const C_Str & name_r );
+
+            IdString ident() const { return _ident; }
+            ResKind  kind()  const { return _kind; }
+            IdString name()  const { return _name; }
+
+          private:
+            IdString  _ident;
+            ResKind   _kind;
+            IdString  _name;
+        };
+
+      public:
+        /** Expert backdoor. */
+        ::_Solvable * get() const;
+        /** Expert backdoor. */
+        IdType id() const { return _id; }
+
+      private:
+        IdType _id;
     };
     ///////////////////////////////////////////////////////////////////
 
@@ -401,17 +313,12 @@ namespace zypp
     inline bool operator<( const Solvable & lhs, const Solvable & rhs )
     { return lhs.get() < rhs.get(); }
 
-    /** \relates Solvable Test whether a \ref Solvable is of a certain Kind. */
-    template<class TRes>
-    inline bool isKind( const Solvable & solvable_r )
-    { return solvable_r.isKind( ResTraits<TRes>::kind ); }
-
     /** \relates Solvable Test for same content. */
-    inline bool identical( const Solvable & lhs, const Solvable & rhs )
+    inline bool identical( Solvable lhs, Solvable rhs )
     { return lhs.identical( rhs ); }
 
     /** \relates Solvable Test for same name version release and arch. */
-    inline bool sameNVRA( const Solvable & lhs, const Solvable & rhs )
+    inline bool sameNVRA( Solvable lhs, Solvable rhs )
     { return lhs.sameNVRA( rhs ); }
 
 
@@ -421,8 +328,8 @@ namespace zypp
       int res = 0;
       if ( lhs != rhs )
       {
-       if ( (res = lhs.kind().compare( rhs.kind() )) == 0 )
-         res = lhs.name().compare( rhs.name() );
+       if ( (res = lhs.kind().compare( rhs.kind() )) == 0 )
+         res = lhs.name().compare( rhs.name() );
       }
       return res;
     }
@@ -432,7 +339,7 @@ namespace zypp
     {
       int res = compareByN( lhs, rhs );
       if ( res == 0 )
-       res = lhs.edition().compare( rhs.edition() );
+       res = lhs.edition().compare( rhs.edition() );
       return res;
     }
 
@@ -441,13 +348,13 @@ namespace zypp
     {
       int res = compareByNVR( lhs, rhs );
       if ( res == 0 )
-       res = lhs.arch().compare( rhs.arch() );
+       res = lhs.arch().compare( rhs.arch() );
       return res;
     }
 
     ///////////////////////////////////////////////////////////////////
     namespace detail
-    {
+    { /////////////////////////////////////////////////////////////////
       ///////////////////////////////////////////////////////////////////
       //
       //       CLASS NAME : SolvableIterator
@@ -455,7 +362,7 @@ namespace zypp
       /** */
       class SolvableIterator : public boost::iterator_adaptor<
           SolvableIterator                   // Derived
-          , CSolvable*                       // Base
+          , ::_Solvable*                     // Base
           , const Solvable                   // Value
           , boost::forward_traversal_tag     // CategoryOrTraversal
           , const Solvable                   // Reference
@@ -489,15 +396,24 @@ namespace zypp
 
           Solvable _val;
       };
+      ///////////////////////////////////////////////////////////////////
+      /////////////////////////////////////////////////////////////////
     } // namespace detail
     ///////////////////////////////////////////////////////////////////
+
+    /////////////////////////////////////////////////////////////////
   } // namespace sat
   ///////////////////////////////////////////////////////////////////
 
+  /** \relates sat::Solvable Test whether a \ref sat::Solvable is of a certain Kind. */
+  template<class _Res>
+  inline bool isKind( const sat::Solvable & solvable_r )
+  { return solvable_r.isKind( ResTraits<_Res>::kind ); }
+
   class PoolItem;
   ///////////////////////////////////////////////////////////////////
   namespace sat
-  {
+  { /////////////////////////////////////////////////////////////////
     /** To Solvable transform functor.
      * \relates Solvable
      * \relates sat::SolvIterMixin
@@ -506,15 +422,18 @@ namespace zypp
     {
       typedef Solvable result_type;
 
-      Solvable operator()( const Solvable & solv_r ) const
+      Solvable operator()( Solvable solv_r ) const
       { return solv_r; }
 
       Solvable operator()( const PoolItem & pi_r ) const;
 
       Solvable operator()( const ResObject_constPtr & res_r ) const;
     };
+    /////////////////////////////////////////////////////////////////
   } // namespace sat
   ///////////////////////////////////////////////////////////////////
+
+  /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////