Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / ResTraits.h
index 01a4f98..33097a4 100644 (file)
 #define ZYPP_RESTRAITS_H
 
 #include "zypp/base/PtrTypes.h"
-#include "zypp/base/KindOf.h"
+#include "zypp/ResKind.h"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
 
-  class Resolvable;
-  class ResObject;
-
-  class Package;
-  class Selection;
-  class Product;
-  class Patch;
-  class Script;
-  class Message;
-
-  /** Base of ResTraits. Defines the Resolvable::Kind type. */
-  struct ResolvableTraits
-  {
-    typedef KindOf<Resolvable>  KindType;
-  };
-
-  /** ResTraits. Defines common types and the Kind value. */
-  template<typename _Res>
-    struct ResTraits : public ResolvableTraits
+  ///////////////////////////////////////////////////////////////////
+  namespace traits
+  { /////////////////////////////////////////////////////////////////
+
+    /** Those are denoted to be installed, if the
+     *  solver verifies them as being satisfied. */
+    inline bool isPseudoInstalled( ResKind kind_r )
+    { return( kind_r == ResKind::patch ); }
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace traits
+  ///////////////////////////////////////////////////////////////////
+
+   /** \defgroup ZYPP_RESOLVABLE_SMART_POINTER_TYPES
+   * Resolvable smart pointer types.
+   *
+   * Forward declaration of all Resolvable smart pointer
+   * types provided in \c ResTraits.h (recommended in header files):
+   * \code
+   * #include "zypp/ResTraits.h"
+   *
+   * Resolvable_Ptr                      // Resolvable *
+   * ResTraits<Resolvable>::PtrType      // same as above
+   *
+   * Resolvable_constPtr                 // const Resolvable *
+   * ResTraits<Resolvable>::constPtrType // same as above
+   * \endcode
+   *
+   * Synonym, but requires \c Resolvable.h being included:
+   * \code
+   * #include "zypp/Resolvable.h"
+   *
+   * Resolvable::Ptr        // same as Resolvable_Ptr but requires Resolvable.h
+   * Resolvable::constPtr   // same as Resolvable_constPtr but requires Resolvable.h
+   * \endcode
+   *
+   * \note When adding a \c NewResolvable type here, dont forgett to
+   * put <tt>IMPL_PTR_TYPE(NewResolvable);</tt> into the \c NewResolvable.cc.
+   * Also check class \ref ResKind, ResKind.cc, ResObject.cc(makeResObject)
+   */
+  //@{
+  DEFINE_PTR_TYPE( Resolvable );
+  DEFINE_PTR_TYPE( ResObject );
+
+  DEFINE_PTR_TYPE( Package );
+  DEFINE_PTR_TYPE( SrcPackage );
+  DEFINE_PTR_TYPE( Pattern );
+  DEFINE_PTR_TYPE( Product );
+  DEFINE_PTR_TYPE( Patch );
+  DEFINE_PTR_TYPE( Application );
+  //@}
+
+  /** Frequently associated. */
+  class PoolItem;
+
+  /** ResTraits. Defines common types and the ResKind value. */
+  template<typename TRes>
+    struct ResTraits
     {
-      typedef intrusive_ptr<_Res>       PtrType;
-      typedef intrusive_ptr<const _Res> constPtrType;
+      typedef ResKind                   KindType;
+      typedef intrusive_ptr<TRes>       PtrType;
+      typedef intrusive_ptr<const TRes> constPtrType;
 
-      static const KindType kind;
+      static const ResKind              kind;  ///< Defined in ResKind.cc
+
+      /** Those are denoted to be installed, if the
+       *  solver verifies them as being satisfied. */
+      static bool isPseudoInstalled()   { return traits::isPseudoInstalled( kind ); }
     };
 
   /** ResTraits specialisation for Resolvable.
    * Resolvable is common base and has no Kind value.
-  */
+   */
   template<>
-    struct ResTraits<Resolvable> : public ResolvableTraits
+    struct ResTraits<Resolvable>
     {
+      typedef ResKind                         KindType;
       typedef intrusive_ptr<Resolvable>       PtrType;
       typedef intrusive_ptr<const Resolvable> constPtrType;
     };
 
   /** ResTraits specialisation for ResObject.
    * ResObject is common base and has no Kind value.
-  */
+   */
   template<>
-    struct ResTraits<ResObject> : public ResolvableTraits
+    struct ResTraits<ResObject>
     {
-      typedef intrusive_ptr<Resolvable>       PtrType;
-      typedef intrusive_ptr<const Resolvable> constPtrType;
+      typedef ResKind                        KindType;
+      typedef intrusive_ptr<ResObject>       PtrType;
+      typedef intrusive_ptr<const ResObject> constPtrType;
     };
 
+  /** Convenient access to well known ResKinds.
+   * \code
+   * ResKind packagekind = ResKind::package;
+   * ResKind packagekind = resKind<Package>();
+   * \endcode
+  */
+  template<typename TRes>
+    inline ResKind resKind() { return ResTraits<TRes>::kind; }
+
+  /** Convenient test for ResKinds.
+   * \code
+   * ResKind value;
+   * if ( ResKind::package == value )
+   * if ( resKind<Package>() == value )
+   * if ( isKind<Package>( value ) )
+   * \endcode
+   */
+  template<typename TRes>
+    inline bool isKind( const ResKind & val_r )
+    { return( resKind<TRes>() == val_r ); }
+  /** \overload */
+  template<typename TRes>
+    inline bool isKind( const std::string & val_r )
+    { return( resKind<TRes>() == val_r ); }
+  /** \overload */
+  template<typename TRes>
+    inline bool isKind( const char * val_r )
+    { return( resKind<TRes>() == val_r ); }
+
+
   /////////////////////////////////////////////////////////////////
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////