1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/Resolvable.h
12 #ifndef ZYPP_RESOLVABLE_H
13 #define ZYPP_RESOLVABLE_H
18 #include "zypp/base/ReferenceCounted.h"
19 #include "zypp/base/NonCopyable.h"
20 #include "zypp/base/PtrTypes.h"
21 #include "zypp/ResTraits.h"
23 #include "zypp/Edition.h"
24 #include "zypp/Arch.h"
25 #include "zypp/CapSetFwd.h"
27 ///////////////////////////////////////////////////////////////////
29 { /////////////////////////////////////////////////////////////////
34 ///////////////////////////////////////////////////////////////////
36 // CLASS NAME : Resolvable
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
42 class Resolvable : public base::ReferenceCounted, private base::NonCopyable
45 typedef Resolvable Self;
46 typedef ResTraits<Self> TraitsType;
47 typedef TraitsType::KindType Kind;
48 typedef TraitsType::PtrType Ptr;
49 typedef TraitsType::constPtrType constPtr;
53 const Kind & kind() const;
55 const std::string & name() const;
57 const Edition & edition() const;
59 const Arch & arch() const;
61 /** \name Dependencies. */
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;
75 /** \name Deprecated. */
77 void deprecatedSetDeps( const Dependencies & val_r );
78 void injectProvides( const Capability & cap_r );
79 void injectRequires( const Capability & cap_r );
84 Resolvable( const Kind & kind_r,
85 const NVRAD & nvrad_r );
87 virtual ~Resolvable();
88 /** Helper for stream output */
89 virtual std::ostream & dumpOn( std::ostream & str ) const;
94 /** Pointer to implementation */
95 RW_pointer<Impl> _pimpl;
97 ///////////////////////////////////////////////////////////////////
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
104 * isKind<Package>(resPtr);
108 inline bool isKind( const Resolvable::constPtr & p )
109 { return p && p->kind() == ResTraits<_Res>::kind; }
111 // Specialization for Resolvable: Always true.
113 inline bool isKind<Resolvable>( const Resolvable::constPtr & p )
116 // Specialization for ResObject: Always true.
118 inline bool isKind<ResObject>( const Resolvable::constPtr & p )
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
127 * asKind<Package>(resPtr);
131 inline typename ResTraits<_Res>::PtrType asKind( const Resolvable::Ptr & p )
132 { return dynamic_pointer_cast<_Res>(p); }
135 inline typename ResTraits<_Res>::constPtrType asKind( const Resolvable::constPtr & p )
136 { return dynamic_pointer_cast<const _Res>(p); }
138 /////////////////////////////////////////////////////////////////
140 ///////////////////////////////////////////////////////////////////
141 #endif // ZYPP_RESOLVABLE_H