]>
git.saurik.com Git - apt.git/blob - apt-pkg/cacheiterators.h
f12491fe18d4f945098960ea5bab53a07fc7bbd4
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: cacheiterators.h,v 1.3 1998/07/05 05:33:52 jgg 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.
26 This header is not user includable, please use pkglib/pkgcache.h
28 ##################################################################### */
30 // Header section: pkglib
31 #ifndef PKGLIB_CACHEITERATORS_H
32 #define PKGLIB_CACHEITERATORS_H
35 class pkgCache::PkgIterator
43 enum OkState
{NeedsNothing
,NeedsUnpack
,NeedsConfigure
};
46 void operator ++(int);
47 inline void operator ++() {operator ++(0);};
48 inline bool end() const {return Owner
== 0 || Pkg
== Owner
->PkgP
?true:false;};
51 inline bool operator ==(const PkgIterator
&B
) const {return Pkg
== B
.Pkg
;};
52 inline bool operator !=(const PkgIterator
&B
) const {return Pkg
!= B
.Pkg
;};
55 inline Package
*operator ->() {return Pkg
;};
56 inline Package
const *operator ->() const {return Pkg
;};
57 inline Package
const &operator *() const {return *Pkg
;};
58 inline operator Package
*() {return Pkg
== Owner
->PkgP
?0:Pkg
;};
59 inline operator Package
const *() const {return Pkg
== Owner
->PkgP
?0:Pkg
;};
60 inline const char *Name() const {return Pkg
->Name
== 0?0:Owner
->StrP
+ Pkg
->Name
;};
61 inline const char *Section() const {return Pkg
->Section
== 0?0:Owner
->StrP
+ Pkg
->Section
;};
62 inline const char *TargetDist() const {return Pkg
->TargetDist
== 0?0:Owner
->StrP
+ Pkg
->TargetDist
;};
63 inline VerIterator
VersionList() const;
64 inline VerIterator
TargetVer() const;
65 inline VerIterator
CurrentVer() const;
66 inline DepIterator
RevDependsList() const;
67 inline PrvIterator
ProvidesList() const;
68 inline unsigned long Index() const {return Pkg
- Owner
->PkgP
;};
69 OkState
State() const;
72 inline PkgIterator(pkgCache
&Owner
) : Owner(&Owner
), HashIndex(-1)
77 inline PkgIterator(pkgCache
&Owner
,Package
*Trg
) : Pkg(Trg
), Owner(&Owner
),
83 inline PkgIterator() : Pkg(0), Owner(0), HashIndex(0) {};
87 class pkgCache::VerIterator
97 void operator ++(int) {if (Ver
!= Owner
.VerP
) Ver
= Owner
.VerP
+ Ver
->NextVer
;};
98 inline void operator ++() {operator ++(0);};
99 inline bool end() const {return Ver
== Owner
.VerP
?true:false;};
100 inline void operator =(const VerIterator
&B
) {Ver
= B
.Ver
;};
103 inline bool operator ==(const VerIterator
&B
) const {return Ver
== B
.Ver
;};
104 inline bool operator !=(const VerIterator
&B
) const {return Ver
!= B
.Ver
;};
105 int CompareVer(const VerIterator
&B
) const;
108 inline Version
*operator ->() {return Ver
;};
109 inline Version
const *operator ->() const {return Ver
;};
110 inline Version
&operator *() {return *Ver
;};
111 inline Version
const &operator *() const {return *Ver
;};
112 inline operator Version
*() {return Ver
== Owner
.VerP
?0:Ver
;};
113 inline operator Version
const *() const {return Ver
== Owner
.VerP
?0:Ver
;};
114 inline const char *VerStr() const {return Ver
->VerStr
== 0?0:Owner
.StrP
+ Ver
->VerStr
;};
115 inline const char *Section() const {return Ver
->Section
== 0?0:Owner
.StrP
+ Ver
->Section
;};
116 inline PkgIterator
ParentPkg() const {return PkgIterator(Owner
,Owner
.PkgP
+ Ver
->ParentPkg
);};
117 inline DepIterator
DependsList() const;
118 inline PrvIterator
ProvidesList() const;
119 inline unsigned long Index() const {return Ver
- Owner
.VerP
;};
120 inline VerFileIterator
FileList() const;
122 inline VerIterator(pkgCache
&Owner
,Version
*Trg
= 0) : Ver(Trg
), Owner(Owner
)
129 // Dependency iterator
130 class pkgCache::DepIterator
133 enum {DepVer
, DepRev
} Type
;
141 void operator ++(int) {if (Dep
!= Owner
->DepP
) Dep
= Owner
->DepP
+
142 (Type
== DepVer
?Dep
->NextDepends
:Dep
->NextRevDepends
);};
143 inline void operator ++() {operator ++(0);};
144 inline bool end() const {return Owner
== 0 || Dep
== Owner
->DepP
?true:false;};
147 inline bool operator ==(const DepIterator
&B
) const {return Dep
== B
.Dep
;};
148 inline bool operator !=(const DepIterator
&B
) const {return Dep
!= B
.Dep
;};
151 inline Dependency
*operator ->() {return Dep
;};
152 inline Dependency
const *operator ->() const {return Dep
;};
153 inline Dependency
&operator *() {return *Dep
;};
154 inline Dependency
const &operator *() const {return *Dep
;};
155 inline operator Dependency
*() {return Dep
== Owner
->DepP
?0:Dep
;};
156 inline operator Dependency
const *() const {return Dep
== Owner
->DepP
?0:Dep
;};
157 inline const char *TargetVer() const {return Dep
->Version
== 0?0:Owner
->StrP
+ Dep
->Version
;};
158 inline PkgIterator
TargetPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Dep
->Package
);};
159 Version
**AllTargets();
160 bool SmartTargetPkg(PkgIterator
&Result
);
161 inline PkgIterator
SmartTargetPkg() {PkgIterator
R(*Owner
);SmartTargetPkg(R
);return R
;};
162 inline VerIterator
ParentVer() {return VerIterator(*Owner
,Owner
->VerP
+ Dep
->ParentVer
);};
163 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Dep
->ParentVer
].ParentPkg
);};
165 inline bool Reverse() {return Type
== DepRev
;};
166 inline unsigned long Index() const {return Dep
- Owner
->DepP
;};
168 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Version
* = 0) :
169 Dep(Trg
), Type(DepVer
), Owner(&Owner
)
174 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Package
*) :
175 Dep(Trg
), Type(DepRev
), Owner(&Owner
)
180 inline DepIterator() : Dep(0), Type(DepVer
), Owner(0) {};
184 class pkgCache::PrvIterator
187 enum {PrvVer
, PrvPkg
} Type
;
195 void operator ++(int) {if (Prv
!= Owner
->ProvideP
) Prv
= Owner
->ProvideP
+
196 (Type
== PrvVer
?Prv
->NextPkgProv
:Prv
->NextProvides
);};
197 inline void operator ++() {operator ++(0);};
198 inline bool end() const {return Prv
== Owner
->ProvideP
?true:false;};
201 inline bool operator ==(const PrvIterator
&B
) const {return Prv
== B
.Prv
;};
202 inline bool operator !=(const PrvIterator
&B
) const {return Prv
!= B
.Prv
;};
205 inline Provides
*operator ->() {return Prv
;};
206 inline Provides
const *operator ->() const {return Prv
;};
207 inline Provides
&operator *() {return *Prv
;};
208 inline Provides
const &operator *() const {return *Prv
;};
209 inline operator Provides
*() {return Prv
== Owner
->ProvideP
?0:Prv
;};
210 inline operator Provides
const *() const {return Prv
== Owner
->ProvideP
?0:Prv
;};
211 inline const char *Name() const {return Owner
->StrP
+ Owner
->PkgP
[Prv
->ParentPkg
].Name
;};
212 inline const char *ProvideVersion() const {return Prv
->ProvideVersion
== 0?0:Owner
->StrP
+ Prv
->ProvideVersion
;};
213 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Prv
->ParentPkg
);};
214 inline VerIterator
OwnerVer() {return VerIterator(*Owner
,Owner
->VerP
+ Prv
->Version
);};
215 inline PkgIterator
OwnerPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Prv
->Version
].ParentPkg
);};
216 inline unsigned long Index() const {return Prv
- Owner
->ProvideP
;};
218 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Version
*) :
219 Prv(Trg
), Type(PrvVer
), Owner(&Owner
)
222 Prv
= Owner
.ProvideP
;
224 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Package
*) :
225 Prv(Trg
), Type(PrvPkg
), Owner(&Owner
)
228 Prv
= Owner
.ProvideP
;
233 class pkgCache::PkgFileIterator
241 void operator ++(int) {if (File
!= Owner
->PkgFileP
) File
= Owner
->PkgFileP
+ File
->NextFile
;};
242 inline void operator ++() {operator ++(0);};
243 inline bool end() const {return File
== Owner
->PkgFileP
?true:false;};
246 inline bool operator ==(const PkgFileIterator
&B
) const {return File
== B
.File
;};
247 inline bool operator !=(const PkgFileIterator
&B
) const {return File
!= B
.File
;};
250 inline PackageFile
*operator ->() {return File
;};
251 inline PackageFile
const *operator ->() const {return File
;};
252 inline PackageFile
const &operator *() const {return *File
;};
253 inline operator PackageFile
*() {return File
== Owner
->PkgFileP
?0:File
;};
254 inline operator PackageFile
const *() const {return File
== Owner
->PkgFileP
?0:File
;};
256 inline const char *FileName() const {return File
->FileName
== 0?0:Owner
->StrP
+ File
->FileName
;};
257 inline const char *Version() const {return File
->Version
== 0?0:Owner
->StrP
+ File
->Version
;};
258 inline const char *Distribution() const {return File
->Distribution
== 0?0:Owner
->StrP
+ File
->Distribution
;};
259 inline unsigned long Index() const {return File
- Owner
->PkgFileP
;};
264 inline PkgFileIterator(pkgCache
&Owner
) : Owner(&Owner
), File(Owner
.PkgFileP
+ Owner
.Head().FileList
) {};
265 inline PkgFileIterator(pkgCache
&Owner
,PackageFile
*Trg
) : Owner(&Owner
), File(Trg
) {};
269 class pkgCache::VerFileIterator
277 void operator ++(int) {if (FileP
!= Owner
->VerFileP
) FileP
= Owner
->VerFileP
+ FileP
->NextFile
;};
278 inline void operator ++() {operator ++(0);};
279 inline bool end() const {return FileP
== Owner
->VerFileP
?true:false;};
282 inline bool operator ==(const VerFileIterator
&B
) const {return FileP
== B
.FileP
;};
283 inline bool operator !=(const VerFileIterator
&B
) const {return FileP
!= B
.FileP
;};
286 inline VerFile
*operator ->() {return FileP
;};
287 inline VerFile
const *operator ->() const {return FileP
;};
288 inline VerFile
const &operator *() const {return *FileP
;};
289 inline operator VerFile
*() {return FileP
== Owner
->VerFileP
?0:FileP
;};
290 inline operator VerFile
const *() const {return FileP
== Owner
->VerFileP
?0:FileP
;};
292 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
293 inline unsigned long Index() const {return FileP
- Owner
->VerFileP
;};
295 inline VerFileIterator(pkgCache
&Owner
,VerFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
298 // Inlined Begin functions cant be in the class because of order problems
299 inline pkgCache::VerIterator
pkgCache::PkgIterator::VersionList() const
300 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->VersionList
);};
301 inline pkgCache::VerIterator
pkgCache::PkgIterator::CurrentVer() const
302 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->CurrentVer
);};
303 inline pkgCache::VerIterator
pkgCache::PkgIterator::TargetVer() const
304 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->TargetVer
);};
305 inline pkgCache::DepIterator
pkgCache::PkgIterator::RevDependsList() const
306 {return DepIterator(*Owner
,Owner
->DepP
+ Pkg
->RevDepends
,Pkg
);};
307 inline pkgCache::PrvIterator
pkgCache::PkgIterator::ProvidesList() const
308 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Pkg
->ProvidesList
,Pkg
);};
309 inline pkgCache::PrvIterator
pkgCache::VerIterator::ProvidesList() const
310 {return PrvIterator(Owner
,Owner
.ProvideP
+ Ver
->ProvidesList
,Ver
);};
311 inline pkgCache::DepIterator
pkgCache::VerIterator::DependsList() const
312 {return DepIterator(Owner
,Owner
.DepP
+ Ver
->DependsList
,Ver
);};
313 inline pkgCache::VerFileIterator
pkgCache::VerIterator::FileList() const
314 {return VerFileIterator(Owner
,Owner
.VerFileP
+ Ver
->FileList
);};