00001
00002
00003
00004
00005
00006
00007
00008
00012 #ifndef ZYPP_SAT_LOOKUPATTR_H
00013 #define ZYPP_SAT_LOOKUPATTR_H
00014
00015 extern "C"
00016 {
00017 struct _Dataiterator;
00018 }
00019 #include <iosfwd>
00020
00021 #include "zypp/base/PtrTypes.h"
00022 #include "zypp/base/DefaultIntegral.h"
00023
00024 #include "zypp/sat/detail/PoolMember.h"
00025 #include "zypp/sat/SolvAttr.h"
00026
00028 namespace zypp
00029 {
00030
00031 class CheckSum;
00032 class Match;
00033 class MatchException;
00034
00036 namespace sat
00037 {
00038
00039 class AttrMatcher;
00040
00042
00043
00044
00112 class LookupAttr
00113 {
00114 public:
00115 typedef MatchException Exception;
00116
00117 public:
00118 typedef unsigned size_type;
00119
00121 enum Location {
00122 SOLV_ATTR = 0,
00123 REPO_ATTR = -1
00124 };
00125
00126 public:
00128 LookupAttr();
00129
00131 explicit LookupAttr( SolvAttr attr_r, Location = SOLV_ATTR );
00133 LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Location = SOLV_ATTR );
00134
00136 LookupAttr( SolvAttr attr_r, Repository repo_r, Location = SOLV_ATTR );
00138 LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Repository repo_r, Location = SOLV_ATTR );
00139
00141 LookupAttr( SolvAttr attr_r, Solvable solv_r );
00143 LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Solvable solv_r );
00144
00145 public:
00149 class iterator;
00150
00152 iterator begin() const;
00153
00155 iterator end() const;
00156
00158 bool empty() const;
00159
00163 size_type size() const;
00164
00166 template<class _ResultT, class _AttrT = _ResultT> class transformIterator;
00168
00169 public:
00173 SolvAttr attr() const;
00174
00176 void setAttr( SolvAttr attr_r );
00178
00190 const AttrMatcher & attrMatcher() const;
00191
00195 void setAttrMatcher( const AttrMatcher & matcher_r );
00196
00198 void resetAttrMatcher();
00200
00201 public:
00205 bool pool() const;
00206
00208 void setPool( Location = SOLV_ATTR );
00209
00211 Repository repo() const;
00212
00214 void setRepo( Repository repo_r, Location = SOLV_ATTR );
00215
00217 Solvable solvable() const;
00218
00220 void setSolvable( Solvable solv_r );
00221
00223 SolvAttr parent() const;
00224
00226 void setParent( SolvAttr attr_r );
00228
00229 private:
00230 class Impl;
00231 RWCOW_pointer<Impl> _pimpl;
00232 };
00234
00236 std::ostream & operator<<( std::ostream & str, const LookupAttr & obj );
00237
00239 std::ostream & dumpOn( std::ostream & str, const LookupAttr & obj );
00240
00242
00243
00244
00261 class LookupRepoAttr : public LookupAttr
00262 {
00263 public:
00265 LookupRepoAttr()
00266 {}
00268 explicit LookupRepoAttr( SolvAttr attr_r )
00269 : LookupAttr( attr_r, REPO_ATTR )
00270 {}
00272 explicit LookupRepoAttr( SolvAttr attr_r, Repository repo_r );
00273
00274 public:
00276 void setPool()
00277 { LookupAttr::setPool( REPO_ATTR ); }
00279 void setRepo( Repository repo_r );
00280 private:
00281
00282 using LookupAttr::solvable;
00283 using LookupAttr::setSolvable;
00284 };
00286
00287 namespace detail
00288 {
00296 class DIWrap : private base::SafeBool<DIWrap>
00297 {
00298 public:
00300 DIWrap()
00301 : _dip( 0 )
00302 {}
00304 DIWrap( RepoIdType repoId_r, SolvableIdType solvId_r, IdType attrId_r,
00305 const std::string & mstring_r = std::string(), int flags_r = 0 );
00307 DIWrap( RepoIdType repoId_r, SolvableIdType solvId_r, IdType attrId_r,
00308 const char * mstring_r, int flags_r = 0 );
00309 DIWrap( const DIWrap & rhs );
00310 ~DIWrap();
00311 public:
00312 void swap( DIWrap & rhs )
00313 {
00314 if ( &rhs != this )
00315 {
00316 std::swap( _dip, rhs._dip );
00317 std::swap( _mstring, rhs._mstring );
00318 }
00319 }
00320 DIWrap & operator=( const DIWrap & rhs )
00321 {
00322 if ( &rhs != this )
00323 DIWrap( rhs ).swap( *this );
00324 return *this;
00325 }
00326 void reset()
00327 { DIWrap().swap( *this ); }
00328 public:
00329 #ifndef SWIG // Swig treats it as syntax error
00330
00331 using base::SafeBool<DIWrap>::operator bool_type;
00332 #endif
00333 public:
00334 ::_Dataiterator * operator->() const { return _dip; }
00335 ::_Dataiterator * get() const { return _dip; }
00336 const std::string & getstr() const { return _mstring; }
00337 private:
00338 friend base::SafeBool<DIWrap>::operator bool_type() const;
00339 bool boolTest() const
00340 { return _dip; }
00341 private:
00342 ::_Dataiterator * _dip;
00343 std::string _mstring;
00344 };
00346 std::ostream & operator<<( std::ostream & str, const DIWrap & obj );
00347 }
00348
00350
00351
00352
00357 class LookupAttr::iterator : public boost::iterator_adaptor<
00358 iterator
00359 , ::_Dataiterator *
00360 , detail::IdType
00361 , boost::forward_traversal_tag
00362 , detail::IdType
00363 >
00364 {
00365 public:
00369 void nextSkipSolvAttr();
00370
00372 void nextSkipSolvable();
00373
00375 void nextSkipRepo();
00376
00378 void skipSolvAttr()
00379 { nextSkipSolvAttr(); increment(); }
00380
00382 void skipSolvable()
00383 { nextSkipSolvable(); increment(); }
00384
00386 void skipRepo()
00387 { nextSkipRepo(); increment(); }
00388
00390 void stayInThisSolvable();
00391
00393 void stayInThisRepo();
00395
00399 Repository inRepo() const;
00400
00402 Solvable inSolvable() const;
00403
00405 SolvAttr inSolvAttr() const;
00406
00408 bool atEnd() const
00409 { return !_dip; }
00411
00415 detail::IdType solvAttrType() const;
00416
00418 bool solvAttrNumeric() const;
00419
00421 bool solvAttrString() const;
00422
00424 bool solvAttrIdString() const;
00425
00427 bool solvAttrCheckSum() const;
00428
00433 bool solvAttrSubEntry() const;
00435
00467 bool subEmpty() const;
00468
00472 size_type subSize() const;
00473
00477 iterator subBegin() const;
00481 iterator subEnd() const;
00486 iterator subFind( SolvAttr attr_r ) const;
00494 iterator subFind( const C_Str & attrname_r ) const;
00496
00500 int asInt() const;
00502 unsigned asUnsigned() const;
00504 bool asBool() const;
00505
00507 const char * c_str() const;
00512 std::string asString() const;
00513
00519 IdString idStr() const;
00521 detail::IdType id() const
00522 { return idStr().id(); }
00523
00525 CheckSum asCheckSum() const;
00526
00533 template<class _Tp> _Tp asType() const { return _Tp(id()); }
00535
00537
00539 public:
00540 iterator();
00541
00542 iterator( const iterator & rhs );
00543
00544 iterator & operator=( const iterator & rhs );
00545
00546 ~iterator();
00547
00548 public:
00553 iterator( detail::DIWrap & dip_r );
00554
00555 private:
00556 friend class boost::iterator_core_access;
00557
00558 template <class OtherDerived, class OtherIterator, class V, class C, class R, class D>
00559 bool equal( const boost::iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> & rhs ) const
00560 {
00561 return ( bool(base()) == bool(rhs.base()) )
00562 && ( ! base() || dip_equal( *base(), *rhs.base() ) );
00563 }
00564
00565 bool dip_equal( const ::_Dataiterator & lhs, const ::_Dataiterator & rhs ) const;
00566
00567 detail::IdType dereference() const;
00568
00569 void increment();
00570
00571 public:
00573 ::_Dataiterator * get() const
00574 { return _dip.get(); }
00575 private:
00576 detail::DIWrap _dip;
00577 };
00579
00581 std::ostream & operator<<( std::ostream & str, const LookupAttr::iterator & obj );
00582
00584
00587 template<> inline int LookupAttr::iterator::asType<int>() const { return asInt(); }
00588 template<> inline unsigned LookupAttr::iterator::asType<unsigned>() const { return asUnsigned(); }
00589 template<> inline bool LookupAttr::iterator::asType<bool>() const { return asBool(); }
00590 template<> inline const char * LookupAttr::iterator::asType<const char *>() const { return c_str(); }
00591 template<> inline std::string LookupAttr::iterator::asType<std::string>() const { return asString(); }
00592 template<> inline IdString LookupAttr::iterator::asType<IdString>() const { return idStr(); }
00593 template<> CheckSum LookupAttr::iterator::asType<CheckSum>() const;
00594
00595 template<class _ResultT, class _AttrT>
00596 class ArrayAttr;
00598
00600 }
00603 }
00605
00607 std::ostream & operator<<( std::ostream & str, const ::_Dataiterator * obj );
00608
00610 inline std::ostream & operator<<( std::ostream & str, const ::_Dataiterator & obj )
00611 { return str << &obj; }
00612
00613 #endif // ZYPP_SAT_LOOKUPATTR_H