libzypp  11.13.5
Transaction.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
11 extern "C"
12 {
13  struct _Transaction;
14 }
15 #ifndef ZYPP_SAT_TRANSACTION_H
16 #define ZYPP_SAT_TRANSACTION_H
17 
18 #include <iosfwd>
19 
20 #include "zypp/base/PtrTypes.h"
21 #include "zypp/base/Flags.h"
22 #include "zypp/base/SafeBool.h"
23 #include "zypp/base/Iterator.h"
25 
26 #include "zypp/sat/SolvIterMixin.h"
27 #include "zypp/sat/Solvable.h"
28 
29 #include "zypp/PoolItem.h"
30 
32 namespace zypp
33 {
34 
35  namespace sat
36  {
37 
38  namespace detail
39  {
41  class Transaction_iterator;
43  class Transaction_const_iterator;
44  }
45 
55  class Transaction : public SolvIterMixin<Transaction, detail::Transaction_const_iterator>
56  , protected base::SafeBool<Transaction>
57  {
58  friend std::ostream & operator<<( std::ostream & str, const Transaction & obj );
59  friend std::ostream & dumpOn( std::ostream & str, const Transaction & obj );
60  friend bool operator==( const Transaction & lhs, const Transaction & rhs );
61 
62  public:
64  class Step;
65 
67  enum StepType
68  {
73  };
74 
76  enum StepStage
77  {
78  STEP_TODO = (1 << 0),
79  STEP_DONE = (1 << 1),
80  STEP_ERROR = (1 << 2),
81  };
82 
83  ZYPP_DECLARE_FLAGS(StepStages,StepStage);
84 
85  public:
86  struct Default {};
87 
88  public:
90  Transaction();
91 
94 
96  ~Transaction();
97 
98  public:
100  bool valid() const;
101 
104 
110  bool order();
111 
113  bool empty() const;
114 
116  size_t size() const;
117 
120 
122  const_iterator begin() const;
124  iterator begin();
125 
127  const_iterator end() const;
129  iterator end();
130 
132  const_iterator find( const sat::Solvable & solv_r ) const;
133  iterator find( const sat::Solvable & solv_r );
135  const_iterator find( const ResObject::constPtr & resolvable_r ) const;
136  iterator find( const ResObject::constPtr & resolvable_r );
138  const_iterator find( const PoolItem & pi_r ) const;
139  iterator find( const PoolItem & pi_r );
140 
141  public:
156  struct FilterAction;
157  typedef filter_iterator<FilterAction,const_iterator> action_iterator;
158 
160  bool actionEmpty( StepStages filter_r = StepStages() ) const;
161 
163  size_t actionSize( StepStages filter_r = StepStages() ) const;
164 
166  action_iterator actionBegin( StepStages filter_r = StepStages() ) const;
167 
169  action_iterator actionEnd() const;
170 
172 
173  private:
176  bool boolTest() const
177  { return valid(); }
178  public:
180  class Impl;
181  private:
184  };
185 
186  ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Transaction::StepStages);
187 
189  std::ostream & operator<<( std::ostream & str, const Transaction & obj );
190 
192  std::ostream & dumpOn( std::ostream & str, const Transaction & obj );
193 
195  bool operator==( const Transaction & lhs, const Transaction & rhs );
196 
198  inline bool operator!=( const Transaction & lhs, const Transaction & rhs )
199  { return !( lhs == rhs ); }
200 
201 
213  {
214  friend std::ostream & operator<<( std::ostream & str, const Step & obj );
215 
216  public:
217  Step();
218  Step( const RW_pointer<Impl> & pimpl_r, detail::IdType id_r )
219  : _solv( id_r )
220  , _pimpl( pimpl_r )
221  {}
222 
223  public:
225  StepType stepType() const;
226 
228  StepStage stepStage() const;
229 
231  void stepStage( StepStage val_r );
232 
237  Solvable satSolvable() const
238  { return _solv; }
239 
251  IdString ident() const;
252 
254  Edition edition() const;
255 
257  Arch arch() const;
259 
261  operator const Solvable &() const { return _solv; }
263  operator Solvable &() { return _solv; }
264 
265  private:
269  };
270 
272  std::ostream & operator<<( std::ostream & str, const Transaction::Step & obj );
273 
275  std::ostream & operator<<( std::ostream & str, Transaction::StepType obj );
276 
278  std::ostream & operator<<( std::ostream & str, Transaction::StepStage obj );
279 
281  namespace detail
282  {
283 
286  class Transaction_iterator : public boost::iterator_adaptor<
287  Transaction_iterator // Derived
288  , const detail::IdType * // Base
289  , Transaction::Step // Value
290  , boost::forward_traversal_tag // CategoryOrTraversal
291  , Transaction::Step // Reference
292  >
293  {
294  public:
296  Transaction_iterator( const RW_pointer<Transaction::Impl> & pimpl_r, base_type id_r )
297  : Transaction_iterator::iterator_adaptor_( id_r )
298  , _pimpl( pimpl_r )
299  {}
300 
301  private:
302  friend class boost::iterator_core_access;
303 
304  reference dereference() const
305  { return Transaction::Step( _pimpl, *base() ); }
306 
307  private:
311  };
312 
315  class Transaction_const_iterator : public boost::iterator_adaptor<
316  Transaction_const_iterator // Derived
317  , const detail::IdType * // Base
318  , const Transaction::Step // Value
319  , boost::forward_traversal_tag // CategoryOrTraversal
320  , const Transaction::Step // Reference
321  >
322  {
323  public:
327  : Transaction_const_iterator::iterator_adaptor_( id_r )
328  , _pimpl( pimpl_r )
329  {}
330 
331  private:
332  friend class boost::iterator_core_access;
333 
334  reference dereference() const
335  { return Transaction::Step( _pimpl, *base() ); }
336 
337  private:
340  };
341 
343  } // namespace detail
345 
347  { return( resolvable_r ? find( resolvable_r->satSolvable() ) : end() ); }
348 
350  { return( resolvable_r ? find( resolvable_r->satSolvable() ) : end() ); }
351 
353  { return find( pi_r.satSolvable() ); }
354 
356  { return find( pi_r.satSolvable() ); }
357 
358 
360  {
362  FilterAction( StepStages filter_r ) : _filter( filter_r ) {}
363 
364  bool operator()( const Transaction::Step & step_r ) const
365  {
366  if ( step_r.stepType() == Transaction::TRANSACTION_IGNORE )
367  return false; // no action
368  return !_filter || _filter.testFlag( step_r.stepStage() );
369  }
370 
371  StepStages _filter;
372  };
373 
374  inline Transaction::action_iterator Transaction::actionBegin( StepStages filter_r ) const
375  { return make_filter_begin( FilterAction( filter_r ), *this ); }
376 
378  { return make_filter_end( FilterAction(), *this ); }
379 
380  inline bool Transaction::actionEmpty( StepStages filter_r ) const
381  { return( actionBegin( filter_r ) == actionEnd() ); }
382 
383  inline size_t Transaction::actionSize( StepStages filter_r ) const
384  {
385  size_t cnt = 0;
386  for_( it, actionBegin( filter_r ), actionEnd() )
387  ++cnt;
388  return cnt;
389  }
390 
392  } // namespace sat
395 } // namespace zypp
397 #endif // ZYPP_SAT_TRANSACTION_H