7abb2afd32f152eea667cbb157c1da08e59faa3e
[platform/upstream/libzypp.git] / zypp / PoolItem.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/PoolItem.h
10  *
11 */
12 #ifndef ZYPP_POOLITEM_H
13 #define ZYPP_POOLITEM_H
14
15 #include <iosfwd>
16 #include <functional>
17
18 #include "zypp/base/PtrTypes.h"
19 #include "zypp/ResObject.h"
20 #include "zypp/ResStatus.h"
21
22 ///////////////////////////////////////////////////////////////////
23 namespace zypp
24 { /////////////////////////////////////////////////////////////////
25
26   class ResPool;
27
28   namespace pool
29   {
30     class PoolImpl;
31   }
32
33   ///////////////////////////////////////////////////////////////////
34   //
35   //    CLASS NAME : PoolItem
36   //
37   /** Reference to a PoolItem connecting ResObject and ResStatus.
38    *
39    * The "real" PoolItem is usg. somewhere in the ResPool. This is
40    * a reference to it. All copies made will reference (and modify)
41    * the same PoolItem. All changes via a PoolItem are immediately
42    * visible in all copies (now COW).
43    *
44    * \note Constness: Like pointer types, a <tt>const PoolItem</tt>
45    * does \b not refer to a <tt>const PoolItem</tt>. The reference is
46    * \c const, i.e. you can't change the refered PoolItem. The PoolItem
47    * (i.e. the status) is always mutable.
48    *
49   */
50   class PoolItem
51   {
52     friend std::ostream & operator<<( std::ostream & str, const PoolItem & obj );
53
54     public:
55       /** Implementation */
56       class Impl;
57
58     public:
59       /** Default ctor for use in std::container. */
60       PoolItem();
61
62       /** Ctor looking up the \ref sat::Solvable in the \ref ResPool. */
63       explicit PoolItem( const sat::Solvable & solvable_r );
64
65       /** Ctor looking up the \ref ResObject in the \ref ResPool. */
66       explicit PoolItem( const ResObject::constPtr & resolvable_r );
67
68       /** Dtor */
69       ~PoolItem();
70
71     public:
72       /** Returns the current status. */
73       ResStatus & status() const;
74
75       /** Reset status. */
76       ResStatus & statusReset() const;
77
78       /** Whether the items requirements are met. */
79       bool isSatisfied() const;
80
81       /** Whether the items requirements are broken. */
82       bool isBroken() const
83       { return ! isSatisfied(); }
84
85       /** Returns true if the solvable is relevant which means e.G. for patches
86        *  that at least one package of the patch is installed.
87        */
88       bool isRelevant() const;
89
90     public:
91       /** Return the \ref ResPool the item belongs to. */
92       ResPool pool() const;
93
94       /** Return the corresponding \ref sat::Solvable. */
95       sat::Solvable satSolvable() const
96       { return resolvable() ? resolvable()->satSolvable() : sat::Solvable::noSolvable; }
97
98     public:
99       /** Returns the ResObject::constPtr.
100        * \see \ref operator->
101        */
102       ResObject::constPtr resolvable() const;
103
104       /** Implicit conversion into ResObject::constPtr to
105        *  support query filters operating on ResObject.
106        */
107       operator ResObject::constPtr() const
108       { return resolvable(); }
109
110       /** Forward \c -> access to ResObject. */
111       ResObject::constPtr operator->() const
112       { return resolvable(); }
113
114       /** Conversion to bool to allow pointer style tests
115        *  for nonNULL \ref resolvable. */
116       operator ResObject::constPtr::unspecified_bool_type() const
117       { return resolvable(); }
118
119     private:
120       friend class pool::PoolImpl;
121       /** \ref PoolItem generator for \ref pool::PoolImpl. */
122       static PoolItem makePoolItem( const sat::Solvable & solvable_r );
123       /** internal ctor */
124       explicit PoolItem( Impl * implptr_r );
125       /** Pointer to implementation */
126       RW_pointer<Impl> _pimpl;
127
128     private:
129       /** \name tmp hack for save/restore state. */
130       /** \todo get rid of it. */
131       //@{
132       friend class PoolItemSaver;
133       void saveState() const;
134       void restoreState() const;
135       bool sameState() const;
136       //@}
137   };
138   ///////////////////////////////////////////////////////////////////
139
140   /** \relates PoolItem Stream output */
141   std::ostream & operator<<( std::ostream & str, const PoolItem & obj );
142
143   /** \relates PoolItem */
144   inline bool operator==( const PoolItem & lhs, const PoolItem & rhs )
145   { return lhs.resolvable() == rhs.resolvable(); }
146
147   /** \relates PoolItem */
148   inline bool operator==( const PoolItem & lhs, const ResObject::constPtr & rhs )
149   { return lhs.resolvable() == rhs; }
150
151   /** \relates PoolItem */
152   inline bool operator==( const ResObject::constPtr & lhs, const PoolItem & rhs )
153   { return lhs == rhs.resolvable(); }
154
155
156   /** \relates PoolItem */
157   inline bool operator!=( const PoolItem & lhs, const PoolItem & rhs )
158   { return ! (lhs==rhs); }
159
160   /** \relates PoolItem */
161   inline bool operator!=( const PoolItem & lhs, const ResObject::constPtr & rhs )
162   { return ! (lhs==rhs); }
163
164   /** \relates PoolItem */
165   inline bool operator!=( const ResObject::constPtr & lhs, const PoolItem & rhs )
166   { return ! (lhs==rhs); }
167
168   /** Solvable to PoolItem transform functor.
169    * \relates PoolItem
170    * \relates sat::SolvIterMixin
171    */
172   struct asPoolItem
173   {
174     typedef PoolItem result_type;
175
176     PoolItem operator()( const sat::Solvable & solv_r ) const
177     { return PoolItem( solv_r ); }
178   };
179
180   /////////////////////////////////////////////////////////////////
181 } // namespace zypp
182 ///////////////////////////////////////////////////////////////////
183 ///////////////////////////////////////////////////////////////////
184 namespace std
185 { /////////////////////////////////////////////////////////////////
186
187   /** \relates zypp::PoolItem Order in std::container follows ResObject::constPtr.*/
188   template<>
189     inline bool less<zypp::PoolItem>::operator()( const zypp::PoolItem & lhs, const zypp::PoolItem & rhs ) const
190     { return lhs.resolvable() < rhs.resolvable(); }
191
192   /////////////////////////////////////////////////////////////////
193 } // namespace zypp
194 ///////////////////////////////////////////////////////////////////
195 #endif // ZYPP_POOLITEM_H