]>
git.saurik.com Git - apt.git/blob - apt-pkg/cacheiterators.h
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: cacheiterators.h,v 1.8 1998/11/14 07:20:08 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. The provide iterator has the
27 This header is not user includable, please use apt-pkg/pkgcache.h
29 ##################################################################### */
31 // Header section: pkglib
32 #ifndef PKGLIB_CACHEITERATORS_H
33 #define PKGLIB_CACHEITERATORS_H
36 #pragma interface "apt-pkg/cacheiterators.h"
40 class pkgCache::PkgIterator
48 enum OkState
{NeedsNothing
,NeedsUnpack
,NeedsConfigure
};
51 void operator ++(int);
52 inline void operator ++() {operator ++(0);};
53 inline bool end() const {return Owner
== 0 || Pkg
== Owner
->PkgP
?true:false;};
56 inline bool operator ==(const PkgIterator
&B
) const {return Pkg
== B
.Pkg
;};
57 inline bool operator !=(const PkgIterator
&B
) const {return Pkg
!= B
.Pkg
;};
60 inline Package
*operator ->() {return Pkg
;};
61 inline Package
const *operator ->() const {return Pkg
;};
62 inline Package
const &operator *() const {return *Pkg
;};
63 inline operator Package
*() {return Pkg
== Owner
->PkgP
?0:Pkg
;};
64 inline operator Package
const *() const {return Pkg
== Owner
->PkgP
?0:Pkg
;};
66 inline const char *Name() const {return Pkg
->Name
== 0?0:Owner
->StrP
+ Pkg
->Name
;};
67 inline const char *Section() const {return Pkg
->Section
== 0?0:Owner
->StrP
+ Pkg
->Section
;};
68 inline const char *TargetDist() const {return Pkg
->TargetDist
== 0?0:Owner
->StrP
+ Pkg
->TargetDist
;};
69 inline VerIterator
VersionList() const;
70 inline VerIterator
TargetVer() const;
71 inline VerIterator
CurrentVer() const;
72 inline DepIterator
RevDependsList() const;
73 inline PrvIterator
ProvidesList() const;
74 inline unsigned long Index() const {return Pkg
- Owner
->PkgP
;};
75 OkState
State() const;
78 inline PkgIterator(pkgCache
&Owner
) : Owner(&Owner
), HashIndex(-1)
83 inline PkgIterator(pkgCache
&Owner
,Package
*Trg
) : Pkg(Trg
), Owner(&Owner
),
89 inline PkgIterator() : Pkg(0), Owner(0), HashIndex(0) {};
93 class pkgCache::VerIterator
103 void operator ++(int) {if (Ver
!= Owner
.VerP
) Ver
= Owner
.VerP
+ Ver
->NextVer
;};
104 inline void operator ++() {operator ++(0);};
105 inline bool end() const {return Ver
== Owner
.VerP
?true:false;};
106 inline void operator =(const VerIterator
&B
) {Ver
= B
.Ver
;};
109 inline bool operator ==(const VerIterator
&B
) const {return Ver
== B
.Ver
;};
110 inline bool operator !=(const VerIterator
&B
) const {return Ver
!= B
.Ver
;};
111 int CompareVer(const VerIterator
&B
) const;
114 inline Version
*operator ->() {return Ver
;};
115 inline Version
const *operator ->() const {return Ver
;};
116 inline Version
&operator *() {return *Ver
;};
117 inline Version
const &operator *() const {return *Ver
;};
118 inline operator Version
*() {return Ver
== Owner
.VerP
?0:Ver
;};
119 inline operator Version
const *() const {return Ver
== Owner
.VerP
?0:Ver
;};
121 inline const char *VerStr() const {return Ver
->VerStr
== 0?0:Owner
.StrP
+ Ver
->VerStr
;};
122 inline const char *Section() const {return Ver
->Section
== 0?0:Owner
.StrP
+ Ver
->Section
;};
123 inline PkgIterator
ParentPkg() const {return PkgIterator(Owner
,Owner
.PkgP
+ Ver
->ParentPkg
);};
124 inline DepIterator
DependsList() const;
125 inline PrvIterator
ProvidesList() const;
126 inline VerFileIterator
FileList() const;
127 inline unsigned long Index() const {return Ver
- Owner
.VerP
;};
128 bool Downloadable() const;
130 inline VerIterator(pkgCache
&Owner
,Version
*Trg
= 0) : Ver(Trg
), Owner(Owner
)
137 // Dependency iterator
138 class pkgCache::DepIterator
141 enum {DepVer
, DepRev
} Type
;
149 void operator ++(int) {if (Dep
!= Owner
->DepP
) Dep
= Owner
->DepP
+
150 (Type
== DepVer
?Dep
->NextDepends
:Dep
->NextRevDepends
);};
151 inline void operator ++() {operator ++(0);};
152 inline bool end() const {return Owner
== 0 || Dep
== Owner
->DepP
?true:false;};
155 inline bool operator ==(const DepIterator
&B
) const {return Dep
== B
.Dep
;};
156 inline bool operator !=(const DepIterator
&B
) const {return Dep
!= B
.Dep
;};
159 inline Dependency
*operator ->() {return Dep
;};
160 inline Dependency
const *operator ->() const {return Dep
;};
161 inline Dependency
&operator *() {return *Dep
;};
162 inline Dependency
const &operator *() const {return *Dep
;};
163 inline operator Dependency
*() {return Dep
== Owner
->DepP
?0:Dep
;};
164 inline operator Dependency
const *() const {return Dep
== Owner
->DepP
?0:Dep
;};
166 inline const char *TargetVer() const {return Dep
->Version
== 0?0:Owner
->StrP
+ Dep
->Version
;};
167 inline PkgIterator
TargetPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Dep
->Package
);};
168 inline PkgIterator
SmartTargetPkg() {PkgIterator
R(*Owner
);SmartTargetPkg(R
);return R
;};
169 inline VerIterator
ParentVer() {return VerIterator(*Owner
,Owner
->VerP
+ Dep
->ParentVer
);};
170 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Dep
->ParentVer
].ParentPkg
);};
171 inline bool Reverse() {return Type
== DepRev
;};
172 inline unsigned long Index() const {return Dep
- Owner
->DepP
;};
174 void GlobOr(DepIterator
&Start
,DepIterator
&End
);
175 Version
**AllTargets();
176 bool SmartTargetPkg(PkgIterator
&Result
);
177 const char *CompType();
178 const char *DepType();
180 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Version
* = 0) :
181 Dep(Trg
), Type(DepVer
), Owner(&Owner
)
186 inline DepIterator(pkgCache
&Owner
,Dependency
*Trg
,Package
*) :
187 Dep(Trg
), Type(DepRev
), Owner(&Owner
)
192 inline DepIterator() : Dep(0), Type(DepVer
), Owner(0) {};
196 class pkgCache::PrvIterator
199 enum {PrvVer
, PrvPkg
} Type
;
207 void operator ++(int) {if (Prv
!= Owner
->ProvideP
) Prv
= Owner
->ProvideP
+
208 (Type
== PrvVer
?Prv
->NextPkgProv
:Prv
->NextProvides
);};
209 inline void operator ++() {operator ++(0);};
210 inline bool end() const {return Prv
== Owner
->ProvideP
?true:false;};
213 inline bool operator ==(const PrvIterator
&B
) const {return Prv
== B
.Prv
;};
214 inline bool operator !=(const PrvIterator
&B
) const {return Prv
!= B
.Prv
;};
217 inline Provides
*operator ->() {return Prv
;};
218 inline Provides
const *operator ->() const {return Prv
;};
219 inline Provides
&operator *() {return *Prv
;};
220 inline Provides
const &operator *() const {return *Prv
;};
221 inline operator Provides
*() {return Prv
== Owner
->ProvideP
?0:Prv
;};
222 inline operator Provides
const *() const {return Prv
== Owner
->ProvideP
?0:Prv
;};
224 inline const char *Name() const {return Owner
->StrP
+ Owner
->PkgP
[Prv
->ParentPkg
].Name
;};
225 inline const char *ProvideVersion() const {return Prv
->ProvideVersion
== 0?0:Owner
->StrP
+ Prv
->ProvideVersion
;};
226 inline PkgIterator
ParentPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Prv
->ParentPkg
);};
227 inline VerIterator
OwnerVer() {return VerIterator(*Owner
,Owner
->VerP
+ Prv
->Version
);};
228 inline PkgIterator
OwnerPkg() {return PkgIterator(*Owner
,Owner
->PkgP
+ Owner
->VerP
[Prv
->Version
].ParentPkg
);};
229 inline unsigned long Index() const {return Prv
- Owner
->ProvideP
;};
231 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Version
*) :
232 Prv(Trg
), Type(PrvVer
), Owner(&Owner
)
235 Prv
= Owner
.ProvideP
;
237 inline PrvIterator(pkgCache
&Owner
,Provides
*Trg
,Package
*) :
238 Prv(Trg
), Type(PrvPkg
), Owner(&Owner
)
241 Prv
= Owner
.ProvideP
;
246 class pkgCache::PkgFileIterator
254 void operator ++(int) {if (File
!= Owner
->PkgFileP
) File
= Owner
->PkgFileP
+ File
->NextFile
;};
255 inline void operator ++() {operator ++(0);};
256 inline bool end() const {return File
== Owner
->PkgFileP
?true:false;};
259 inline bool operator ==(const PkgFileIterator
&B
) const {return File
== B
.File
;};
260 inline bool operator !=(const PkgFileIterator
&B
) const {return File
!= B
.File
;};
263 inline PackageFile
*operator ->() {return File
;};
264 inline PackageFile
const *operator ->() const {return File
;};
265 inline PackageFile
const &operator *() const {return *File
;};
266 inline operator PackageFile
*() {return File
== Owner
->PkgFileP
?0:File
;};
267 inline operator PackageFile
const *() const {return File
== Owner
->PkgFileP
?0:File
;};
269 inline const char *FileName() const {return File
->FileName
== 0?0:Owner
->StrP
+ File
->FileName
;};
270 inline const char *Version() const {return File
->Version
== 0?0:Owner
->StrP
+ File
->Version
;};
271 inline const char *Distribution() const {return File
->Distribution
== 0?0:Owner
->StrP
+ File
->Distribution
;};
272 inline unsigned long Index() const {return File
- Owner
->PkgFileP
;};
277 inline PkgFileIterator(pkgCache
&Owner
) : Owner(&Owner
), File(Owner
.PkgFileP
+ Owner
.Head().FileList
) {};
278 inline PkgFileIterator(pkgCache
&Owner
,PackageFile
*Trg
) : Owner(&Owner
), File(Trg
) {};
282 class pkgCache::VerFileIterator
290 void operator ++(int) {if (FileP
!= Owner
->VerFileP
) FileP
= Owner
->VerFileP
+ FileP
->NextFile
;};
291 inline void operator ++() {operator ++(0);};
292 inline bool end() const {return FileP
== Owner
->VerFileP
?true:false;};
295 inline bool operator ==(const VerFileIterator
&B
) const {return FileP
== B
.FileP
;};
296 inline bool operator !=(const VerFileIterator
&B
) const {return FileP
!= B
.FileP
;};
299 inline VerFile
*operator ->() {return FileP
;};
300 inline VerFile
const *operator ->() const {return FileP
;};
301 inline VerFile
const &operator *() const {return *FileP
;};
302 inline operator VerFile
*() {return FileP
== Owner
->VerFileP
?0:FileP
;};
303 inline operator VerFile
const *() const {return FileP
== Owner
->VerFileP
?0:FileP
;};
305 inline PkgFileIterator
File() const {return PkgFileIterator(*Owner
,FileP
->File
+ Owner
->PkgFileP
);};
306 inline unsigned long Index() const {return FileP
- Owner
->VerFileP
;};
308 inline VerFileIterator(pkgCache
&Owner
,VerFile
*Trg
) : Owner(&Owner
), FileP(Trg
) {};
311 // Inlined Begin functions cant be in the class because of order problems
312 inline pkgCache::VerIterator
pkgCache::PkgIterator::VersionList() const
313 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->VersionList
);};
314 inline pkgCache::VerIterator
pkgCache::PkgIterator::CurrentVer() const
315 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->CurrentVer
);};
316 inline pkgCache::VerIterator
pkgCache::PkgIterator::TargetVer() const
317 {return VerIterator(*Owner
,Owner
->VerP
+ Pkg
->TargetVer
);};
318 inline pkgCache::DepIterator
pkgCache::PkgIterator::RevDependsList() const
319 {return DepIterator(*Owner
,Owner
->DepP
+ Pkg
->RevDepends
,Pkg
);};
320 inline pkgCache::PrvIterator
pkgCache::PkgIterator::ProvidesList() const
321 {return PrvIterator(*Owner
,Owner
->ProvideP
+ Pkg
->ProvidesList
,Pkg
);};
322 inline pkgCache::PrvIterator
pkgCache::VerIterator::ProvidesList() const
323 {return PrvIterator(Owner
,Owner
.ProvideP
+ Ver
->ProvidesList
,Ver
);};
324 inline pkgCache::DepIterator
pkgCache::VerIterator::DependsList() const
325 {return DepIterator(Owner
,Owner
.DepP
+ Ver
->DependsList
,Ver
);};
326 inline pkgCache::VerFileIterator
pkgCache::VerIterator::FileList() const
327 {return VerFileIterator(Owner
,Owner
.VerFileP
+ Ver
->FileList
);};