- Added helper struct NVR (name,edition(version,relase))
[platform/upstream/libzypp.git] / zypp / Resolvable.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/Resolvable.h
10  *
11 */
12 #ifndef ZYPP_RESOLVABLE_H
13 #define ZYPP_RESOLVABLE_H
14
15 #include <iosfwd>
16 #include <string>
17
18 #include "zypp/base/ReferenceCounted.h"
19 #include "zypp/base/NonCopyable.h"
20 #include "zypp/base/PtrTypes.h"
21 #include "zypp/ResTraits.h"
22
23 #include "zypp/Edition.h"
24 #include "zypp/Arch.h"
25 #include "zypp/CapSetFwd.h"
26 #include "zypp/Dependencies.h"
27
28 ///////////////////////////////////////////////////////////////////
29 namespace zypp
30 { /////////////////////////////////////////////////////////////////
31
32   struct NVRAD;
33
34   ///////////////////////////////////////////////////////////////////
35   //
36   //    CLASS NAME : Resolvable
37   //
38   /** Interface base for resolvable objects (identification and dependencies).
39   */
40   class Resolvable : public base::ReferenceCounted, private base::NonCopyable
41   {
42   public:
43     typedef Resolvable               Self;
44     typedef ResTraits<Self>          TraitsType;
45     typedef TraitsType::KindType     Kind;
46     typedef TraitsType::PtrType      Ptr;
47     typedef TraitsType::constPtrType constPtr;
48
49   public:
50     /**  */
51     const Kind & kind() const;
52     /**  */
53     const std::string & name() const;
54     /**  */
55     const Edition & edition() const;
56     /**  */
57     const Arch & arch() const;
58
59     /** \name Dependencies. */
60     //@{
61     const CapSet & provides() const;
62     const CapSet & prerequires() const;
63     const CapSet & requires() const;
64     const CapSet & conflicts() const;
65     const CapSet & obsoletes() const;
66     const CapSet & recommends() const;
67     const CapSet & suggests() const;
68     const CapSet & freshens() const;
69     //@}
70
71     /**  */
72     const Dependencies & deps() const;
73     /** */
74     void setDeps( const Dependencies & val_r );
75
76   protected:
77     /** Ctor */
78     Resolvable( const Kind & kind_r,
79                 const NVRAD & nvrad_r );
80     /** Dtor */
81     virtual ~Resolvable();
82     /** Helper for stream output */
83     virtual std::ostream & dumpOn( std::ostream & str ) const;
84
85   private:
86     /** Implementation */
87     struct Impl;
88     /** Pointer to implementation */
89     RW_pointer<Impl> _pimpl;
90   };
91   ///////////////////////////////////////////////////////////////////
92
93   /** Test whether a Resolvable::Ptr is of a certain Kind.
94    * \return \c Ture iff \a p is not \c NULL and points to a Resolvable
95    * of the specified Kind.
96    * \relates Resolvable
97    * \code
98    * isKind<Package>(resPtr);
99    * \endcode
100   */
101   template<class _Res>
102     inline bool isKind( const Resolvable::constPtr & p )
103     { return p && p->kind() == ResTraits<_Res>::kind; }
104
105   // Specialization for Resolvable: Always true.
106   template<>
107     inline bool isKind<Resolvable>( const Resolvable::constPtr & p )
108     { return p; }
109
110   // Specialization for ResObject: Always true.
111   template<>
112     inline bool isKind<ResObject>( const Resolvable::constPtr & p )
113     { return p; }
114
115
116   /** Convert Resolvable::Ptr into Ptr of a certain Kind.
117    * \return \c NULL iff \a p is \c NULL or points to a Resolvable
118    * not of the specified Kind.
119    * \relates Resolvable
120    * \code
121    * asKind<Package>(resPtr);
122    * \endcode
123   */
124   template<class _Res>
125     inline typename ResTraits<_Res>::PtrType asKind( const Resolvable::Ptr & p )
126     { return dynamic_pointer_cast<_Res>(p); }
127
128   template<class _Res>
129     inline typename ResTraits<_Res>::constPtrType asKind( const Resolvable::constPtr & p )
130     { return dynamic_pointer_cast<const _Res>(p); }
131
132   /////////////////////////////////////////////////////////////////
133 } // namespace zypp
134 ///////////////////////////////////////////////////////////////////
135 #endif // ZYPP_RESOLVABLE_H