]> git.saurik.com Git - apt.git/blame - apt-pkg/cacheiterators.h
revert useless abibreak in sourceslist.h
[apt.git] / apt-pkg / cacheiterators.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
578bfd0a
AL
3/* ######################################################################
4
5 Cache Iterators - Iterators for navigating the cache structure
6
7 The iterators all provides ++,==,!=,->,* and end for their type.
8 The end function can be used to tell if the list has been fully
9 traversed.
10
11 Unlike STL iterators these contain helper functions to access the data
12 that is being iterated over. This is because the data structures can't
13 be formed in a manner that is intuitive to use and also mmapable.
14
15 For each variable in the target structure that would need a translation
16 to be accessed correctly a translating function of the same name is
17 present in the iterator. If applicable the translating function will
18 return an iterator.
19
20 The DepIterator can iterate over two lists, a list of 'version depends'
21 or a list of 'package reverse depends'. The type is determined by the
22 structure passed to the constructor, which should be the structure
6c139d6e
AL
23 that has the depends pointer as a member. The provide iterator has the
24 same system.
578bfd0a 25
094a497d 26 This header is not user includable, please use apt-pkg/pkgcache.h
578bfd0a
AL
27
28 ##################################################################### */
29 /*}}}*/
578bfd0a
AL
30#ifndef PKGLIB_CACHEITERATORS_H
31#define PKGLIB_CACHEITERATORS_H
453b82a3 32#include<apt-pkg/pkgcache.h>
a02db58f 33#include<apt-pkg/macros.h>
453b82a3 34
b3fdb998 35#include<iterator>
453b82a3
DK
36#include <iosfwd>
37#include <string>
8ceeb9d6
DK
38
39#include<string.h>
472ff00e 40
773e2c1f
DK
41// abstract Iterator template /*{{{*/
42/* This template provides the very basic iterator methods we
5bf15716 43 need to have for doing some walk-over-the-cache magic */
b3fdb998
DK
44template<typename Str, typename Itr> class pkgCache::Iterator :
45 public std::iterator<std::forward_iterator_tag, Str> {
773e2c1f
DK
46 protected:
47 Str *S;
48 pkgCache *Owner;
49
50 /** \brief Returns the Pointer for this struct in the owner
51 * The implementation of this method should be pretty short
52 * as it will only return the Pointer into the mmap stored
53 * in the owner but the name of this pointer is different for
1e3f4083 54 * each structure and we want to abstract here at least for the
773e2c1f
DK
55 * basic methods from the actual structure.
56 * \return Pointer to the first structure of this type
57 */
58 virtual Str* OwnerPointer() const = 0;
59
60 public:
61 // Iteration
62 virtual void operator ++(int) = 0;
d3e8fbb3
DK
63 virtual void operator ++() = 0; // Should be {operator ++(0);}
64 inline bool end() const {return Owner == 0 || S == OwnerPointer();}
773e2c1f
DK
65
66 // Comparison
d3e8fbb3
DK
67 inline bool operator ==(const Itr &B) const {return S == B.S;}
68 inline bool operator !=(const Itr &B) const {return S != B.S;}
773e2c1f
DK
69
70 // Accessors
d3e8fbb3
DK
71 inline Str *operator ->() {return S;}
72 inline Str const *operator ->() const {return S;}
73 inline operator Str *() {return S == OwnerPointer() ? 0 : S;}
74 inline operator Str const *() const {return S == OwnerPointer() ? 0 : S;}
75 inline Str &operator *() {return *S;}
76 inline Str const &operator *() const {return *S;}
77 inline pkgCache *Cache() const {return Owner;}
773e2c1f
DK
78
79 // Mixed stuff
d3e8fbb3
DK
80 inline void operator =(const Itr &B) {S = B.S; Owner = B.Owner;}
81 inline bool IsGood() const { return S && Owner && ! end();}
82 inline unsigned long Index() const {return S - OwnerPointer();}
773e2c1f 83
f7a35f2e
DK
84 void ReMap(void const * const oldMap, void const * const newMap) {
85 if (Owner == 0 || S == 0)
a9fe5928 86 return;
cf4ff3b7 87 S += (Str const * const)(newMap) - (Str const * const)(oldMap);
a9fe5928
DK
88 }
89
773e2c1f 90 // Constructors - look out for the variable assigning
d3e8fbb3
DK
91 inline Iterator() : S(0), Owner(0) {}
92 inline Iterator(pkgCache &Owner,Str *T = 0) : S(T), Owner(&Owner) {}
5bf15716
DK
93};
94 /*}}}*/
95// Group Iterator /*{{{*/
96/* Packages with the same name are collected in a Group so someone only
97 interest in package names can iterate easily over the names, so the
98 different architectures can be treated as of the "same" package
99 (apt internally treat them as totally different packages) */
100class pkgCache::GrpIterator: public Iterator<Group, GrpIterator> {
25396fb0
DK
101 long HashIndex;
102
5bf15716
DK
103 protected:
104 inline Group* OwnerPointer() const {
c55b8a54 105 return (Owner != 0) ? Owner->GrpP : 0;
d3e8fbb3 106 }
5bf15716
DK
107
108 public:
25396fb0
DK
109 // This constructor is the 'begin' constructor, never use it.
110 inline GrpIterator(pkgCache &Owner) : Iterator<Group, GrpIterator>(Owner), HashIndex(-1) {
111 S = OwnerPointer();
112 operator ++(0);
d3e8fbb3 113 }
25396fb0
DK
114
115 virtual void operator ++(int);
d3e8fbb3 116 virtual void operator ++() {operator ++(0);}
5bf15716 117
d3e8fbb3 118 inline const char *Name() const {return S->Name == 0?0:Owner->StrP + S->Name;}
5bf15716 119 inline PkgIterator PackageList() const;
8f3ba4e8 120 PkgIterator FindPkg(std::string Arch = "any") const;
bd2fb30a
DK
121 /** \brief find the package with the "best" architecture
122
123 The best architecture is either the "native" or the first
3db58cf4
DK
124 in the list of Architectures which is not an end-Pointer
125
126 \param PreferNonVirtual tries to respond with a non-virtual package
127 and only if this fails returns the best virtual package */
128 PkgIterator FindPreferredPkg(bool const &PreferNonVirtual = true) const;
e841200b 129 PkgIterator NextPkg(PkgIterator const &Pkg) const;
5bf15716
DK
130
131 // Constructors
25396fb0 132 inline GrpIterator(pkgCache &Owner, Group *Trg) : Iterator<Group, GrpIterator>(Owner, Trg), HashIndex(0) {
5bf15716
DK
133 if (S == 0)
134 S = OwnerPointer();
d3e8fbb3
DK
135 }
136 inline GrpIterator() : Iterator<Group, GrpIterator>(), HashIndex(0) {}
5bf15716 137
773e2c1f
DK
138};
139 /*}}}*/
92fcbfc1 140// Package Iterator /*{{{*/
773e2c1f
DK
141class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
142 long HashIndex;
143
144 protected:
145 inline Package* OwnerPointer() const {
c55b8a54 146 return (Owner != 0) ? Owner->PkgP : 0;
d3e8fbb3 147 }
773e2c1f
DK
148
149 public:
150 // This constructor is the 'begin' constructor, never use it.
151 inline PkgIterator(pkgCache &Owner) : Iterator<Package, PkgIterator>(Owner), HashIndex(-1) {
152 S = OwnerPointer();
153 operator ++(0);
d3e8fbb3 154 }
773e2c1f
DK
155
156 virtual void operator ++(int);
d3e8fbb3 157 virtual void operator ++() {operator ++(0);}
773e2c1f
DK
158
159 enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure};
160
161 // Accessors
fe86debb 162 inline const char *Name() const { return Group().Name(); }
7a669774
DK
163 // Versions have sections - and packages can have different versions with different sections
164 // so this interface is broken by design. It used to return the section of the "first parsed
165 // package stanza", but as this can potentially be anything it now returns the section of the
166 // newest version instead (if any). aka: Run as fast as you can to Version.Section().
167 APT_DEPRECATED const char *Section() const;
773e2c1f 168 inline bool Purge() const {return S->CurrentState == pkgCache::State::Purge ||
d3e8fbb3
DK
169 (S->CurrentVer == 0 && S->CurrentState == pkgCache::State::NotInstalled);}
170 inline const char *Arch() const {return S->Arch == 0?0:Owner->StrP + S->Arch;}
a02db58f 171 inline APT_PURE GrpIterator Group() const { return GrpIterator(*Owner, Owner->GrpP + S->Group);}
773e2c1f 172
a02db58f
DK
173 inline VerIterator VersionList() const APT_PURE;
174 inline VerIterator CurrentVer() const APT_PURE;
175 inline DepIterator RevDependsList() const APT_PURE;
176 inline PrvIterator ProvidesList() const APT_PURE;
177 OkState State() const APT_PURE;
178 const char *CandVersion() const APT_PURE;
179 const char *CurVersion() const APT_PURE;
773e2c1f
DK
180
181 //Nice printable representation
182 friend std::ostream& operator <<(std::ostream& out, PkgIterator i);
75ce2062 183 std::string FullName(bool const &Pretty = false) const;
773e2c1f
DK
184
185 // Constructors
186 inline PkgIterator(pkgCache &Owner,Package *Trg) : Iterator<Package, PkgIterator>(Owner, Trg), HashIndex(0) {
187 if (S == 0)
188 S = OwnerPointer();
d3e8fbb3
DK
189 }
190 inline PkgIterator() : Iterator<Package, PkgIterator>(), HashIndex(0) {}
578bfd0a 191};
92fcbfc1
DK
192 /*}}}*/
193// Version Iterator /*{{{*/
773e2c1f
DK
194class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
195 protected:
196 inline Version* OwnerPointer() const {
c55b8a54 197 return (Owner != 0) ? Owner->VerP : 0;
d3e8fbb3 198 }
773e2c1f
DK
199
200 public:
201 // Iteration
d3e8fbb3
DK
202 void operator ++(int) {if (S != Owner->VerP) S = Owner->VerP + S->NextVer;}
203 inline void operator ++() {operator ++(0);}
773e2c1f
DK
204
205 // Comparison
206 int CompareVer(const VerIterator &B) const;
8ceeb9d6
DK
207 /** \brief compares two version and returns if they are similar
208
209 This method should be used to identify if two pseudo versions are
1e3f4083 210 referring to the same "real" version */
8ceeb9d6
DK
211 inline bool SimilarVer(const VerIterator &B) const {
212 return (B.end() == false && S->Hash == B->Hash && strcmp(VerStr(), B.VerStr()) == 0);
d3e8fbb3 213 }
773e2c1f
DK
214
215 // Accessors
d3e8fbb3
DK
216 inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;}
217 inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;}
765190e4 218#if APT_PKG_ABI >= 413
a221efc3
DK
219 /** \brief source package name this version comes from
220 Always contains the name, even if it is the same as the binary name */
221 inline const char *SourcePkgName() const {return Owner->StrP + S->SourcePkgName;}
222 /** \brief source version this version comes from
223 Always contains the version string, even if it is the same as the binary version */
224 inline const char *SourceVerStr() const {return Owner->StrP + S->SourceVerStr;}
765190e4 225#endif
c5dac10c 226 inline const char *Arch() const {
2a2a7ef4 227 if ((S->MultiArch & pkgCache::Version::All) == pkgCache::Version::All)
ca238ede 228 return "all";
c5dac10c 229 return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
d3e8fbb3
DK
230 }
231 inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
773e2c1f
DK
232
233 inline DescIterator DescriptionList() const;
234 DescIterator TranslatedDescription() const;
235 inline DepIterator DependsList() const;
236 inline PrvIterator ProvidesList() const;
237 inline VerFileIterator FileList() const;
238 bool Downloadable() const;
d3e8fbb3 239 inline const char *PriorityType() const {return Owner->Priority(S->Priority);}
a02db58f 240 const char *MultiArchType() const APT_PURE;
8f3ba4e8 241 std::string RelStr() const;
773e2c1f
DK
242
243 bool Automatic() const;
244 VerFileIterator NewestFile() const;
245
246 inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
247 if (S == 0)
248 S = OwnerPointer();
d3e8fbb3
DK
249 }
250 inline VerIterator() : Iterator<Version, VerIterator>() {}
578bfd0a 251};
92fcbfc1
DK
252 /*}}}*/
253// Description Iterator /*{{{*/
773e2c1f
DK
254class pkgCache::DescIterator : public Iterator<Description, DescIterator> {
255 protected:
256 inline Description* OwnerPointer() const {
c55b8a54 257 return (Owner != 0) ? Owner->DescP : 0;
d3e8fbb3 258 }
773e2c1f
DK
259
260 public:
261 // Iteration
d3e8fbb3
DK
262 void operator ++(int) {if (S != Owner->DescP) S = Owner->DescP + S->NextDesc;}
263 inline void operator ++() {operator ++(0);}
773e2c1f
DK
264
265 // Comparison
266 int CompareDesc(const DescIterator &B) const;
267
268 // Accessors
d3e8fbb3
DK
269 inline const char *LanguageCode() const {return Owner->StrP + S->language_code;}
270 inline const char *md5() const {return Owner->StrP + S->md5sum;}
773e2c1f
DK
271 inline DescFileIterator FileList() const;
272
d3e8fbb3 273 inline DescIterator() : Iterator<Description, DescIterator>() {}
773e2c1f
DK
274 inline DescIterator(pkgCache &Owner,Description *Trg = 0) : Iterator<Description, DescIterator>(Owner, Trg) {
275 if (S == 0)
276 S = Owner.DescP;
d3e8fbb3 277 }
a52f938b 278};
92fcbfc1
DK
279 /*}}}*/
280// Dependency iterator /*{{{*/
773e2c1f
DK
281class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
282 enum {DepVer, DepRev} Type;
283
284 protected:
285 inline Dependency* OwnerPointer() const {
c55b8a54 286 return (Owner != 0) ? Owner->DepP : 0;
d3e8fbb3 287 }
773e2c1f
DK
288
289 public:
290 // Iteration
291 void operator ++(int) {if (S != Owner->DepP) S = Owner->DepP +
d3e8fbb3
DK
292 (Type == DepVer ? S->NextDepends : S->NextRevDepends);}
293 inline void operator ++() {operator ++(0);}
773e2c1f
DK
294
295 // Accessors
d3e8fbb3
DK
296 inline const char *TargetVer() const {return S->Version == 0?0:Owner->StrP + S->Version;}
297 inline PkgIterator TargetPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->Package);}
298 inline PkgIterator SmartTargetPkg() const {PkgIterator R(*Owner,0);SmartTargetPkg(R);return R;}
299 inline VerIterator ParentVer() const {return VerIterator(*Owner,Owner->VerP + S->ParentVer);}
300 inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->ParentVer].ParentPkg);}
301 inline bool Reverse() const {return Type == DepRev;}
a02db58f
DK
302 bool IsCritical() const APT_PURE;
303 bool IsNegative() const APT_PURE;
304 bool IsIgnorable(PrvIterator const &Prv) const APT_PURE;
305 bool IsIgnorable(PkgIterator const &Pkg) const APT_PURE;
306 bool IsMultiArchImplicit() const APT_PURE;
307 bool IsSatisfied(VerIterator const &Ver) const APT_PURE;
308 bool IsSatisfied(PrvIterator const &Prv) const APT_PURE;
773e2c1f 309 void GlobOr(DepIterator &Start,DepIterator &End);
e841200b
DK
310 Version **AllTargets() const;
311 bool SmartTargetPkg(PkgIterator &Result) const;
d3e8fbb3
DK
312 inline const char *CompType() const {return Owner->CompType(S->CompareOp);}
313 inline const char *DepType() const {return Owner->DepType(S->Type);}
773e2c1f 314
47f6d1b7
DK
315 //Nice printable representation
316 friend std::ostream& operator <<(std::ostream& out, DepIterator D);
317
773e2c1f
DK
318 inline DepIterator(pkgCache &Owner, Dependency *Trg, Version* = 0) :
319 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepVer) {
320 if (S == 0)
321 S = Owner.DepP;
d3e8fbb3 322 }
773e2c1f
DK
323 inline DepIterator(pkgCache &Owner, Dependency *Trg, Package*) :
324 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepRev) {
325 if (S == 0)
326 S = Owner.DepP;
d3e8fbb3
DK
327 }
328 inline DepIterator() : Iterator<Dependency, DepIterator>(), Type(DepVer) {}
578bfd0a 329};
92fcbfc1
DK
330 /*}}}*/
331// Provides iterator /*{{{*/
773e2c1f
DK
332class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
333 enum {PrvVer, PrvPkg} Type;
334
335 protected:
336 inline Provides* OwnerPointer() const {
c55b8a54 337 return (Owner != 0) ? Owner->ProvideP : 0;
d3e8fbb3 338 }
773e2c1f
DK
339
340 public:
341 // Iteration
342 void operator ++(int) {if (S != Owner->ProvideP) S = Owner->ProvideP +
d3e8fbb3
DK
343 (Type == PrvVer?S->NextPkgProv:S->NextProvides);}
344 inline void operator ++() {operator ++(0);}
773e2c1f
DK
345
346 // Accessors
fe86debb 347 inline const char *Name() const {return ParentPkg().Name();}
d3e8fbb3
DK
348 inline const char *ProvideVersion() const {return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;}
349 inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
350 inline VerIterator OwnerVer() const {return VerIterator(*Owner,Owner->VerP + S->Version);}
351 inline PkgIterator OwnerPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->Version].ParentPkg);}
773e2c1f 352
a02db58f 353 bool IsMultiArchImplicit() const APT_PURE;
773e2c1f 354
d3e8fbb3 355 inline PrvIterator() : Iterator<Provides, PrvIterator>(), Type(PrvVer) {}
773e2c1f
DK
356 inline PrvIterator(pkgCache &Owner, Provides *Trg, Version*) :
357 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvVer) {
358 if (S == 0)
359 S = Owner.ProvideP;
d3e8fbb3 360 }
773e2c1f
DK
361 inline PrvIterator(pkgCache &Owner, Provides *Trg, Package*) :
362 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvPkg) {
363 if (S == 0)
364 S = Owner.ProvideP;
d3e8fbb3 365 }
578bfd0a 366};
92fcbfc1
DK
367 /*}}}*/
368// Package file /*{{{*/
773e2c1f
DK
369class pkgCache::PkgFileIterator : public Iterator<PackageFile, PkgFileIterator> {
370 protected:
371 inline PackageFile* OwnerPointer() const {
c55b8a54 372 return (Owner != 0) ? Owner->PkgFileP : 0;
d3e8fbb3 373 }
773e2c1f
DK
374
375 public:
376 // Iteration
d3e8fbb3
DK
377 void operator ++(int) {if (S != Owner->PkgFileP) S = Owner->PkgFileP + S->NextFile;}
378 inline void operator ++() {operator ++(0);}
773e2c1f
DK
379
380 // Accessors
d3e8fbb3
DK
381 inline const char *FileName() const {return S->FileName == 0?0:Owner->StrP + S->FileName;}
382 inline const char *Archive() const {return S->Archive == 0?0:Owner->StrP + S->Archive;}
383 inline const char *Component() const {return S->Component == 0?0:Owner->StrP + S->Component;}
384 inline const char *Version() const {return S->Version == 0?0:Owner->StrP + S->Version;}
385 inline const char *Origin() const {return S->Origin == 0?0:Owner->StrP + S->Origin;}
386 inline const char *Codename() const {return S->Codename ==0?0:Owner->StrP + S->Codename;}
387 inline const char *Label() const {return S->Label == 0?0:Owner->StrP + S->Label;}
388 inline const char *Site() const {return S->Site == 0?0:Owner->StrP + S->Site;}
389 inline const char *Architecture() const {return S->Architecture == 0?0:Owner->StrP + S->Architecture;}
390 inline const char *IndexType() const {return S->IndexType == 0?0:Owner->StrP + S->IndexType;}
773e2c1f
DK
391
392 bool IsOk();
8f3ba4e8 393 std::string RelStr();
773e2c1f
DK
394
395 // Constructors
d3e8fbb3
DK
396 inline PkgFileIterator() : Iterator<PackageFile, PkgFileIterator>() {}
397 inline PkgFileIterator(pkgCache &Owner) : Iterator<PackageFile, PkgFileIterator>(Owner, Owner.PkgFileP) {}
398 inline PkgFileIterator(pkgCache &Owner,PackageFile *Trg) : Iterator<PackageFile, PkgFileIterator>(Owner, Trg) {}
578bfd0a 399};
92fcbfc1
DK
400 /*}}}*/
401// Version File /*{{{*/
773e2c1f
DK
402class pkgCache::VerFileIterator : public pkgCache::Iterator<VerFile, VerFileIterator> {
403 protected:
404 inline VerFile* OwnerPointer() const {
c55b8a54 405 return (Owner != 0) ? Owner->VerFileP : 0;
d3e8fbb3 406 }
773e2c1f
DK
407
408 public:
409 // Iteration
d3e8fbb3
DK
410 void operator ++(int) {if (S != Owner->VerFileP) S = Owner->VerFileP + S->NextFile;}
411 inline void operator ++() {operator ++(0);}
773e2c1f
DK
412
413 // Accessors
d3e8fbb3 414 inline PkgFileIterator File() const {return PkgFileIterator(*Owner,S->File + Owner->PkgFileP);}
773e2c1f 415
d3e8fbb3
DK
416 inline VerFileIterator() : Iterator<VerFile, VerFileIterator>() {}
417 inline VerFileIterator(pkgCache &Owner,VerFile *Trg) : Iterator<VerFile, VerFileIterator>(Owner, Trg) {}
dcb79bae 418};
92fcbfc1
DK
419 /*}}}*/
420// Description File /*{{{*/
773e2c1f
DK
421class pkgCache::DescFileIterator : public Iterator<DescFile, DescFileIterator> {
422 protected:
423 inline DescFile* OwnerPointer() const {
c55b8a54 424 return (Owner != 0) ? Owner->DescFileP : 0;
d3e8fbb3 425 }
773e2c1f
DK
426
427 public:
428 // Iteration
d3e8fbb3
DK
429 void operator ++(int) {if (S != Owner->DescFileP) S = Owner->DescFileP + S->NextFile;}
430 inline void operator ++() {operator ++(0);}
773e2c1f
DK
431
432 // Accessors
d3e8fbb3 433 inline PkgFileIterator File() const {return PkgFileIterator(*Owner,S->File + Owner->PkgFileP);}
773e2c1f 434
d3e8fbb3
DK
435 inline DescFileIterator() : Iterator<DescFile, DescFileIterator>() {}
436 inline DescFileIterator(pkgCache &Owner,DescFile *Trg) : Iterator<DescFile, DescFileIterator>(Owner, Trg) {}
a52f938b 437};
92fcbfc1 438 /*}}}*/
1e3f4083 439// Inlined Begin functions can't be in the class because of order problems /*{{{*/
5bf15716 440inline pkgCache::PkgIterator pkgCache::GrpIterator::PackageList() const
d3e8fbb3 441 {return PkgIterator(*Owner,Owner->PkgP + S->FirstPackage);}
578bfd0a 442inline pkgCache::VerIterator pkgCache::PkgIterator::VersionList() const
d3e8fbb3 443 {return VerIterator(*Owner,Owner->VerP + S->VersionList);}
578bfd0a 444inline pkgCache::VerIterator pkgCache::PkgIterator::CurrentVer() const
d3e8fbb3 445 {return VerIterator(*Owner,Owner->VerP + S->CurrentVer);}
578bfd0a 446inline pkgCache::DepIterator pkgCache::PkgIterator::RevDependsList() const
d3e8fbb3 447 {return DepIterator(*Owner,Owner->DepP + S->RevDepends,S);}
578bfd0a 448inline pkgCache::PrvIterator pkgCache::PkgIterator::ProvidesList() const
d3e8fbb3 449 {return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);}
a52f938b 450inline pkgCache::DescIterator pkgCache::VerIterator::DescriptionList() const
d3e8fbb3 451 {return DescIterator(*Owner,Owner->DescP + S->DescriptionList);}
578bfd0a 452inline pkgCache::PrvIterator pkgCache::VerIterator::ProvidesList() const
d3e8fbb3 453 {return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);}
578bfd0a 454inline pkgCache::DepIterator pkgCache::VerIterator::DependsList() const
d3e8fbb3 455 {return DepIterator(*Owner,Owner->DepP + S->DependsList,S);}
dcb79bae 456inline pkgCache::VerFileIterator pkgCache::VerIterator::FileList() const
d3e8fbb3 457 {return VerFileIterator(*Owner,Owner->VerFileP + S->FileList);}
a52f938b 458inline pkgCache::DescFileIterator pkgCache::DescIterator::FileList() const
d3e8fbb3 459 {return DescFileIterator(*Owner,Owner->DescFileP + S->FileList);}
92fcbfc1 460 /*}}}*/
578bfd0a 461#endif