]>
git.saurik.com Git - apt.git/blob - apt-pkg/cacheiterators.h
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: cacheiterators.h,v 1.18 2003/10/09 23:15:25 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
TargetVer() const;
82 inline VerIterator
CurrentVer() const;
83 inline DepIterator
RevDependsList() const;
84 inline PrvIterator
ProvidesList() const;
85 inline unsigned long Index() const {return Pkg
- Owner
->PkgP
;};
86 OkState
State() const;
89 inline PkgIterator(pkgCache
&Owner
,Package
*Trg
) : Pkg(Trg
), Owner(&Owner
),
95 inline PkgIterator() : Pkg(0), Owner(0), HashIndex(0) {};
99 class pkgCache::VerIterator
109 void operator ++(int) {if (Ver
!= Owner
->VerP
) Ver
= Owner
->VerP
+ Ver
->NextVer
;};
110 inline void operator ++() {operator ++(0);};
111 inline bool end() const {return Ver
== Owner
->VerP
?true:false;};
112 inline void operator =(const VerIterator
&B
) {Ver
= B
.Ver
; Owner
= B
.Owner
;};
115 inline bool operator ==(const VerIterator
&B
) const {return Ver
== B
.Ver
;};
116 inline bool operator !=(const VerIterator
&B
) const {return Ver
!= B
.Ver
;};
117 int CompareVer(const VerIterator
&B
) const;
120 inline Version
*operator ->() {return Ver
;};
121 inline Version
const *operator ->() const {return Ver
;};
122 inline Version
&operator *() {return *Ver
;};
123 inline Version
const &operator *() const {return *Ver
;};
124 inline operator Version
*() {return Ver
== Owner
->VerP
?0:Ver
;};
125 inline operator Version
const *() const {return Ver
== Owner
->VerP
?0:Ver
;};
126 inline pkgCache
*Cache() {return Owner
;};
128 inline const char *VerStr() const {return Ver
->VerStr
== 0?0:Owner
->StrP
+ Ver
->VerStr
;};
129 inline const char *Section() const {return Ver
->Section
== 0?0:Owner
->StrP
+ Ver
->Section
;};
130 inline const char *Arch() const {return Ver
->Arch
== 0?0:Owner
->StrP
+ Ver
->Arch
;};
131 inline PkgIterator
ParentPkg() const {return PkgIterator(*Owner
,Owner
->PkgP
+ Ver
->ParentPkg
);};
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 // Dependency iterator
153 class pkgCache::DepIterator
156 enum {DepVer
, DepRev
} Type
;
164 void operator ++(int) {if (Dep
!= Owner
->DepP
) Dep
= Owner
->DepP
+
165 (Type
== DepVer
?Dep
->NextDepends
:Dep
->NextRevDepends
);};
166 inline void operator ++() {operator ++(0);};
167 inline bool end() const {return Owner
== 0 || Dep
== Owner
->DepP
?true:false;};
170 inline bool operator ==(const DepIterator
&B
) const {return Dep
== B
.Dep
;};
171 inline bool operator !=(const DepIterator
&B
) const {return Dep
!= B
.Dep
;};
174 inline Dependency
*operator ->() {return Dep
;};
175 inline Dependency
const *operator ->() const {return Dep
;};
176 inline Dependency
&operator *() {return *Dep
;};
177 inline Dependency
const &operator *() const {return *Dep
;};
178 inline operator Dependency
*() {return Dep
== Owner
->DepP
?0:Dep
;};
179 inline operator Dependency
const *() const {return Dep
== Owner
->DepP
?0:Dep
;};
180 inline pkgCache
*Cache() {return Owner
;};
182 inline const char *TargetVer() const {return Dep
->Version
== 0?0:Owner
->StrP
+ Dep
->Version
;};
183 inline PkgIterator
TargetPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Dep
->Package
);};
184 inline PkgIterator
SmartTargetPkg() {PkgIterator
R(*Owner
,0);SmartTargetPkg(R
);return R
;};
185 inline VerIterator
ParentVer() {return VerIterator(*Owner
,Owner
->VerP
+ Dep
->ParentVer
);};
186 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Dep
->ParentVer
].ParentPkg
);};
187 inline bool Reverse() {return Type
== DepRev
;};
188 inline unsigned long Index() const {return Dep
- Owner
->DepP
;};
190 void GlobOr(DepIterator
&Start
,DepIterator
&End
);
191 Version
**AllTargets();
192 bool SmartTargetPkg(PkgIterator
&Result
);
193 inline const char *CompType() {return Owner
->CompType(Dep
->CompareOp
);};
194 inline const char *DepType() {return Owner
->DepType(Dep
->Type
);};
196 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Version
* = 0) :
197 Dep(Trg
), Type(DepVer
), Owner(&Owner
)
202 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Package
*) :
203 Dep(Trg
), Type(DepRev
), Owner(&Owner
)
208 inline DepIterator() : Dep(0), Type(DepVer
), Owner(0) {};
212 class pkgCache::PrvIterator
215 enum {PrvVer
, PrvPkg
} Type
;
223 void operator ++(int) {if (Prv
!= Owner
->ProvideP
) Prv
= Owner
->ProvideP
+
224 (Type
== PrvVer
?Prv
->NextPkgProv
:Prv
->NextProvides
);};
225 inline void operator ++() {operator ++(0);};
226 inline bool end() const {return Prv
== Owner
->ProvideP
?true:false;};
229 inline bool operator ==(const PrvIterator
&B
) const {return Prv
== B
.Prv
;};
230 inline bool operator !=(const PrvIterator
&B
) const {return Prv
!= B
.Prv
;};
233 inline Provides
*operator ->() {return Prv
;};
234 inline Provides
const *operator ->() const {return Prv
;};
235 inline Provides
&operator *() {return *Prv
;};
236 inline Provides
const &operator *() const {return *Prv
;};
237 inline operator Provides
*() {return Prv
== Owner
->ProvideP
?0:Prv
;};
238 inline operator Provides
const *() const {return Prv
== Owner
->ProvideP
?0:Prv
;};
239 inline pkgCache
*Cache() {return Owner
;};
241 inline const char *Name() const {return Owner
->StrP
+ Owner
->PkgP
[Prv
->ParentPkg
].Name
;};
242 inline const char *ProvideVersion() const {return Prv
->ProvideVersion
== 0?0:Owner
->StrP
+ Prv
->ProvideVersion
;};
243 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Prv
->ParentPkg
);};
244 inline VerIterator
OwnerVer() {return VerIterator(*Owner
,Owner
->VerP
+ Prv
->Version
);};
245 inline PkgIterator
OwnerPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Prv
->Version
].ParentPkg
);};
246 inline unsigned long Index() const {return Prv
- Owner
->ProvideP
;};
248 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Version
*) :
249 Prv(Trg
), Type(PrvVer
), Owner(&Owner
)
252 Prv
= Owner
.ProvideP
;
254 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Package
*) :
255 Prv(Trg
), Type(PrvPkg
), Owner(&Owner
)
258 Prv
= Owner
.ProvideP
;
263 class pkgCache::PkgFileIterator
271 void operator ++(int) {if (File
!= Owner
->PkgFileP
) File
= Owner
->PkgFileP
+ File
->NextFile
;};
272 inline void operator ++() {operator ++(0);};
273 inline bool end() const {return File
== Owner
->PkgFileP
?true:false;};
276 inline bool operator ==(const PkgFileIterator
&B
) const {return File
== B
.File
;};
277 inline bool operator !=(const PkgFileIterator
&B
) const {return File
!= B
.File
;};
280 inline PackageFile
*operator ->() {return File
;};
281 inline PackageFile
const *operator ->() const {return File
;};
282 inline PackageFile
const &operator *() const {return *File
;};
283 inline operator PackageFile
*() {return File
== Owner
->PkgFileP
?0:File
;};
284 inline operator PackageFile
const *() const {return File
== Owner
->PkgFileP
?0:File
;};
285 inline pkgCache
*Cache() {return Owner
;};
287 inline const char *FileName() const {return File
->FileName
== 0?0:Owner
->StrP
+ File
->FileName
;};
288 inline const char *Archive() const {return File
->Archive
== 0?0:Owner
->StrP
+ File
->Archive
;};
289 inline const char *Component() const {return File
->Component
== 0?0:Owner
->StrP
+ File
->Component
;};
290 inline const char *Version() const {return File
->Version
== 0?0:Owner
->StrP
+ File
->Version
;};
291 inline const char *Origin() const {return File
->Origin
== 0?0:Owner
->StrP
+ File
->Origin
;};
292 inline const char *Label() const {return File
->Label
== 0?0:Owner
->StrP
+ File
->Label
;};
293 inline const char *Site() const {return File
->Site
== 0?0:Owner
->StrP
+ File
->Site
;};
294 inline const char *Architecture() const {return File
->Architecture
== 0?0:Owner
->StrP
+ File
->Architecture
;};
295 inline const char *IndexType() const {return File
->IndexType
== 0?0:Owner
->StrP
+ File
->IndexType
;};
297 inline unsigned long Index() const {return File
- Owner
->PkgFileP
;};
303 inline PkgFileIterator() : Owner(0), File(0) {};
304 inline PkgFileIterator(pkgCache
&Owner
) : Owner(&Owner
), File(Owner
.PkgFileP
) {};
305 inline PkgFileIterator(pkgCache
&Owner
,PackageFile
*Trg
) : Owner(&Owner
), File(Trg
) {};
309 class pkgCache::VerFileIterator
317 void operator ++(int) {if (FileP
!= Owner
->VerFileP
) FileP
= Owner
->VerFileP
+ FileP
->NextFile
;};
318 inline void operator ++() {operator ++(0);};
319 inline bool end() const {return FileP
== Owner
->VerFileP
?true:false;};
322 inline bool operator ==(const VerFileIterator
&B
) const {return FileP
== B
.FileP
;};
323 inline bool operator !=(const VerFileIterator
&B
) const {return FileP
!= B
.FileP
;};
326 inline VerFile
*operator ->() {return FileP
;};
327 inline VerFile
const *operator ->() const {return FileP
;};
328 inline VerFile
const &operator *() const {return *FileP
;};
329 inline operator VerFile
*() {return FileP
== Owner
->VerFileP
?0:FileP
;};
330 inline operator VerFile
const *() const {return FileP
== Owner
->VerFileP
?0:FileP
;};
331 inline pkgCache
*Cache() {return Owner
;};
333 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
334 inline unsigned long Index() const {return FileP
- Owner
->VerFileP
;};
336 inline VerFileIterator() : Owner(0), FileP(0) {};
337 inline VerFileIterator(pkgCache
&Owner
,VerFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
340 // Inlined Begin functions cant be in the class because of order problems
341 inline pkgCache::VerIterator
pkgCache::PkgIterator::VersionList() const
342 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->VersionList
);};
343 inline pkgCache::VerIterator
pkgCache::PkgIterator::CurrentVer() const
344 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->CurrentVer
);};
345 inline pkgCache::DepIterator
pkgCache::PkgIterator::RevDependsList() const
346 {return DepIterator(*Owner
,Owner
->DepP
+ Pkg
->RevDepends
,Pkg
);};
347 inline pkgCache::PrvIterator
pkgCache::PkgIterator::ProvidesList() const
348 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Pkg
->ProvidesList
,Pkg
);};
349 inline pkgCache::PrvIterator
pkgCache::VerIterator::ProvidesList() const
350 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Ver
->ProvidesList
,Ver
);};
351 inline pkgCache::DepIterator
pkgCache::VerIterator::DependsList() const
352 {return DepIterator(*Owner
,Owner
->DepP
+ Ver
->DependsList
,Ver
);};
353 inline pkgCache::VerFileIterator
pkgCache::VerIterator::FileList() const
354 {return VerFileIterator(*Owner
,Owner
->VerFileP
+ Ver
->FileList
);};