Transaction.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00011 extern "C"
00012 {
00013 struct _Transaction;
00014 }
00015 #ifndef ZYPP_SAT_TRANSACTION_H
00016 #define ZYPP_SAT_TRANSACTION_H
00017
00018 #include <iosfwd>
00019
00020 #include "zypp/base/PtrTypes.h"
00021 #include "zypp/base/Flags.h"
00022 #include "zypp/base/SafeBool.h"
00023 #include "zypp/base/Iterator.h"
00024 #include "zypp/base/DefaultIntegral.h"
00025
00026 #include "zypp/sat/SolvIterMixin.h"
00027 #include "zypp/sat/Solvable.h"
00028
00029 #include "zypp/PoolItem.h"
00030
00032 namespace zypp
00033 {
00034
00035 namespace sat
00036 {
00037
00038 namespace detail
00039 {
00041 class Transaction_iterator;
00043 class Transaction_const_iterator;
00044 }
00045
00055 class Transaction : public SolvIterMixin<Transaction, detail::Transaction_const_iterator>
00056 , protected base::SafeBool<Transaction>
00057 {
00058 friend std::ostream & operator<<( std::ostream & str, const Transaction & obj );
00059 friend std::ostream & dumpOn( std::ostream & str, const Transaction & obj );
00060 friend bool operator==( const Transaction & lhs, const Transaction & rhs );
00061
00062 public:
00064 class Step;
00065
00067 enum StepType
00068 {
00069 TRANSACTION_IGNORE = 0x00,
00070 TRANSACTION_ERASE = 0x10,
00071 TRANSACTION_INSTALL = 0x20,
00072 TRANSACTION_MULTIINSTALL = 0x30
00073 };
00074
00076 enum StepStage
00077 {
00078 STEP_TODO = (1 << 0),
00079 STEP_DONE = (1 << 1),
00080 STEP_ERROR = (1 << 2),
00081 };
00082
00083 ZYPP_DECLARE_FLAGS(StepStages,StepStage);
00084
00085 public:
00087 Transaction();
00088
00090 Transaction( ::_Transaction & trans_r );
00091
00093 ~Transaction();
00094
00095 public:
00097 bool valid() const;
00098
00100 using base::SafeBool<Transaction>::operator bool_type;
00101
00107 bool order();
00108
00110 bool empty() const;
00111
00113 size_t size() const;
00114
00115 typedef detail::Transaction_iterator iterator;
00116 typedef detail::Transaction_const_iterator const_iterator;
00117
00119 const_iterator begin() const;
00121 iterator begin();
00122
00124 const_iterator end() const;
00126 iterator end();
00127
00129 const_iterator find( const sat::Solvable & solv_r ) const;
00130 iterator find( const sat::Solvable & solv_r );
00132 const_iterator find( const ResObject::constPtr & resolvable_r ) const;
00133 iterator find( const ResObject::constPtr & resolvable_r );
00135 const_iterator find( const PoolItem & pi_r ) const;
00136 iterator find( const PoolItem & pi_r );
00137
00138 public:
00153 struct FilterAction;
00154 typedef filter_iterator<FilterAction,const_iterator> action_iterator;
00155
00157 bool actionEmpty( StepStages filter_r = StepStages() ) const;
00158
00160 size_t actionSize( StepStages filter_r = StepStages() ) const;
00161
00163 action_iterator actionBegin( StepStages filter_r = StepStages() ) const;
00164
00166 action_iterator actionEnd() const;
00167
00169
00170 private:
00171 friend base::SafeBool<Transaction>::operator bool_type() const;
00173 bool boolTest() const
00174 { return valid(); }
00175 public:
00177 class Impl;
00178 private:
00180 RW_pointer<Impl> _pimpl;
00181 };
00182
00183 ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Transaction::StepStages);
00184
00186 std::ostream & operator<<( std::ostream & str, const Transaction & obj );
00187
00189 std::ostream & dumpOn( std::ostream & str, const Transaction & obj );
00190
00192 bool operator==( const Transaction & lhs, const Transaction & rhs );
00193
00195 inline bool operator!=( const Transaction & lhs, const Transaction & rhs )
00196 { return !( lhs == rhs ); }
00197
00198
00209 class Transaction::Step
00210 {
00211 friend std::ostream & operator<<( std::ostream & str, const Step & obj );
00212
00213 public:
00214 Step();
00215 Step( const RW_pointer<Impl> & pimpl_r, detail::IdType id_r )
00216 : _solv( id_r )
00217 , _pimpl( pimpl_r )
00218 {}
00219
00220 public:
00222 StepType stepType() const;
00223
00225 StepStage stepStage() const;
00226
00228 void stepStage( StepStage val_r );
00229
00234 Solvable satSolvable() const
00235 { return _solv; }
00236
00248 IdString ident() const;
00249
00251 Edition edition() const;
00252
00254 Arch arch() const;
00256
00258 operator const Solvable &() const { return _solv; }
00260 operator Solvable &() { return _solv; }
00261
00262 private:
00263 Solvable _solv;
00265 RW_pointer<Impl> _pimpl;
00266 };
00267
00269 std::ostream & operator<<( std::ostream & str, const Transaction::Step & obj );
00270
00272 std::ostream & operator<<( std::ostream & str, Transaction::StepType obj );
00273
00275 std::ostream & operator<<( std::ostream & str, Transaction::StepStage obj );
00276
00278 namespace detail
00279 {
00280
00283 class Transaction_iterator : public boost::iterator_adaptor<
00284 Transaction_iterator
00285 , const detail::IdType *
00286 , Transaction::Step
00287 , boost::forward_traversal_tag
00288 , Transaction::Step
00289 >
00290 {
00291 public:
00292 Transaction_iterator();
00293 Transaction_iterator( const RW_pointer<Transaction::Impl> & pimpl_r, base_type id_r )
00294 : Transaction_iterator::iterator_adaptor_( id_r )
00295 , _pimpl( pimpl_r )
00296 {}
00297
00298 private:
00299 friend class boost::iterator_core_access;
00300
00301 reference dereference() const
00302 { return Transaction::Step( _pimpl, *base() ); }
00303
00304 private:
00305 friend class Transaction_const_iterator;
00307 RW_pointer<Transaction::Impl> _pimpl;
00308 };
00309
00312 class Transaction_const_iterator : public boost::iterator_adaptor<
00313 Transaction_const_iterator
00314 , const detail::IdType *
00315 , const Transaction::Step
00316 , boost::forward_traversal_tag
00317 , const Transaction::Step
00318 >
00319 {
00320 public:
00321 Transaction_const_iterator();
00322 Transaction_const_iterator( const Transaction_iterator & iter_r );
00323 Transaction_const_iterator( const RW_pointer<Transaction::Impl> & pimpl_r, base_type id_r )
00324 : Transaction_const_iterator::iterator_adaptor_( id_r )
00325 , _pimpl( pimpl_r )
00326 {}
00327
00328 private:
00329 friend class boost::iterator_core_access;
00330
00331 reference dereference() const
00332 { return Transaction::Step( _pimpl, *base() ); }
00333
00334 private:
00336 RW_pointer<Transaction::Impl> _pimpl;
00337 };
00338
00340 }
00342
00343 inline Transaction::const_iterator Transaction::find( const ResObject::constPtr & resolvable_r ) const
00344 { return( resolvable_r ? find( resolvable_r->satSolvable() ) : end() ); }
00345
00346 inline Transaction::iterator Transaction::find( const ResObject::constPtr & resolvable_r )
00347 { return( resolvable_r ? find( resolvable_r->satSolvable() ) : end() ); }
00348
00349 inline Transaction::const_iterator Transaction::find( const PoolItem & pi_r ) const
00350 { return find( pi_r.satSolvable() ); }
00351
00352 inline Transaction::iterator Transaction::find( const PoolItem & pi_r )
00353 { return find( pi_r.satSolvable() ); }
00354
00355
00356 struct Transaction::FilterAction
00357 {
00358 FilterAction() {}
00359 FilterAction( StepStages filter_r ) : _filter( filter_r ) {}
00360
00361 bool operator()( const Transaction::Step & step_r ) const
00362 {
00363 if ( step_r.stepType() == Transaction::TRANSACTION_IGNORE )
00364 return false;
00365 return !_filter || _filter.testFlag( step_r.stepStage() );
00366 }
00367
00368 StepStages _filter;
00369 };
00370
00371 inline Transaction::action_iterator Transaction::actionBegin( StepStages filter_r ) const
00372 { return make_filter_begin( FilterAction( filter_r ), *this ); }
00373
00374 inline Transaction::action_iterator Transaction::actionEnd() const
00375 { return make_filter_end( FilterAction(), *this ); }
00376
00377 inline bool Transaction::actionEmpty( StepStages filter_r ) const
00378 { return( actionBegin( filter_r ) == actionEnd() ); }
00379
00380 inline size_t Transaction::actionSize( StepStages filter_r ) const
00381 {
00382 size_t cnt = 0;
00383 for_( it, actionBegin( filter_r ), actionEnd() )
00384 ++cnt;
00385 return cnt;
00386 }
00387
00389 }
00392 }
00394 #endif // ZYPP_SAT_TRANSACTION_H