]>
git.saurik.com Git - apt.git/blob - apt-pkg/cacheiterators.h
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: cacheiterators.h,v 1.18.2.1 2004/05/08 22:44:27 mdz Exp $
4 /* ######################################################################
6 Cache Iterators - Iterators for navigating the cache structure
8 The iterators all provides ++,==,!=,->,* and end for their type.
9 The end function can be used to tell if the list has been fully
12 Unlike STL iterators these contain helper functions to access the data
13 that is being iterated over. This is because the data structures can't
14 be formed in a manner that is intuitive to use and also mmapable.
16 For each variable in the target structure that would need a translation
17 to be accessed correctly a translating function of the same name is
18 present in the iterator. If applicable the translating function will
21 The DepIterator can iterate over two lists, a list of 'version depends'
22 or a list of 'package reverse depends'. The type is determined by the
23 structure passed to the constructor, which should be the structure
24 that has the depends pointer as a member. The provide iterator has the
27 This header is not user includable, please use apt-pkg/pkgcache.h
29 ##################################################################### */
31 #ifndef PKGLIB_CACHEITERATORS_H
32 #define PKGLIB_CACHEITERATORS_H
35 #pragma interface "apt-pkg/cacheiterators.h"
39 class pkgCache::PkgIterator
41 friend class pkgCache
;
48 // This constructor is the 'begin' constructor, never use it.
49 inline PkgIterator(pkgCache
&Owner
) : Owner(&Owner
), HashIndex(-1)
57 enum OkState
{NeedsNothing
,NeedsUnpack
,NeedsConfigure
};
60 void operator ++(int);
61 inline void operator ++() {operator ++(0);};
62 inline bool end() const {return Owner
== 0 || Pkg
== Owner
->PkgP
?true:false;};
65 inline bool operator ==(const PkgIterator
&B
) const {return Pkg
== B
.Pkg
;};
66 inline bool operator !=(const PkgIterator
&B
) const {return Pkg
!= B
.Pkg
;};
69 inline Package
*operator ->() {return Pkg
;};
70 inline Package
const *operator ->() const {return Pkg
;};
71 inline Package
const &operator *() const {return *Pkg
;};
72 inline operator Package
*() {return Pkg
== Owner
->PkgP
?0:Pkg
;};
73 inline operator Package
const *() const {return Pkg
== Owner
->PkgP
?0:Pkg
;};
74 inline pkgCache
*Cache() {return Owner
;};
76 inline const char *Name() const {return Pkg
->Name
== 0?0:Owner
->StrP
+ Pkg
->Name
;};
77 inline const char *Section() const {return Pkg
->Section
== 0?0:Owner
->StrP
+ Pkg
->Section
;};
78 inline bool Purge() const {return Pkg
->CurrentState
== pkgCache::State::Purge
||
79 (Pkg
->CurrentVer
== 0 && Pkg
->CurrentState
== pkgCache::State::NotInstalled
);};
80 inline VerIterator
VersionList() const;
81 inline VerIterator
CurrentVer() const;
82 inline DepIterator
RevDependsList() const;
83 inline PrvIterator
ProvidesList() const;
84 inline unsigned long Index() const {return Pkg
- Owner
->PkgP
;};
85 OkState
State() const;
88 inline PkgIterator(pkgCache
&Owner
,Package
*Trg
) : Pkg(Trg
), Owner(&Owner
),
94 inline PkgIterator() : Pkg(0), Owner(0), HashIndex(0) {};
98 class pkgCache::VerIterator
108 void operator ++(int) {if (Ver
!= Owner
->VerP
) Ver
= Owner
->VerP
+ Ver
->NextVer
;};
109 inline void operator ++() {operator ++(0);};
110 inline bool end() const {return Ver
== Owner
->VerP
?true:false;};
111 inline void operator =(const VerIterator
&B
) {Ver
= B
.Ver
; Owner
= B
.Owner
;};
114 inline bool operator ==(const VerIterator
&B
) const {return Ver
== B
.Ver
;};
115 inline bool operator !=(const VerIterator
&B
) const {return Ver
!= B
.Ver
;};
116 int CompareVer(const VerIterator
&B
) const;
119 inline Version
*operator ->() {return Ver
;};
120 inline Version
const *operator ->() const {return Ver
;};
121 inline Version
&operator *() {return *Ver
;};
122 inline Version
const &operator *() const {return *Ver
;};
123 inline operator Version
*() {return Ver
== Owner
->VerP
?0:Ver
;};
124 inline operator Version
const *() const {return Ver
== Owner
->VerP
?0:Ver
;};
125 inline pkgCache
*Cache() {return Owner
;};
127 inline const char *VerStr() const {return Ver
->VerStr
== 0?0:Owner
->StrP
+ Ver
->VerStr
;};
128 inline const char *Section() const {return Ver
->Section
== 0?0:Owner
->StrP
+ Ver
->Section
;};
129 inline const char *Arch() const {return Ver
->Arch
== 0?0:Owner
->StrP
+ Ver
->Arch
;};
130 inline PkgIterator
ParentPkg() const {return PkgIterator(*Owner
,Owner
->PkgP
+ Ver
->ParentPkg
);};
131 inline DescIterator
DescriptionList() const;
132 inline DepIterator
DependsList() const;
133 inline PrvIterator
ProvidesList() const;
134 inline VerFileIterator
FileList() const;
135 inline unsigned long Index() const {return Ver
- Owner
->VerP
;};
136 bool Downloadable() const;
137 inline const char *PriorityType() {return Owner
->Priority(Ver
->Priority
);};
140 bool Automatic() const;
141 VerFileIterator
NewestFile() const;
143 inline VerIterator() : Ver(0), Owner(0) {};
144 inline VerIterator(pkgCache
&Owner
,Version
*Trg
= 0) : Ver(Trg
),
152 // Description Iterator
153 class pkgCache::DescIterator
163 void operator ++(int) {if (Desc
!= Owner
->DescP
) Desc
= Owner
->DescP
+ Desc
->NextDesc
;};
164 inline void operator ++() {operator ++(0);};
165 inline bool end() const {return Desc
== Owner
->DescP
?true:false;};
166 inline void operator =(const DescIterator
&B
) {Desc
= B
.Desc
; Owner
= B
.Owner
;};
169 inline bool operator ==(const DescIterator
&B
) const {return Desc
== B
.Desc
;};
170 inline bool operator !=(const DescIterator
&B
) const {return Desc
!= B
.Desc
;};
171 int CompareDesc(const DescIterator
&B
) const;
174 inline Description
*operator ->() {return Desc
;};
175 inline Description
const *operator ->() const {return Desc
;};
176 inline Description
&operator *() {return *Desc
;};
177 inline Description
const &operator *() const {return *Desc
;};
178 inline operator Description
*() {return Desc
== Owner
->DescP
?0:Desc
;};
179 inline operator Description
const *() const {return Desc
== Owner
->DescP
?0:Desc
;};
180 inline pkgCache
*Cache() {return Owner
;};
182 inline const char *LanguageCode() const {return Owner
->StrP
+ Desc
->language_code
;};
183 inline const char *md5() const {return Owner
->StrP
+ Desc
->md5sum
;};
184 inline DescFileIterator
FileList() const;
185 inline unsigned long Index() const {return Desc
- Owner
->DescP
;};
187 inline DescIterator() : Desc(0), Owner(0) {};
188 inline DescIterator(pkgCache
&Owner
,Description
*Trg
= 0) : Desc(Trg
),
196 // Dependency iterator
197 class pkgCache::DepIterator
200 enum {DepVer
, DepRev
} Type
;
208 void operator ++(int) {if (Dep
!= Owner
->DepP
) Dep
= Owner
->DepP
+
209 (Type
== DepVer
?Dep
->NextDepends
:Dep
->NextRevDepends
);};
210 inline void operator ++() {operator ++(0);};
211 inline bool end() const {return Owner
== 0 || Dep
== Owner
->DepP
?true:false;};
214 inline bool operator ==(const DepIterator
&B
) const {return Dep
== B
.Dep
;};
215 inline bool operator !=(const DepIterator
&B
) const {return Dep
!= B
.Dep
;};
218 inline Dependency
*operator ->() {return Dep
;};
219 inline Dependency
const *operator ->() const {return Dep
;};
220 inline Dependency
&operator *() {return *Dep
;};
221 inline Dependency
const &operator *() const {return *Dep
;};
222 inline operator Dependency
*() {return Dep
== Owner
->DepP
?0:Dep
;};
223 inline operator Dependency
const *() const {return Dep
== Owner
->DepP
?0:Dep
;};
224 inline pkgCache
*Cache() {return Owner
;};
226 inline const char *TargetVer() const {return Dep
->Version
== 0?0:Owner
->StrP
+ Dep
->Version
;};
227 inline PkgIterator
TargetPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Dep
->Package
);};
228 inline PkgIterator
SmartTargetPkg() {PkgIterator
R(*Owner
,0);SmartTargetPkg(R
);return R
;};
229 inline VerIterator
ParentVer() {return VerIterator(*Owner
,Owner
->VerP
+ Dep
->ParentVer
);};
230 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Dep
->ParentVer
].ParentPkg
);};
231 inline bool Reverse() {return Type
== DepRev
;};
232 inline unsigned long Index() const {return Dep
- Owner
->DepP
;};
234 void GlobOr(DepIterator
&Start
,DepIterator
&End
);
235 Version
**AllTargets();
236 bool SmartTargetPkg(PkgIterator
&Result
);
237 inline const char *CompType() {return Owner
->CompType(Dep
->CompareOp
);};
238 inline const char *DepType() {return Owner
->DepType(Dep
->Type
);};
240 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Version
* = 0) :
241 Dep(Trg
), Type(DepVer
), Owner(&Owner
)
246 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Package
*) :
247 Dep(Trg
), Type(DepRev
), Owner(&Owner
)
252 inline DepIterator() : Dep(0), Type(DepVer
), Owner(0) {};
256 class pkgCache::PrvIterator
259 enum {PrvVer
, PrvPkg
} Type
;
267 void operator ++(int) {if (Prv
!= Owner
->ProvideP
) Prv
= Owner
->ProvideP
+
268 (Type
== PrvVer
?Prv
->NextPkgProv
:Prv
->NextProvides
);};
269 inline void operator ++() {operator ++(0);};
270 inline bool end() const {return Owner
== 0 || Prv
== Owner
->ProvideP
?true:false;};
273 inline bool operator ==(const PrvIterator
&B
) const {return Prv
== B
.Prv
;};
274 inline bool operator !=(const PrvIterator
&B
) const {return Prv
!= B
.Prv
;};
277 inline Provides
*operator ->() {return Prv
;};
278 inline Provides
const *operator ->() const {return Prv
;};
279 inline Provides
&operator *() {return *Prv
;};
280 inline Provides
const &operator *() const {return *Prv
;};
281 inline operator Provides
*() {return Prv
== Owner
->ProvideP
?0:Prv
;};
282 inline operator Provides
const *() const {return Prv
== Owner
->ProvideP
?0:Prv
;};
283 inline pkgCache
*Cache() {return Owner
;};
285 inline const char *Name() const {return Owner
->StrP
+ Owner
->PkgP
[Prv
->ParentPkg
].Name
;};
286 inline const char *ProvideVersion() const {return Prv
->ProvideVersion
== 0?0:Owner
->StrP
+ Prv
->ProvideVersion
;};
287 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Prv
->ParentPkg
);};
288 inline VerIterator
OwnerVer() {return VerIterator(*Owner
,Owner
->VerP
+ Prv
->Version
);};
289 inline PkgIterator
OwnerPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Prv
->Version
].ParentPkg
);};
290 inline unsigned long Index() const {return Prv
- Owner
->ProvideP
;};
292 inline PrvIterator() : Prv(0), Type(PrvVer
), Owner(0) {};
294 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Version
*) :
295 Prv(Trg
), Type(PrvVer
), Owner(&Owner
)
298 Prv
= Owner
.ProvideP
;
300 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Package
*) :
301 Prv(Trg
), Type(PrvPkg
), Owner(&Owner
)
304 Prv
= Owner
.ProvideP
;
309 class pkgCache::PkgFileIterator
317 void operator ++(int) {if (File
!= Owner
->PkgFileP
) File
= Owner
->PkgFileP
+ File
->NextFile
;};
318 inline void operator ++() {operator ++(0);};
319 inline bool end() const {return File
== Owner
->PkgFileP
?true:false;};
322 inline bool operator ==(const PkgFileIterator
&B
) const {return File
== B
.File
;};
323 inline bool operator !=(const PkgFileIterator
&B
) const {return File
!= B
.File
;};
326 inline PackageFile
*operator ->() {return File
;};
327 inline PackageFile
const *operator ->() const {return File
;};
328 inline PackageFile
const &operator *() const {return *File
;};
329 inline operator PackageFile
*() {return File
== Owner
->PkgFileP
?0:File
;};
330 inline operator PackageFile
const *() const {return File
== Owner
->PkgFileP
?0:File
;};
331 inline pkgCache
*Cache() {return Owner
;};
333 inline const char *FileName() const {return File
->FileName
== 0?0:Owner
->StrP
+ File
->FileName
;};
334 inline const char *Archive() const {return File
->Archive
== 0?0:Owner
->StrP
+ File
->Archive
;};
335 inline const char *Component() const {return File
->Component
== 0?0:Owner
->StrP
+ File
->Component
;};
336 inline const char *Version() const {return File
->Version
== 0?0:Owner
->StrP
+ File
->Version
;};
337 inline const char *Origin() const {return File
->Origin
== 0?0:Owner
->StrP
+ File
->Origin
;};
338 inline const char *Label() const {return File
->Label
== 0?0:Owner
->StrP
+ File
->Label
;};
339 inline const char *Site() const {return File
->Site
== 0?0:Owner
->StrP
+ File
->Site
;};
340 inline const char *Architecture() const {return File
->Architecture
== 0?0:Owner
->StrP
+ File
->Architecture
;};
341 inline const char *IndexType() const {return File
->IndexType
== 0?0:Owner
->StrP
+ File
->IndexType
;};
343 inline unsigned long Index() const {return File
- Owner
->PkgFileP
;};
349 inline PkgFileIterator() : Owner(0), File(0) {};
350 inline PkgFileIterator(pkgCache
&Owner
) : Owner(&Owner
), File(Owner
.PkgFileP
) {};
351 inline PkgFileIterator(pkgCache
&Owner
,PackageFile
*Trg
) : Owner(&Owner
), File(Trg
) {};
355 class pkgCache::VerFileIterator
363 void operator ++(int) {if (FileP
!= Owner
->VerFileP
) FileP
= Owner
->VerFileP
+ FileP
->NextFile
;};
364 inline void operator ++() {operator ++(0);};
365 inline bool end() const {return FileP
== Owner
->VerFileP
?true:false;};
368 inline bool operator ==(const VerFileIterator
&B
) const {return FileP
== B
.FileP
;};
369 inline bool operator !=(const VerFileIterator
&B
) const {return FileP
!= B
.FileP
;};
372 inline VerFile
*operator ->() {return FileP
;};
373 inline VerFile
const *operator ->() const {return FileP
;};
374 inline VerFile
const &operator *() const {return *FileP
;};
375 inline operator VerFile
*() {return FileP
== Owner
->VerFileP
?0:FileP
;};
376 inline operator VerFile
const *() const {return FileP
== Owner
->VerFileP
?0:FileP
;};
377 inline pkgCache
*Cache() {return Owner
;};
379 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
380 inline unsigned long Index() const {return FileP
- Owner
->VerFileP
;};
382 inline VerFileIterator() : Owner(0), FileP(0) {};
383 inline VerFileIterator(pkgCache
&Owner
,VerFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
387 class pkgCache::DescFileIterator
395 void operator ++(int) {if (FileP
!= Owner
->DescFileP
) FileP
= Owner
->DescFileP
+ FileP
->NextFile
;};
396 inline void operator ++() {operator ++(0);};
397 inline bool end() const {return FileP
== Owner
->DescFileP
?true:false;};
400 inline bool operator ==(const DescFileIterator
&B
) const {return FileP
== B
.FileP
;};
401 inline bool operator !=(const DescFileIterator
&B
) const {return FileP
!= B
.FileP
;};
404 inline DescFile
*operator ->() {return FileP
;};
405 inline DescFile
const *operator ->() const {return FileP
;};
406 inline DescFile
const &operator *() const {return *FileP
;};
407 inline operator DescFile
*() {return FileP
== Owner
->DescFileP
?0:FileP
;};
408 inline operator DescFile
const *() const {return FileP
== Owner
->DescFileP
?0:FileP
;};
409 inline pkgCache
*Cache() {return Owner
;};
411 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
412 inline unsigned long Index() const {return FileP
- Owner
->DescFileP
;};
414 inline DescFileIterator() : Owner(0), FileP(0) {};
415 inline DescFileIterator(pkgCache
&Owner
,DescFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
418 // Inlined Begin functions cant be in the class because of order problems
419 inline pkgCache::VerIterator
pkgCache::PkgIterator::VersionList() const
420 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->VersionList
);};
421 inline pkgCache::VerIterator
pkgCache::PkgIterator::CurrentVer() const
422 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->CurrentVer
);};
423 inline pkgCache::DepIterator
pkgCache::PkgIterator::RevDependsList() const
424 {return DepIterator(*Owner
,Owner
->DepP
+ Pkg
->RevDepends
,Pkg
);};
425 inline pkgCache::PrvIterator
pkgCache::PkgIterator::ProvidesList() const
426 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Pkg
->ProvidesList
,Pkg
);};
427 inline pkgCache::DescIterator
pkgCache::VerIterator::DescriptionList() const
428 {return DescIterator(*Owner
,Owner
->DescP
+ Ver
->DescriptionList
);};
429 inline pkgCache::PrvIterator
pkgCache::VerIterator::ProvidesList() const
430 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Ver
->ProvidesList
,Ver
);};
431 inline pkgCache::DepIterator
pkgCache::VerIterator::DependsList() const
432 {return DepIterator(*Owner
,Owner
->DepP
+ Ver
->DependsList
,Ver
);};
433 inline pkgCache::VerFileIterator
pkgCache::VerIterator::FileList() const
434 {return VerFileIterator(*Owner
,Owner
->VerFileP
+ Ver
->FileList
);};
435 inline pkgCache::DescFileIterator
pkgCache::DescIterator::FileList() const
436 {return DescFileIterator(*Owner
,Owner
->DescFileP
+ Desc
->FileList
);};