- Assert Resolvable provides its 'name=edition', and prerequires
[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
27 ///////////////////////////////////////////////////////////////////
28 namespace zypp
29 { /////////////////////////////////////////////////////////////////
30
31   struct NVRAD;
32   class Dependencies;
33
34   ///////////////////////////////////////////////////////////////////
35   //
36   //    CLASS NAME : Resolvable
37   //
38   /** Interface base for resolvable objects (identification and dependencies).
39    * \invariant \c provides <tt>name = edition</tt>
40    * \invariant \c prerequires is a subset of \c requires
41   */
42   class Resolvable : public base::ReferenceCounted, private base::NonCopyable
43   {
44   public:
45     typedef Resolvable               Self;
46     typedef ResTraits<Self>          TraitsType;
47     typedef TraitsType::KindType     Kind;
48     typedef TraitsType::PtrType      Ptr;
49     typedef TraitsType::constPtrType constPtr;
50
51   public:
52     /**  */
53     const Kind & kind() const;
54     /**  */
55     const std::string & name() const;
56     /**  */
57     const Edition & edition() const;
58     /**  */
59     const Arch & arch() const;
60
61     /** \name Dependencies. */
62     //@{
63     const CapSet & provides() const;
64     const CapSet & prerequires() const;
65     const CapSet & requires() const;
66     const CapSet & conflicts() const;
67     const CapSet & obsoletes() const;
68     const CapSet & recommends() const;
69     const CapSet & suggests() const;
70     const CapSet & freshens() const;
71     /** All dependencies. */
72     const Dependencies & deps() const;
73     //@}
74
75     /** \name Deprecated. */
76     //@{
77     void deprecatedSetDeps( const Dependencies & val_r );
78     void injectProvides( const Capability & cap_r );
79     void injectRequires( const Capability & cap_r );
80     //@}
81
82   protected:
83     /** Ctor */
84     Resolvable( const Kind & kind_r,
85                 const NVRAD & nvrad_r );
86     /** Dtor */
87     virtual ~Resolvable();
88     /** Helper for stream output */
89     virtual std::ostream & dumpOn( std::ostream & str ) const;
90
91   private:
92     /** Implementation */
93     struct Impl;
94     /** Pointer to implementation */
95     RW_pointer<Impl> _pimpl;
96   };
97   ///////////////////////////////////////////////////////////////////
98
99   /** Test whether a Resolvable::Ptr is of a certain Kind.
100    * \return \c Ture iff \a p is not \c NULL and points to a Resolvable
101    * of the specified Kind.
102    * \relates Resolvable
103    * \code
104    * isKind<Package>(resPtr);
105    * \endcode
106   */
107   template<class _Res>
108     inline bool isKind( const Resolvable::constPtr & p )
109     { return p && p->kind() == ResTraits<_Res>::kind; }
110
111   // Specialization for Resolvable: Always true.
112   template<>
113     inline bool isKind<Resolvable>( const Resolvable::constPtr & p )
114     { return p; }
115
116   // Specialization for ResObject: Always true.
117   template<>
118     inline bool isKind<ResObject>( const Resolvable::constPtr & p )
119     { return p; }
120
121
122   /** Convert Resolvable::Ptr into Ptr of a certain Kind.
123    * \return \c NULL iff \a p is \c NULL or points to a Resolvable
124    * not of the specified Kind.
125    * \relates Resolvable
126    * \code
127    * asKind<Package>(resPtr);
128    * \endcode
129   */
130   template<class _Res>
131     inline typename ResTraits<_Res>::PtrType asKind( const Resolvable::Ptr & p )
132     { return dynamic_pointer_cast<_Res>(p); }
133
134   template<class _Res>
135     inline typename ResTraits<_Res>::constPtrType asKind( const Resolvable::constPtr & p )
136     { return dynamic_pointer_cast<const _Res>(p); }
137
138   /////////////////////////////////////////////////////////////////
139 } // namespace zypp
140 ///////////////////////////////////////////////////////////////////
141 #endif // ZYPP_RESOLVABLE_H