30 #ifndef PKGLIB_CACHEITERATORS_H
31 #define PKGLIB_CACHEITERATORS_H
40 public std::iterator<std::forward_iterator_tag, Str> {
57 virtual void operator ++(
int) = 0;
58 virtual void operator ++() = 0;
59 inline bool end()
const {
return Owner == 0 || S ==
OwnerPointer();};
62 inline bool operator ==(
const Itr &B)
const {
return S == B.S;};
63 inline bool operator !=(
const Itr &B)
const {
return S != B.S;};
66 inline Str *operator ->() {
return S;};
67 inline Str
const *operator ->()
const {
return S;};
68 inline operator Str *() {
return S ==
OwnerPointer() ? 0 : S;};
69 inline operator Str
const *()
const {
return S ==
OwnerPointer() ? 0 : S;};
70 inline Str &operator *() {
return *S;};
71 inline Str
const &operator *()
const {
return *S;};
72 inline pkgCache *Cache()
const {
return Owner;};
75 inline void operator =(
const Itr &B) {S = B.S; Owner = B.Owner;};
76 inline bool IsGood()
const {
return S && Owner && ! end();};
77 inline unsigned long Index()
const {
return S -
OwnerPointer();};
79 void ReMap(
void const *
const oldMap,
void const *
const newMap) {
80 if (Owner == 0 || S == 0)
82 S += (Str*)(newMap) - (Str*)(oldMap);
86 inline Iterator() : S(0), Owner(0) {};
100 return (Owner != 0) ? Owner->GrpP : 0;
110 virtual void operator ++(
int);
111 virtual void operator ++() {operator ++(0);};
113 inline const char *Name()
const {
return S->
Name == 0?0:Owner->StrP + S->
Name;};
114 inline PkgIterator PackageList()
const;
115 PkgIterator FindPkg(std::string Arch =
"any")
const;
124 PkgIterator NextPkg(PkgIterator
const &Pkg)
const;
127 inline GrpIterator(
pkgCache &Owner, Group *Trg) : Iterator<Group, GrpIterator>(Owner, Trg), HashIndex(0) {
131 inline GrpIterator() : Iterator<Group, GrpIterator>(), HashIndex(0) {};
141 return (Owner != 0) ? Owner->PkgP : 0;
151 virtual void operator ++(
int);
152 virtual void operator ++() {operator ++(0);};
154 enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure};
157 inline const char *Name()
const {
return S->
Name == 0?0:Owner->StrP + S->
Name;};
158 inline const char *Section()
const {
return S->
Section == 0?0:Owner->StrP + S->
Section;};
159 inline bool Purge()
const {
return S->
CurrentState == pkgCache::State::Purge ||
161 inline const char *Arch()
const {
return S->
Arch == 0?0:Owner->StrP + S->
Arch;};
162 inline GrpIterator Group()
const {
return GrpIterator(*Owner, Owner->GrpP + S->
Group);};
164 inline VerIterator VersionList()
const;
165 inline VerIterator CurrentVer()
const;
166 inline DepIterator RevDependsList()
const;
167 inline PrvIterator ProvidesList()
const;
168 OkState State()
const;
169 const char *CandVersion()
const;
170 const char *CurVersion()
const;
173 friend std::ostream& operator <<(std::ostream& out, PkgIterator i);
174 std::string FullName(
bool const &Pretty =
false)
const;
177 inline PkgIterator(
pkgCache &Owner,Package *Trg) : Iterator<Package, PkgIterator>(Owner, Trg), HashIndex(0) {
181 inline PkgIterator() : Iterator<Package, PkgIterator>(), HashIndex(0) {};
188 return (Owner != 0) ? Owner->VerP : 0;
193 void operator ++(
int) {
if (S != Owner->VerP) S = Owner->VerP + S->
NextVer;};
194 inline void operator ++() {operator ++(0);};
197 int CompareVer(
const VerIterator &B)
const;
203 return (B.end() ==
false && S->
Hash == B->Hash && strcmp(VerStr(), B.VerStr()) == 0);
207 inline const char *VerStr()
const {
return S->
VerStr == 0?0:Owner->StrP + S->
VerStr;};
208 inline const char *Section()
const {
return S->
Section == 0?0:Owner->StrP + S->
Section;};
209 inline const char *Arch()
const {
212 return S->
ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
214 inline PkgIterator ParentPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + S->
ParentPkg);};
216 inline DescIterator DescriptionList()
const;
217 DescIterator TranslatedDescription()
const;
218 inline DepIterator DependsList()
const;
219 inline PrvIterator ProvidesList()
const;
220 inline VerFileIterator FileList()
const;
221 bool Downloadable()
const;
222 inline const char *PriorityType()
const {
return Owner->Priority(S->
Priority);};
223 std::string RelStr()
const;
225 bool Automatic()
const;
226 VerFileIterator NewestFile()
const;
228 inline VerIterator(
pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
232 inline VerIterator() : Iterator<Version, VerIterator>() {};
239 return (Owner != 0) ? Owner->DescP : 0;
244 void operator ++(
int) {
if (S != Owner->DescP) S = Owner->DescP + S->
NextDesc;};
245 inline void operator ++() {operator ++(0);};
248 int CompareDesc(
const DescIterator &B)
const;
251 inline const char *LanguageCode()
const {
return Owner->StrP + S->
language_code;};
252 inline const char *md5()
const {
return Owner->StrP + S->
md5sum;};
253 inline DescFileIterator FileList()
const;
255 inline DescIterator() : Iterator<Description, DescIterator>() {};
256 inline DescIterator(
pkgCache &Owner,Description *Trg = 0) : Iterator<Description, DescIterator>(Owner, Trg) {
264 enum {DepVer, DepRev} Type;
268 return (Owner != 0) ? Owner->DepP : 0;
273 void operator ++(
int) {
if (S != Owner->DepP) S = Owner->DepP +
275 inline void operator ++() {operator ++(0);};
278 inline const char *TargetVer()
const {
return S->
Version == 0?0:Owner->StrP + S->
Version;};
279 inline PkgIterator TargetPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + S->
Package);};
280 inline PkgIterator SmartTargetPkg()
const {PkgIterator R(*Owner,0);SmartTargetPkg(R);
return R;};
281 inline VerIterator ParentVer()
const {
return VerIterator(*Owner,Owner->VerP + S->
ParentVer);};
282 inline PkgIterator ParentPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->
ParentVer].
ParentPkg);};
283 inline bool Reverse()
const {
return Type == DepRev;};
284 bool IsCritical()
const;
285 bool IsNegative()
const;
286 bool IsIgnorable(PrvIterator
const &Prv)
const;
287 bool IsIgnorable(PkgIterator
const &Pkg)
const;
288 bool IsMultiArchImplicit()
const;
289 void GlobOr(DepIterator &Start,DepIterator &End);
290 Version **AllTargets()
const;
291 bool SmartTargetPkg(PkgIterator &Result)
const;
292 inline const char *CompType()
const {
return Owner->CompType(S->
CompareOp);};
293 inline const char *DepType()
const {
return Owner->DepType(S->
Type);};
296 friend std::ostream& operator <<(std::ostream& out, DepIterator D);
298 inline DepIterator(
pkgCache &Owner, Dependency *Trg, Version* = 0) :
299 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepVer) {
303 inline DepIterator(
pkgCache &Owner, Dependency *Trg, Package*) :
304 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepRev) {
308 inline DepIterator() : Iterator<Dependency, DepIterator>(), Type(DepVer) {};
313 enum {PrvVer, PrvPkg} Type;
317 return (Owner != 0) ? Owner->ProvideP : 0;
322 void operator ++(
int) {
if (S != Owner->ProvideP) S = Owner->ProvideP +
324 inline void operator ++() {operator ++(0);};
327 inline const char *Name()
const {
return Owner->StrP + Owner->PkgP[S->
ParentPkg].
Name;};
329 inline PkgIterator ParentPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + S->
ParentPkg);};
330 inline VerIterator OwnerVer()
const {
return VerIterator(*Owner,Owner->VerP + S->
Version);};
331 inline PkgIterator OwnerPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->
Version].
ParentPkg);};
333 bool IsMultiArchImplicit()
const;
335 inline PrvIterator() : Iterator<Provides, PrvIterator>(), Type(PrvVer) {};
336 inline PrvIterator(
pkgCache &Owner, Provides *Trg, Version*) :
337 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvVer) {
341 inline PrvIterator(
pkgCache &Owner, Provides *Trg, Package*) :
342 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvPkg) {
352 return (Owner != 0) ? Owner->PkgFileP : 0;
357 void operator ++(
int) {
if (S != Owner->PkgFileP) S = Owner->PkgFileP + S->
NextFile;};
358 inline void operator ++() {operator ++(0);};
361 inline const char *FileName()
const {
return S->
FileName == 0?0:Owner->StrP + S->
FileName;};
362 inline const char *Archive()
const {
return S->
Archive == 0?0:Owner->StrP + S->
Archive;};
363 inline const char *Component()
const {
return S->Component == 0?0:Owner->StrP + S->Component;};
364 inline const char *Version()
const {
return S->Version == 0?0:Owner->StrP + S->Version;};
365 inline const char *Origin()
const {
return S->Origin == 0?0:Owner->StrP + S->Origin;};
366 inline const char *Codename()
const {
return S->Codename ==0?0:Owner->StrP + S->Codename;};
367 inline const char *Label()
const {
return S->Label == 0?0:Owner->StrP + S->Label;};
368 inline const char *Site()
const {
return S->
Site == 0?0:Owner->StrP + S->
Site;};
369 inline const char *Architecture()
const {
return S->Architecture == 0?0:Owner->StrP + S->Architecture;};
370 inline const char *IndexType()
const {
return S->
IndexType == 0?0:Owner->StrP + S->
IndexType;};
373 std::string RelStr();
376 inline PkgFileIterator() : Iterator<PackageFile, PkgFileIterator>() {};
377 inline PkgFileIterator(
pkgCache &Owner) : Iterator<PackageFile, PkgFileIterator>(Owner, Owner.PkgFileP) {};
378 inline PkgFileIterator(
pkgCache &Owner,PackageFile *Trg) : Iterator<PackageFile, PkgFileIterator>(Owner, Trg) {};
385 return (Owner != 0) ? Owner->VerFileP : 0;
390 void operator ++(
int) {
if (S != Owner->VerFileP) S = Owner->VerFileP + S->
NextFile;};
391 inline void operator ++() {operator ++(0);};
394 inline PkgFileIterator File()
const {
return PkgFileIterator(*Owner,S->
File + Owner->PkgFileP);};
396 inline VerFileIterator() : Iterator<VerFile, VerFileIterator>() {};
397 inline VerFileIterator(
pkgCache &Owner,VerFile *Trg) : Iterator<VerFile, VerFileIterator>(Owner, Trg) {};
404 return (Owner != 0) ? Owner->DescFileP : 0;
409 void operator ++(
int) {
if (S != Owner->DescFileP) S = Owner->DescFileP + S->
NextFile;};
410 inline void operator ++() {operator ++(0);};
413 inline PkgFileIterator File()
const {
return PkgFileIterator(*Owner,S->
File + Owner->PkgFileP);};
415 inline DescFileIterator() : Iterator<DescFile, DescFileIterator>() {};
416 inline DescFileIterator(
pkgCache &Owner,DescFile *Trg) : Iterator<DescFile, DescFileIterator>(Owner, Trg) {};
421 {
return PkgIterator(*Owner,Owner->PkgP + S->
FirstPackage);};
423 {
return VerIterator(*Owner,Owner->VerP + S->VersionList);};
425 {
return VerIterator(*Owner,Owner->VerP + S->CurrentVer);};
427 {
return DepIterator(*Owner,Owner->DepP + S->RevDepends,S);};
429 {
return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);};
431 {
return DescIterator(*Owner,Owner->DescP + S->DescriptionList);};
433 {
return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);};
435 {
return DepIterator(*Owner,Owner->DepP + S->DependsList,S);};
437 {
return VerFileIterator(*Owner,Owner->VerFileP + S->FileList);};
439 {
return DescFileIterator(*Owner,Owner->DescFileP + S->FileList);};