30#ifndef PKGLIB_CACHEITERATORS_H
31#define PKGLIB_CACHEITERATORS_H
32#ifndef __PKGLIB_IN_PKGCACHE_H
33#warning apt-pkg/cacheiterators.h should not be included directly, include apt-pkg/pkgcache.h instead
35#include <apt-pkg/macros.h>
56 Str* OwnerPointer()
const {
return static_cast<Itr const*
>(
this)->OwnerPointer(); }
64 using iterator_category = std::forward_iterator_tag;
65 using value_type = Str;
66 using difference_type = std::ptrdiff_t;
68 using reference = Str&;
70 inline bool end()
const {
return Owner == 0 || S == OwnerPointer();}
73 inline bool operator ==(
const Itr &B)
const {
return S == B.S;}
74 inline bool operator !=(
const Itr &B)
const {
return S != B.S;}
77 inline Str *operator ->() {
return S;}
78 inline Str
const *operator ->()
const {
return S;}
79 inline operator Str *() {
return S == OwnerPointer() ? 0 : S;}
80 inline operator Str
const *()
const {
return S == OwnerPointer() ? 0 : S;}
81 inline Str &operator *() {
return *S;}
82 inline Str
const &operator *()
const {
return *S;}
83 inline pkgCache *Cache()
const {
return Owner;}
86 inline bool IsGood()
const {
return S && Owner && ! end();}
87 inline unsigned long Index()
const {
return S - OwnerPointer();}
90 void ReMap(
void const *
const oldMap,
void *
const newMap) {
91 if (Owner == 0 || S == 0)
93 S =
static_cast<Str *
>(newMap) + (S -
static_cast<Str
const *
>(oldMap));
97 inline Iterator() : S(0), Owner(0) {}
106class APT_PUBLIC
pkgCache::GrpIterator:
public Iterator<Group, GrpIterator> {
110 inline Group* OwnerPointer()
const {
111 return (Owner != 0) ? Owner->GrpP : 0;
115 explicit inline GrpIterator(
pkgCache &Owner) : Iterator<Group, GrpIterator>(Owner), HashIndex(-1) {
120 GrpIterator& operator++();
121 inline GrpIterator operator++(
int) { GrpIterator
const tmp(*
this); operator++();
return tmp; }
123 inline const char *Name()
const {
return S->Name == 0?0:Owner->StrP + S->Name;}
124 inline PkgIterator PackageList()
const;
125 inline VerIterator VersionsInSource()
const;
126 PkgIterator FindPkg(std::string_view Arch = {
"any", 3})
const;
135 PkgIterator NextPkg(PkgIterator
const &Pkg)
const;
142 inline GrpIterator() : Iterator<Group, GrpIterator>(), HashIndex(0) {}
147class APT_PUBLIC
pkgCache::PkgIterator:
public Iterator<Package, PkgIterator> {
151 inline Package* OwnerPointer()
const {
152 return (Owner != 0) ? Owner->PkgP : 0;
156 explicit inline PkgIterator(
pkgCache &Owner) : Iterator<Package, PkgIterator>(Owner), HashIndex(-1) {
161 PkgIterator& operator++();
162 inline PkgIterator operator++(
int) { PkgIterator
const tmp(*
this); operator++();
return tmp; }
164 enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure};
167 inline const char *Name()
const {
return Group().Name(); }
168 inline bool Purge()
const {
return S->CurrentState == pkgCache::State::Purge ||
169 (S->CurrentVer == 0 && S->CurrentState == pkgCache::State::NotInstalled);}
170 inline const char *Arch()
const {
return S->Arch == 0?0:Owner->StrP + S->Arch;}
171 inline APT_PURE GrpIterator Group()
const {
return GrpIterator(*Owner, Owner->GrpP + S->Group);}
173 inline VerIterator VersionList() const APT_PURE;
174 inline VerIterator CurrentVer() const APT_PURE;
175 inline DepIterator RevDependsList() const APT_PURE;
176 inline PrvIterator ProvidesList() const APT_PURE;
177 OkState State() const APT_PURE;
178 const
char *CurVersion() const APT_PURE;
181 friend std::ostream& operator<<(std::ostream& out, PkgIterator i);
182 std::
string FullName(
bool const &Pretty = false) const;
185 inline PkgIterator(
pkgCache &Owner,Package *Trg) : Iterator<Package, PkgIterator>(Owner, Trg), HashIndex(0) {
189 inline PkgIterator() : Iterator<Package, PkgIterator>(), HashIndex(0) {}
193class APT_PUBLIC
pkgCache::SrcVerIterator :
public Iterator<SourceVersion, SrcVerIterator>
196 inline SourceVersion *OwnerPointer()
const
198 return (Owner != 0) ? Owner->SrcVerP : 0;
202 inline SrcVerIterator& operator++() {
if (S != Owner->SrcVerP) S = Owner->SrcVerP + S->NextSourceVersion;
return *
this;}
203 inline SrcVerIterator operator++(
int) { SrcVerIterator
const tmp(*
this); operator++();
return tmp; }
205 inline APT_PURE GrpIterator Group()
const {
return GrpIterator(*Owner, Owner->GrpP + S->Group); }
206 inline const char *VerStr()
const {
return S->VerStr == 0 ? 0 : Owner->StrP + S->VerStr; }
208 inline SrcVerIterator(
pkgCache &Owner, SourceVersion *Trg = 0) : Iterator<SourceVersion, SrcVerIterator>(Owner, Trg)
213 inline SrcVerIterator() : Iterator<SourceVersion, SrcVerIterator>() {}
218class APT_PUBLIC
pkgCache::VerIterator :
public Iterator<Version, VerIterator> {
220 inline Version* OwnerPointer()
const {
221 return (Owner != 0) ? Owner->VerP : 0;
225 inline VerIterator& operator++() {
if (S != Owner->VerP) S = Owner->VerP + S->NextVer;
return *
this;}
226 inline VerIterator operator++(
int) { VerIterator
const tmp(*
this); operator++();
return tmp; }
228 inline VerIterator NextInSource()
230 if (S != Owner->VerP)
231 S = Owner->VerP + S->NextInSource;
236 int CompareVer(
const VerIterator &B)
const;
242 return (B.end() ==
false && S->Hash == B->Hash && strcmp(VerStr(), B.VerStr()) == 0);
246 inline const char *VerStr()
const {
return S->VerStr == 0?0:Owner->StrP + S->VerStr;}
247 inline const char *Section()
const {
return S->Section == 0?0:Owner->StrP + S->Section;}
250 SrcVerIterator
SourceVersion()
const {
return SrcVerIterator(*Owner, Owner->SrcVerP + S->SourceVersion); }
257 inline const char *Arch()
const {
260 return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
262 inline PkgIterator ParentPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
264 inline DescIterator DescriptionList()
const;
265 DescIterator TranslatedDescriptionForLanguage(std::string_view lang)
const;
266 DescIterator TranslatedDescription()
const;
267 inline DepIterator DependsList()
const;
268 inline PrvIterator ProvidesList()
const;
269 inline VerFileIterator FileList()
const;
270 bool Downloadable()
const;
271 inline const char *PriorityType()
const {
return Owner->Priority(S->Priority);}
272 const char *MultiArchType() const APT_PURE;
273 std::
string RelStr() const;
275 bool Automatic() const;
276 VerFileIterator NewestFile() const;
277 bool IsSecurityUpdate() const;
279#ifdef APT_COMPILING_APT
280 inline unsigned int PhasedUpdatePercentage()
const
282 return (
static_cast<Version::Extra *
>(Owner->Map.Data()) + S->d)->PhasedUpdatePercentage;
284 inline bool PhasedUpdatePercentage(
unsigned int percentage)
286 if (percentage > 100)
288 (
static_cast<Version::Extra *
>(Owner->Map.Data()) + S->d)->PhasedUpdatePercentage =
static_cast<uint8_t
>(percentage);
293 inline VerIterator(
pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
297 inline VerIterator() : Iterator<Version, VerIterator>() {}
301class APT_PUBLIC
pkgCache::DescIterator :
public Iterator<Description, DescIterator> {
303 inline Description* OwnerPointer()
const {
304 return (Owner != 0) ? Owner->DescP : 0;
308 inline DescIterator& operator++() {
if (S != Owner->DescP) S = Owner->DescP + S->NextDesc;
return *
this;}
309 inline DescIterator operator++(
int) { DescIterator
const tmp(*
this); operator++();
return tmp; }
312 int CompareDesc(
const DescIterator &B)
const;
315 inline const char *LanguageCode()
const {
return Owner->StrP + S->language_code;}
316 inline const char *md5()
const {
return Owner->StrP + S->md5sum;}
317 inline DescFileIterator FileList()
const;
319 inline DescIterator() : Iterator<Description, DescIterator>() {}
320 inline DescIterator(
pkgCache &Owner,Description *Trg = 0) : Iterator<Description, DescIterator>(Owner, Trg) {
327class APT_PUBLIC
pkgCache::DepIterator :
public Iterator<Dependency, DepIterator> {
328 enum {DepVer, DepRev} Type;
332 inline Dependency* OwnerPointer()
const {
333 return (Owner != 0) ? Owner->DepP : 0;
337 DepIterator& operator++();
338 inline DepIterator operator++(
int) { DepIterator
const tmp(*
this); operator++();
return tmp; }
341 inline const char *TargetVer()
const {
return S2->Version == 0?0:Owner->StrP + S2->Version;}
342 inline PkgIterator TargetPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + S2->Package);}
343 inline PkgIterator SmartTargetPkg()
const {PkgIterator R(*Owner,0);SmartTargetPkg(R);
return R;}
344 inline VerIterator ParentVer()
const {
return VerIterator(*Owner,Owner->VerP + S->ParentVer);}
345 inline PkgIterator ParentPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[uint32_t(S->ParentVer)].ParentPkg);}
346 inline bool Reverse()
const {
return Type == DepRev;}
347 bool IsCritical() const APT_PURE;
348 bool IsNegative() const APT_PURE;
349 bool IsIgnorable(PrvIterator const &Prv) const APT_PURE;
350 bool IsIgnorable(PkgIterator const &Pkg) const APT_PURE;
354 inline
bool IsMultiArchImplicit() const APT_PURE {
359 bool IsImplicit() const APT_PURE;
361 bool IsSatisfied(PkgIterator const &Pkg) const APT_PURE;
362 bool IsSatisfied(VerIterator const &Ver) const APT_PURE;
363 bool IsSatisfied(PrvIterator const &Prv) const APT_PURE;
364 void GlobOr(DepIterator &Start,DepIterator &End);
365 Version **AllTargets() const;
366 bool SmartTargetPkg(PkgIterator &Result) const;
367 inline const
char *CompType()
const {
return Owner->CompType(S2->CompareOp);}
368 inline const char *DepType()
const {
return Owner->DepType(S2->Type);}
377 unsigned char &CompareOp;
386 inline DependencyProxy operator->()
const {
return (
DependencyProxy) { S2->Version, S2->Package, S->ID, S2->Type, S2->CompareOp, S->ParentVer, S->DependencyData, S->NextRevDepends, S->NextDepends, S2->NextData };}
387 inline DependencyProxy operator->() {
return (DependencyProxy) { S2->Version, S2->Package, S->ID, S2->Type, S2->CompareOp, S->ParentVer, S->DependencyData, S->NextRevDepends, S->NextDepends, S2->NextData };}
388 void ReMap(
void const *
const oldMap,
void *
const newMap)
390 Iterator<Dependency, DepIterator>::ReMap(oldMap, newMap);
391 if (Owner == 0 || S == 0 || S2 == 0)
393 S2 =
static_cast<DependencyData *
>(newMap) + (S2 -
static_cast<DependencyData
const *
>(oldMap));
397 friend std::ostream& operator<<(std::ostream& out, DepIterator D);
399 inline DepIterator(
pkgCache &Owner, Dependency *Trg, Version* = 0) :
400 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepVer), S2(Trg == 0 ? Owner.DepDataP : (Owner.DepDataP + Trg->DependencyData)) {
404 inline DepIterator(
pkgCache &Owner, Dependency *Trg, Package*) :
405 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepRev), S2(Trg == 0 ? Owner.DepDataP : (Owner.DepDataP + Trg->DependencyData)) {
409 inline DepIterator() : Iterator<Dependency, DepIterator>(), Type(DepVer), S2(0) {}
413class APT_PUBLIC
pkgCache::PrvIterator :
public Iterator<Provides, PrvIterator> {
414 enum {PrvVer, PrvPkg} Type;
417 inline Provides* OwnerPointer()
const {
418 return (Owner != 0) ? Owner->ProvideP : 0;
422 inline PrvIterator& operator ++() {
if (S != Owner->ProvideP) S = Owner->ProvideP +
423 (Type == PrvVer?S->NextPkgProv:S->NextProvides);
return *
this;}
424 inline PrvIterator operator++(
int) { PrvIterator
const tmp(*
this); operator++();
return tmp; }
427 inline const char *Name()
const {
return ParentPkg().Name();}
428 inline const char *ProvideVersion()
const {
return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;}
429 inline PkgIterator ParentPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
430 inline VerIterator OwnerVer()
const {
return VerIterator(*Owner,Owner->VerP + S->Version);}
431 inline PkgIterator OwnerPkg()
const {
return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[uint32_t(S->Version)].ParentPkg);}
436 bool IsMultiArchImplicit() const APT_PURE
440 inline PrvIterator() : Iterator<Provides, PrvIterator>(), Type(PrvVer) {}
441 inline PrvIterator(
pkgCache &Owner, Provides *Trg, Version*) :
442 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvVer) {
446 inline PrvIterator(
pkgCache &Owner, Provides *Trg, Package*) :
447 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvPkg) {
454class APT_PUBLIC
pkgCache::RlsFileIterator :
public Iterator<ReleaseFile, RlsFileIterator> {
456 inline ReleaseFile* OwnerPointer()
const {
457 return (Owner != 0) ? Owner->RlsFileP : 0;
461 inline RlsFileIterator& operator++() {
if (S != Owner->RlsFileP) S = Owner->RlsFileP + S->NextFile;
return *
this;}
462 inline RlsFileIterator operator++(
int) { RlsFileIterator
const tmp(*
this); operator++();
return tmp; }
465 inline const char *FileName()
const {
return S->FileName == 0?0:Owner->StrP + S->FileName;}
466 inline const char *Archive()
const {
return S->Archive == 0?0:Owner->StrP + S->Archive;}
467 inline const char *Version()
const {
return S->Version == 0?0:Owner->StrP + S->Version;}
468 inline const char *Origin()
const {
return S->Origin == 0?0:Owner->StrP + S->Origin;}
469 inline const char *Codename()
const {
return S->Codename ==0?0:Owner->StrP + S->Codename;}
470 inline const char *Label()
const {
return S->Label == 0?0:Owner->StrP + S->Label;}
471 inline const char *Site()
const {
return S->Site == 0?0:Owner->StrP + S->Site;}
474 std::string RelStr();
477 inline RlsFileIterator() : Iterator<ReleaseFile, RlsFileIterator>() {}
478 explicit inline RlsFileIterator(
pkgCache &Owner) : Iterator<ReleaseFile, RlsFileIterator>(Owner, Owner.RlsFileP) {}
479 inline RlsFileIterator(
pkgCache &Owner,ReleaseFile *Trg) : Iterator<ReleaseFile, RlsFileIterator>(Owner, Trg) {}
483class APT_PUBLIC
pkgCache::PkgFileIterator :
public Iterator<PackageFile, PkgFileIterator> {
485 inline PackageFile* OwnerPointer()
const {
486 return (Owner != 0) ? Owner->PkgFileP : 0;
490 inline PkgFileIterator& operator++() {
if (S != Owner->PkgFileP) S = Owner->PkgFileP + S->NextFile;
return *
this;}
491 inline PkgFileIterator operator++(
int) { PkgFileIterator
const tmp(*
this); operator++();
return tmp; }
494 inline const char *FileName()
const {
return S->FileName == 0?0:Owner->StrP + S->FileName;}
495 inline pkgCache::RlsFileIterator ReleaseFile()
const {
return RlsFileIterator(*Owner, Owner->RlsFileP + S->Release);}
496 inline const char *Archive()
const {
return S->Release == 0 ? Component() : ReleaseFile().Archive();}
497 inline const char *Version()
const {
return S->Release == 0 ? NULL : ReleaseFile().Version();}
498 inline const char *Origin()
const {
return S->Release == 0 ? NULL : ReleaseFile().Origin();}
499 inline const char *Codename()
const {
return S->Release == 0 ? NULL : ReleaseFile().Codename();}
500 inline const char *Label()
const {
return S->Release == 0 ? NULL : ReleaseFile().Label();}
501 inline const char *Site()
const {
return S->Release == 0 ? NULL : ReleaseFile().Site();}
504 inline const char *Component()
const {
return S->Component == 0?0:Owner->StrP + S->Component;}
505 inline const char *Architecture()
const {
return S->Architecture == 0?0:Owner->StrP + S->Architecture;}
506 inline const char *IndexType()
const {
return S->IndexType == 0?0:Owner->StrP + S->IndexType;}
508 std::string RelStr();
511 inline PkgFileIterator() : Iterator<PackageFile, PkgFileIterator>() {}
512 explicit inline PkgFileIterator(
pkgCache &Owner) : Iterator<PackageFile, PkgFileIterator>(Owner, Owner.PkgFileP) {}
513 inline PkgFileIterator(
pkgCache &Owner,PackageFile *Trg) : Iterator<PackageFile, PkgFileIterator>(Owner, Trg) {}
519 inline VerFile* OwnerPointer()
const {
520 return (Owner != 0) ? Owner->VerFileP : 0;
524 inline VerFileIterator& operator++() {
if (S != Owner->VerFileP) S = Owner->VerFileP + S->NextFile;
return *
this;}
525 inline VerFileIterator operator++(
int) { VerFileIterator
const tmp(*
this); operator++();
return tmp; }
528 inline PkgFileIterator File()
const {
return PkgFileIterator(*Owner, Owner->PkgFileP + S->File);}
530 inline VerFileIterator() : Iterator<VerFile, VerFileIterator>() {}
531 inline VerFileIterator(
pkgCache &Owner,VerFile *Trg) : Iterator<VerFile, VerFileIterator>(Owner, Trg) {}
535class APT_PUBLIC
pkgCache::DescFileIterator :
public Iterator<DescFile, DescFileIterator> {
537 inline DescFile* OwnerPointer()
const {
538 return (Owner != 0) ? Owner->DescFileP : 0;
542 inline DescFileIterator& operator++() {
if (S != Owner->DescFileP) S = Owner->DescFileP + S->NextFile;
return *
this;}
543 inline DescFileIterator operator++(
int) { DescFileIterator
const tmp(*
this); operator++();
return tmp; }
546 inline PkgFileIterator File()
const {
return PkgFileIterator(*Owner, Owner->PkgFileP + S->File);}
548 inline DescFileIterator() : Iterator<DescFile, DescFileIterator>() {}
549 inline DescFileIterator(
pkgCache &Owner,DescFile *Trg) : Iterator<DescFile, DescFileIterator>(Owner, Trg) {}
553inline pkgCache::PkgIterator pkgCache::GrpIterator::PackageList()
const
554 {
return PkgIterator(*Owner,Owner->PkgP + S->FirstPackage);}
555 inline pkgCache::VerIterator pkgCache::GrpIterator::VersionsInSource()
const
557 return VerIterator(*Owner, Owner->VerP + S->VersionsInSource);
559inline pkgCache::VerIterator pkgCache::PkgIterator::VersionList()
const
560 {
return VerIterator(*Owner,Owner->VerP + S->VersionList);}
561inline pkgCache::VerIterator pkgCache::PkgIterator::CurrentVer()
const
562 {
return VerIterator(*Owner,Owner->VerP + S->CurrentVer);}
563inline pkgCache::DepIterator pkgCache::PkgIterator::RevDependsList()
const
564 {
return DepIterator(*Owner,Owner->DepP + S->RevDepends,S);}
565inline pkgCache::PrvIterator pkgCache::PkgIterator::ProvidesList()
const
566 {
return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);}
567inline pkgCache::DescIterator pkgCache::VerIterator::DescriptionList()
const
568 {
return DescIterator(*Owner,Owner->DescP + S->DescriptionList);}
569inline pkgCache::PrvIterator pkgCache::VerIterator::ProvidesList()
const
570 {
return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);}
571inline pkgCache::DepIterator pkgCache::VerIterator::DependsList()
const
572 {
return DepIterator(*Owner,Owner->DepP + S->DependsList,S);}
573inline pkgCache::VerFileIterator pkgCache::VerIterator::FileList()
const
574 {
return VerFileIterator(*Owner,Owner->VerFileP + S->FileList);}
575inline pkgCache::DescFileIterator pkgCache::DescIterator::FileList()
const
576 {
return DescFileIterator(*Owner,Owner->DescFileP + S->FileList);}
Definition pkgcache.h:145
Definition cacheiterators.h:47
bool SimilarVer(const VerIterator &B) const
compares two version and returns if they are similar
Definition cacheiterators.h:241
PkgIterator FindPreferredPkg(bool const &PreferNonVirtual=true) const
find the package with the "best" architecture
const char * SourceVerStr() const
source version this version comes from Always contains the version string, even if it is the same as ...
Definition cacheiterators.h:256
SrcVerIterator SourceVersion() const
source version this version comes from Always contains the version string, even if it is the same as ...
Definition cacheiterators.h:250
const char * SourcePkgName() const
source package name this version comes from Always contains the name, even if it is the same as the b...
Definition cacheiterators.h:253
@ MultiArchImplicit
Definition pkgcache.h:177
information for a single dependency record
Definition pkgcache.h:764
Definition cacheiterators.h:372
@ MultiArchImplicit
Definition pkgcache.h:208
ReleaseFileFlags
Definition pkgcache.h:203
PkgFFlags
Definition pkgcache.h:198
groups architecture depending packages together
Definition pkgcache.h:422
contains information for a single unique package
Definition pkgcache.h:460
information for a single version of a source package
Definition pkgcache.h:631
map_stringitem_t VerStr
complete version string
Definition pkgcache.h:637
map_pointer< pkgCache::Group > Group
Group the source package belongs too.
Definition pkgcache.h:635
information for a single version of a package
Definition pkgcache.h:652
@ All
Definition pkgcache.h:667