]>
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 Owner
== NULL
|| (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 DescIterator
TranslatedDescription() const;
133 inline DepIterator
DependsList() const;
134 inline PrvIterator
ProvidesList() const;
135 inline VerFileIterator
FileList() const;
136 inline unsigned long Index() const {return Ver
- Owner
->VerP
;};
137 bool Downloadable() const;
138 inline const char *PriorityType() {return Owner
->Priority(Ver
->Priority
);};
141 bool Automatic() const;
142 VerFileIterator
NewestFile() const;
144 inline VerIterator() : Ver(0), Owner(0) {};
145 inline VerIterator(pkgCache
&Owner
,Version
*Trg
= 0) : Ver(Trg
),
153 // Description Iterator
154 class pkgCache::DescIterator
164 void operator ++(int) {if (Desc
!= Owner
->DescP
) Desc
= Owner
->DescP
+ Desc
->NextDesc
;};
165 inline void operator ++() {operator ++(0);};
166 inline bool end() const {return Desc
== Owner
->DescP
?true:false;};
167 inline void operator =(const DescIterator
&B
) {Desc
= B
.Desc
; Owner
= B
.Owner
;};
170 inline bool operator ==(const DescIterator
&B
) const {return Desc
== B
.Desc
;};
171 inline bool operator !=(const DescIterator
&B
) const {return Desc
!= B
.Desc
;};
172 int CompareDesc(const DescIterator
&B
) const;
175 inline Description
*operator ->() {return Desc
;};
176 inline Description
const *operator ->() const {return Desc
;};
177 inline Description
&operator *() {return *Desc
;};
178 inline Description
const &operator *() const {return *Desc
;};
179 inline operator Description
*() {return Desc
== Owner
->DescP
?0:Desc
;};
180 inline operator Description
const *() const {return Desc
== Owner
->DescP
?0:Desc
;};
181 inline pkgCache
*Cache() {return Owner
;};
183 inline const char *LanguageCode() const {return Owner
->StrP
+ Desc
->language_code
;};
184 inline const char *md5() const {return Owner
->StrP
+ Desc
->md5sum
;};
185 inline DescFileIterator
FileList() const;
186 inline unsigned long Index() const {return Desc
- Owner
->DescP
;};
188 inline DescIterator() : Desc(0), Owner(0) {};
189 inline DescIterator(pkgCache
&Owner
,Description
*Trg
= 0) : Desc(Trg
),
197 // Dependency iterator
198 class pkgCache::DepIterator
201 enum {DepVer
, DepRev
} Type
;
209 void operator ++(int) {if (Dep
!= Owner
->DepP
) Dep
= Owner
->DepP
+
210 (Type
== DepVer
?Dep
->NextDepends
:Dep
->NextRevDepends
);};
211 inline void operator ++() {operator ++(0);};
212 inline bool end() const {return Owner
== 0 || Dep
== Owner
->DepP
?true:false;};
215 inline bool operator ==(const DepIterator
&B
) const {return Dep
== B
.Dep
;};
216 inline bool operator !=(const DepIterator
&B
) const {return Dep
!= B
.Dep
;};
219 inline Dependency
*operator ->() {return Dep
;};
220 inline Dependency
const *operator ->() const {return Dep
;};
221 inline Dependency
&operator *() {return *Dep
;};
222 inline Dependency
const &operator *() const {return *Dep
;};
223 inline operator Dependency
*() {return Dep
== Owner
->DepP
?0:Dep
;};
224 inline operator Dependency
const *() const {return Dep
== Owner
->DepP
?0:Dep
;};
225 inline pkgCache
*Cache() {return Owner
;};
227 inline const char *TargetVer() const {return Dep
->Version
== 0?0:Owner
->StrP
+ Dep
->Version
;};
228 inline PkgIterator
TargetPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Dep
->Package
);};
229 inline PkgIterator
SmartTargetPkg() {PkgIterator
R(*Owner
,0);SmartTargetPkg(R
);return R
;};
230 inline VerIterator
ParentVer() {return VerIterator(*Owner
,Owner
->VerP
+ Dep
->ParentVer
);};
231 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Dep
->ParentVer
].ParentPkg
);};
232 inline bool Reverse() {return Type
== DepRev
;};
233 inline unsigned long Index() const {return Dep
- Owner
->DepP
;};
235 void GlobOr(DepIterator
&Start
,DepIterator
&End
);
236 Version
**AllTargets();
237 bool SmartTargetPkg(PkgIterator
&Result
);
238 inline const char *CompType() {return Owner
->CompType(Dep
->CompareOp
);};
239 inline const char *DepType() {return Owner
->DepType(Dep
->Type
);};
241 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Version
* = 0) :
242 Dep(Trg
), Type(DepVer
), Owner(&Owner
)
247 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Package
*) :
248 Dep(Trg
), Type(DepRev
), Owner(&Owner
)
253 inline DepIterator() : Dep(0), Type(DepVer
), Owner(0) {};
257 class pkgCache::PrvIterator
260 enum {PrvVer
, PrvPkg
} Type
;
268 void operator ++(int) {if (Prv
!= Owner
->ProvideP
) Prv
= Owner
->ProvideP
+
269 (Type
== PrvVer
?Prv
->NextPkgProv
:Prv
->NextProvides
);};
270 inline void operator ++() {operator ++(0);};
271 inline bool end() const {return Owner
== 0 || Prv
== Owner
->ProvideP
?true:false;};
274 inline bool operator ==(const PrvIterator
&B
) const {return Prv
== B
.Prv
;};
275 inline bool operator !=(const PrvIterator
&B
) const {return Prv
!= B
.Prv
;};
278 inline Provides
*operator ->() {return Prv
;};
279 inline Provides
const *operator ->() const {return Prv
;};
280 inline Provides
&operator *() {return *Prv
;};
281 inline Provides
const &operator *() const {return *Prv
;};
282 inline operator Provides
*() {return Prv
== Owner
->ProvideP
?0:Prv
;};
283 inline operator Provides
const *() const {return Prv
== Owner
->ProvideP
?0:Prv
;};
284 inline pkgCache
*Cache() {return Owner
;};
286 inline const char *Name() const {return Owner
->StrP
+ Owner
->PkgP
[Prv
->ParentPkg
].Name
;};
287 inline const char *ProvideVersion() const {return Prv
->ProvideVersion
== 0?0:Owner
->StrP
+ Prv
->ProvideVersion
;};
288 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Prv
->ParentPkg
);};
289 inline VerIterator
OwnerVer() {return VerIterator(*Owner
,Owner
->VerP
+ Prv
->Version
);};
290 inline PkgIterator
OwnerPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Prv
->Version
].ParentPkg
);};
291 inline unsigned long Index() const {return Prv
- Owner
->ProvideP
;};
293 inline PrvIterator() : Prv(0), Type(PrvVer
), Owner(0) {};
295 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Version
*) :
296 Prv(Trg
), Type(PrvVer
), Owner(&Owner
)
299 Prv
= Owner
.ProvideP
;
301 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Package
*) :
302 Prv(Trg
), Type(PrvPkg
), Owner(&Owner
)
305 Prv
= Owner
.ProvideP
;
310 class pkgCache::PkgFileIterator
318 void operator ++(int) {if (File
!= Owner
->PkgFileP
) File
= Owner
->PkgFileP
+ File
->NextFile
;};
319 inline void operator ++() {operator ++(0);};
320 inline bool end() const {return File
== Owner
->PkgFileP
?true:false;};
323 inline bool operator ==(const PkgFileIterator
&B
) const {return File
== B
.File
;};
324 inline bool operator !=(const PkgFileIterator
&B
) const {return File
!= B
.File
;};
327 inline PackageFile
*operator ->() {return File
;};
328 inline PackageFile
const *operator ->() const {return File
;};
329 inline PackageFile
const &operator *() const {return *File
;};
330 inline operator PackageFile
*() {return File
== Owner
->PkgFileP
?0:File
;};
331 inline operator PackageFile
const *() const {return File
== Owner
->PkgFileP
?0:File
;};
332 inline pkgCache
*Cache() {return Owner
;};
334 inline const char *FileName() const {return File
->FileName
== 0?0:Owner
->StrP
+ File
->FileName
;};
335 inline const char *Archive() const {return File
->Archive
== 0?0:Owner
->StrP
+ File
->Archive
;};
336 inline const char *Component() const {return File
->Component
== 0?0:Owner
->StrP
+ File
->Component
;};
337 inline const char *Version() const {return File
->Version
== 0?0:Owner
->StrP
+ File
->Version
;};
338 inline const char *Origin() const {return File
->Origin
== 0?0:Owner
->StrP
+ File
->Origin
;};
339 inline const char *Label() const {return File
->Label
== 0?0:Owner
->StrP
+ File
->Label
;};
340 inline const char *Site() const {return File
->Site
== 0?0:Owner
->StrP
+ File
->Site
;};
341 inline const char *Architecture() const {return File
->Architecture
== 0?0:Owner
->StrP
+ File
->Architecture
;};
342 inline const char *IndexType() const {return File
->IndexType
== 0?0:Owner
->StrP
+ File
->IndexType
;};
344 inline unsigned long Index() const {return File
- Owner
->PkgFileP
;};
350 inline PkgFileIterator() : Owner(0), File(0) {};
351 inline PkgFileIterator(pkgCache
&Owner
) : Owner(&Owner
), File(Owner
.PkgFileP
) {};
352 inline PkgFileIterator(pkgCache
&Owner
,PackageFile
*Trg
) : Owner(&Owner
), File(Trg
) {};
356 class pkgCache::VerFileIterator
364 void operator ++(int) {if (FileP
!= Owner
->VerFileP
) FileP
= Owner
->VerFileP
+ FileP
->NextFile
;};
365 inline void operator ++() {operator ++(0);};
366 inline bool end() const {return FileP
== Owner
->VerFileP
?true:false;};
369 inline bool operator ==(const VerFileIterator
&B
) const {return FileP
== B
.FileP
;};
370 inline bool operator !=(const VerFileIterator
&B
) const {return FileP
!= B
.FileP
;};
373 inline VerFile
*operator ->() {return FileP
;};
374 inline VerFile
const *operator ->() const {return FileP
;};
375 inline VerFile
const &operator *() const {return *FileP
;};
376 inline operator VerFile
*() {return FileP
== Owner
->VerFileP
?0:FileP
;};
377 inline operator VerFile
const *() const {return FileP
== Owner
->VerFileP
?0:FileP
;};
378 inline pkgCache
*Cache() {return Owner
;};
380 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
381 inline unsigned long Index() const {return FileP
- Owner
->VerFileP
;};
383 inline VerFileIterator() : Owner(0), FileP(0) {};
384 inline VerFileIterator(pkgCache
&Owner
,VerFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
388 class pkgCache::DescFileIterator
396 void operator ++(int) {if (FileP
!= Owner
->DescFileP
) FileP
= Owner
->DescFileP
+ FileP
->NextFile
;};
397 inline void operator ++() {operator ++(0);};
398 inline bool end() const {return FileP
== Owner
->DescFileP
?true:false;};
401 inline bool operator ==(const DescFileIterator
&B
) const {return FileP
== B
.FileP
;};
402 inline bool operator !=(const DescFileIterator
&B
) const {return FileP
!= B
.FileP
;};
405 inline DescFile
*operator ->() {return FileP
;};
406 inline DescFile
const *operator ->() const {return FileP
;};
407 inline DescFile
const &operator *() const {return *FileP
;};
408 inline operator DescFile
*() {return FileP
== Owner
->DescFileP
?0:FileP
;};
409 inline operator DescFile
const *() const {return FileP
== Owner
->DescFileP
?0:FileP
;};
410 inline pkgCache
*Cache() {return Owner
;};
412 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
413 inline unsigned long Index() const {return FileP
- Owner
->DescFileP
;};
415 inline DescFileIterator() : Owner(0), FileP(0) {};
416 inline DescFileIterator(pkgCache
&Owner
,DescFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
419 // Inlined Begin functions cant be in the class because of order problems
420 inline pkgCache::VerIterator
pkgCache::PkgIterator::VersionList() const
421 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->VersionList
);};
422 inline pkgCache::VerIterator
pkgCache::PkgIterator::CurrentVer() const
423 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->CurrentVer
);};
424 inline pkgCache::DepIterator
pkgCache::PkgIterator::RevDependsList() const
425 {return DepIterator(*Owner
,Owner
->DepP
+ Pkg
->RevDepends
,Pkg
);};
426 inline pkgCache::PrvIterator
pkgCache::PkgIterator::ProvidesList() const
427 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Pkg
->ProvidesList
,Pkg
);};
428 inline pkgCache::DescIterator
pkgCache::VerIterator::DescriptionList() const
429 {return DescIterator(*Owner
,Owner
->DescP
+ Ver
->DescriptionList
);};
430 inline pkgCache::PrvIterator
pkgCache::VerIterator::ProvidesList() const
431 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Ver
->ProvidesList
,Ver
);};
432 inline pkgCache::DepIterator
pkgCache::VerIterator::DependsList() const
433 {return DepIterator(*Owner
,Owner
->DepP
+ Ver
->DependsList
,Ver
);};
434 inline pkgCache::VerFileIterator
pkgCache::VerIterator::FileList() const
435 {return VerFileIterator(*Owner
,Owner
->VerFileP
+ Ver
->FileList
);};
436 inline pkgCache::DescFileIterator
pkgCache::DescIterator::FileList() const
437 {return DescFileIterator(*Owner
,Owner
->DescFileP
+ Desc
->FileList
);};