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"
26 #include "zypp/Dependencies.h"
28 ///////////////////////////////////////////////////////////////////
30 { /////////////////////////////////////////////////////////////////
34 ///////////////////////////////////////////////////////////////////
36 // CLASS NAME : Resolvable
38 /** Interface base for resolvable objects (identification and dependencies).
40 class Resolvable : public base::ReferenceCounted, private base::NonCopyable
43 typedef Resolvable Self;
44 typedef ResTraits<Self> TraitsType;
45 typedef TraitsType::KindType Kind;
46 typedef TraitsType::PtrType Ptr;
47 typedef TraitsType::constPtrType constPtr;
51 const Kind & kind() const;
53 const std::string & name() const;
55 const Edition & edition() const;
57 const Arch & arch() const;
59 /** \name Dependencies. */
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;
72 const Dependencies & deps() const;
74 void setDeps( const Dependencies & val_r );
78 Resolvable( const Kind & kind_r,
79 const NVRAD & nvrad_r );
81 virtual ~Resolvable();
82 /** Helper for stream output */
83 virtual std::ostream & dumpOn( std::ostream & str ) const;
88 /** Pointer to implementation */
89 RW_pointer<Impl> _pimpl;
91 ///////////////////////////////////////////////////////////////////
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.
98 * isKind<Package>(resPtr);
102 inline bool isKind( const Resolvable::constPtr & p )
103 { return p && p->kind() == ResTraits<_Res>::kind; }
105 // Specialization for Resolvable: Always true.
107 inline bool isKind<Resolvable>( const Resolvable::constPtr & p )
110 // Specialization for ResObject: Always true.
112 inline bool isKind<ResObject>( const Resolvable::constPtr & p )
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
121 * asKind<Package>(resPtr);
125 inline typename ResTraits<_Res>::PtrType asKind( const Resolvable::Ptr & p )
126 { return dynamic_pointer_cast<_Res>(p); }
129 inline typename ResTraits<_Res>::constPtrType asKind( const Resolvable::constPtr & p )
130 { return dynamic_pointer_cast<const _Res>(p); }
132 /////////////////////////////////////////////////////////////////
134 ///////////////////////////////////////////////////////////////////
135 #endif // ZYPP_RESOLVABLE_H