]> git.saurik.com Git - apt.git/blame - apt-pkg/cacheiterators.h
Bug #807012 also involves package dependencies :/.
[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>
eff0c22e
JAK
38#ifdef APT_PKG_EXPOSE_STRING_VIEW
39#include <apt-pkg/string_view.h>
40#endif
8ceeb9d6
DK
41
42#include<string.h>
472ff00e 43
773e2c1f
DK
44// abstract Iterator template /*{{{*/
45/* This template provides the very basic iterator methods we
5bf15716 46 need to have for doing some walk-over-the-cache magic */
b3fdb998
DK
47template<typename Str, typename Itr> class pkgCache::Iterator :
48 public std::iterator<std::forward_iterator_tag, Str> {
773e2c1f
DK
49 /** \brief Returns the Pointer for this struct in the owner
50 * The implementation of this method should be pretty short
51 * as it will only return the Pointer into the mmap stored
52 * in the owner but the name of this pointer is different for
1e3f4083 53 * each structure and we want to abstract here at least for the
773e2c1f
DK
54 * basic methods from the actual structure.
55 * \return Pointer to the first structure of this type
56 */
3707fd4f
DK
57 Str* OwnerPointer() const { return static_cast<Itr const*>(this)->OwnerPointer(); }
58
59 protected:
60 Str *S;
61 pkgCache *Owner;
773e2c1f
DK
62
63 public:
64 // Iteration
d3e8fbb3 65 inline bool end() const {return Owner == 0 || S == OwnerPointer();}
773e2c1f
DK
66
67 // Comparison
d3e8fbb3
DK
68 inline bool operator ==(const Itr &B) const {return S == B.S;}
69 inline bool operator !=(const Itr &B) const {return S != B.S;}
773e2c1f
DK
70
71 // Accessors
d3e8fbb3
DK
72 inline Str *operator ->() {return S;}
73 inline Str const *operator ->() const {return S;}
74 inline operator Str *() {return S == OwnerPointer() ? 0 : S;}
75 inline operator Str const *() const {return S == OwnerPointer() ? 0 : S;}
76 inline Str &operator *() {return *S;}
77 inline Str const &operator *() const {return *S;}
78 inline pkgCache *Cache() const {return Owner;}
773e2c1f
DK
79
80 // Mixed stuff
d3e8fbb3
DK
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
3707fd4f 103 public:
5bf15716 104 inline Group* OwnerPointer() const {
c55b8a54 105 return (Owner != 0) ? Owner->GrpP : 0;
d3e8fbb3 106 }
5bf15716 107
25396fb0 108 // This constructor is the 'begin' constructor, never use it.
e8afd168 109 explicit inline GrpIterator(pkgCache &Owner) : Iterator<Group, GrpIterator>(Owner), HashIndex(-1) {
25396fb0 110 S = OwnerPointer();
3707fd4f 111 operator++();
d3e8fbb3 112 }
25396fb0 113
3707fd4f
DK
114 GrpIterator& operator++();
115 inline GrpIterator operator++(int) { GrpIterator const tmp(*this); operator++(); return tmp; }
5bf15716 116
d3e8fbb3 117 inline const char *Name() const {return S->Name == 0?0:Owner->StrP + S->Name;}
5bf15716 118 inline PkgIterator PackageList() const;
8f3ba4e8 119 PkgIterator FindPkg(std::string Arch = "any") const;
eff0c22e
JAK
120#ifdef APT_PKG_EXPOSE_STRING_VIEW
121 APT_HIDDEN PkgIterator FindPkg(APT::StringView Arch = APT::StringView("any", 3)) const;
122 APT_HIDDEN PkgIterator FindPkg(const char *Arch) const;
123#endif
bd2fb30a
DK
124 /** \brief find the package with the "best" architecture
125
126 The best architecture is either the "native" or the first
3db58cf4
DK
127 in the list of Architectures which is not an end-Pointer
128
129 \param PreferNonVirtual tries to respond with a non-virtual package
130 and only if this fails returns the best virtual package */
131 PkgIterator FindPreferredPkg(bool const &PreferNonVirtual = true) const;
e841200b 132 PkgIterator NextPkg(PkgIterator const &Pkg) const;
5bf15716
DK
133
134 // Constructors
25396fb0 135 inline GrpIterator(pkgCache &Owner, Group *Trg) : Iterator<Group, GrpIterator>(Owner, Trg), HashIndex(0) {
5bf15716
DK
136 if (S == 0)
137 S = OwnerPointer();
d3e8fbb3
DK
138 }
139 inline GrpIterator() : Iterator<Group, GrpIterator>(), HashIndex(0) {}
5bf15716 140
773e2c1f
DK
141};
142 /*}}}*/
92fcbfc1 143// Package Iterator /*{{{*/
773e2c1f
DK
144class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
145 long HashIndex;
146
3707fd4f 147 public:
773e2c1f 148 inline Package* OwnerPointer() const {
c55b8a54 149 return (Owner != 0) ? Owner->PkgP : 0;
d3e8fbb3 150 }
773e2c1f 151
773e2c1f 152 // This constructor is the 'begin' constructor, never use it.
e8afd168 153 explicit inline PkgIterator(pkgCache &Owner) : Iterator<Package, PkgIterator>(Owner), HashIndex(-1) {
773e2c1f 154 S = OwnerPointer();
3707fd4f 155 operator++();
d3e8fbb3 156 }
773e2c1f 157
3707fd4f
DK
158 PkgIterator& operator++();
159 inline PkgIterator operator++(int) { PkgIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
160
161 enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure};
162
163 // Accessors
fe86debb 164 inline const char *Name() const { return Group().Name(); }
7a669774 165 // Versions have sections - and packages can have different versions with different sections
50ef3344 166 // so this interface is broken by design. Run as fast as you can to Version.Section().
5dd00edb 167 APT_DEPRECATED_MSG("Use the .Section method of VerIterator instead") inline 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;
29636cc7 178 APT_DEPRECATED_MSG("This method does not respect apt_preferences! Use pkgDepCache::GetCandidateVersion(Pkg)") const char *CandVersion() const APT_PURE;
a02db58f 179 const char *CurVersion() const APT_PURE;
773e2c1f
DK
180
181 //Nice printable representation
84573326 182 APT_DEPRECATED_MSG("Use APT::PrettyPkg instead") 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 194class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
3707fd4f 195 public:
773e2c1f 196 inline Version* OwnerPointer() const {
c55b8a54 197 return (Owner != 0) ? Owner->VerP : 0;
d3e8fbb3 198 }
773e2c1f 199
773e2c1f 200 // Iteration
3707fd4f
DK
201 inline VerIterator& operator++() {if (S != Owner->VerP) S = Owner->VerP + S->NextVer; return *this;}
202 inline VerIterator operator++(int) { VerIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
203
204 // Comparison
205 int CompareVer(const VerIterator &B) const;
8ceeb9d6
DK
206 /** \brief compares two version and returns if they are similar
207
208 This method should be used to identify if two pseudo versions are
1e3f4083 209 referring to the same "real" version */
8ceeb9d6
DK
210 inline bool SimilarVer(const VerIterator &B) const {
211 return (B.end() == false && S->Hash == B->Hash && strcmp(VerStr(), B.VerStr()) == 0);
d3e8fbb3 212 }
773e2c1f
DK
213
214 // Accessors
d3e8fbb3
DK
215 inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;}
216 inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;}
ef1e4dfd 217 inline const char *Display() const {return S->Display == 0?0:Owner->StrP + S->Display;}
a221efc3
DK
218 /** \brief source package name this version comes from
219 Always contains the name, even if it is the same as the binary name */
220 inline const char *SourcePkgName() const {return Owner->StrP + S->SourcePkgName;}
221 /** \brief source version this version comes from
222 Always contains the version string, even if it is the same as the binary version */
223 inline const char *SourceVerStr() const {return Owner->StrP + S->SourceVerStr;}
c5dac10c 224 inline const char *Arch() const {
2a2a7ef4 225 if ((S->MultiArch & pkgCache::Version::All) == pkgCache::Version::All)
ca238ede 226 return "all";
c5dac10c 227 return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
d3e8fbb3
DK
228 }
229 inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
773e2c1f
DK
230
231 inline DescIterator DescriptionList() const;
232 DescIterator TranslatedDescription() const;
233 inline DepIterator DependsList() const;
234 inline PrvIterator ProvidesList() const;
a473295d 235 inline TagIterator TagList() const;
773e2c1f
DK
236 inline VerFileIterator FileList() const;
237 bool Downloadable() const;
d3e8fbb3 238 inline const char *PriorityType() const {return Owner->Priority(S->Priority);}
a02db58f 239 const char *MultiArchType() const APT_PURE;
8f3ba4e8 240 std::string RelStr() const;
773e2c1f
DK
241
242 bool Automatic() const;
243 VerFileIterator NewestFile() const;
244
245 inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
246 if (S == 0)
247 S = OwnerPointer();
d3e8fbb3
DK
248 }
249 inline VerIterator() : Iterator<Version, VerIterator>() {}
578bfd0a 250};
92fcbfc1 251 /*}}}*/
a473295d
JF
252// Tag Iterator /*{{{*/
253class pkgCache::TagIterator
254{
255 Tag *Tg;
256 pkgCache *Owner;
257
258 void _dummy();
259
260 public:
261
262 // Iteration
263 void operator ++(int) {if (Tg != Owner->TagP) Tg = Owner->TagP + Tg->NextTag;};
264 inline void operator ++() {operator ++(0);};
265 inline bool end() const {return Tg == Owner->TagP?true:false;};
266 inline void operator =(const TagIterator &B) {Tg = B.Tg; Owner = B.Owner;};
267
268 // Comparison
269 inline bool operator ==(const TagIterator &B) const {return Tg == B.Tg;};
270 inline bool operator !=(const TagIterator &B) const {return Tg != B.Tg;};
271 int CompareTag(const TagIterator &B) const;
272
273 // Accessors
274 inline Tag *operator ->() {return Tg;};
275 inline Tag const *operator ->() const {return Tg;};
276 inline Tag &operator *() {return *Tg;};
277 inline Tag const &operator *() const {return *Tg;};
278 inline operator Tag *() {return Tg == Owner->TagP?0:Tg;};
279 inline operator Tag const *() const {return Tg == Owner->TagP?0:Tg;};
280 inline pkgCache *Cache() {return Owner;};
281
282 inline const char *Name() const {return Owner->StrP + Tg->Name;};
283 inline unsigned long Index() const {return Tg - Owner->TagP;};
284
285 inline TagIterator() : Tg(0), Owner(0) {};
286 inline TagIterator(pkgCache &Owner,Tag *Trg = 0) : Tg(Trg),
287 Owner(&Owner)
288 {
289 if (Tg == 0)
290 Tg = Owner.TagP;
291 };
292};
293 /*}}}*/
92fcbfc1 294// Description Iterator /*{{{*/
773e2c1f 295class pkgCache::DescIterator : public Iterator<Description, DescIterator> {
3707fd4f 296 public:
773e2c1f 297 inline Description* OwnerPointer() const {
c55b8a54 298 return (Owner != 0) ? Owner->DescP : 0;
d3e8fbb3 299 }
773e2c1f 300
773e2c1f 301 // Iteration
3707fd4f
DK
302 inline DescIterator& operator++() {if (S != Owner->DescP) S = Owner->DescP + S->NextDesc; return *this;}
303 inline DescIterator operator++(int) { DescIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
304
305 // Comparison
306 int CompareDesc(const DescIterator &B) const;
307
308 // Accessors
d3e8fbb3
DK
309 inline const char *LanguageCode() const {return Owner->StrP + S->language_code;}
310 inline const char *md5() const {return Owner->StrP + S->md5sum;}
773e2c1f
DK
311 inline DescFileIterator FileList() const;
312
d3e8fbb3 313 inline DescIterator() : Iterator<Description, DescIterator>() {}
773e2c1f
DK
314 inline DescIterator(pkgCache &Owner,Description *Trg = 0) : Iterator<Description, DescIterator>(Owner, Trg) {
315 if (S == 0)
316 S = Owner.DescP;
d3e8fbb3 317 }
a52f938b 318};
92fcbfc1
DK
319 /*}}}*/
320// Dependency iterator /*{{{*/
773e2c1f
DK
321class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
322 enum {DepVer, DepRev} Type;
71c9e95b 323 DependencyData * S2;
773e2c1f 324
3707fd4f 325 public:
773e2c1f 326 inline Dependency* OwnerPointer() const {
c55b8a54 327 return (Owner != 0) ? Owner->DepP : 0;
d3e8fbb3 328 }
773e2c1f 329
773e2c1f 330 // Iteration
71c9e95b 331 DepIterator& operator++();
3707fd4f 332 inline DepIterator operator++(int) { DepIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
333
334 // Accessors
71c9e95b
DK
335 inline const char *TargetVer() const {return S2->Version == 0?0:Owner->StrP + S2->Version;}
336 inline PkgIterator TargetPkg() const {return PkgIterator(*Owner,Owner->PkgP + S2->Package);}
d3e8fbb3
DK
337 inline PkgIterator SmartTargetPkg() const {PkgIterator R(*Owner,0);SmartTargetPkg(R);return R;}
338 inline VerIterator ParentVer() const {return VerIterator(*Owner,Owner->VerP + S->ParentVer);}
339 inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->ParentVer].ParentPkg);}
340 inline bool Reverse() const {return Type == DepRev;}
a02db58f
DK
341 bool IsCritical() const APT_PURE;
342 bool IsNegative() const APT_PURE;
343 bool IsIgnorable(PrvIterator const &Prv) const APT_PURE;
344 bool IsIgnorable(PkgIterator const &Pkg) const APT_PURE;
8c7af4d4
DK
345 /* MultiArch can be translated to SingleArch for an resolver and we did so,
346 by adding dependencies to help the resolver understand the problem, but
347 sometimes it is needed to identify these to ignore them… */
348 inline bool IsMultiArchImplicit() const APT_PURE {
349 return (S2->CompareOp & pkgCache::Dep::MultiArchImplicit) == pkgCache::Dep::MultiArchImplicit;
350 }
351 /* This covers additionally negative dependencies, which aren't arch-specific,
3a8776a3 352 but change architecture nonetheless as a Conflicts: foo does applies for all archs */
8c7af4d4
DK
353 bool IsImplicit() const APT_PURE;
354
a02db58f
DK
355 bool IsSatisfied(VerIterator const &Ver) const APT_PURE;
356 bool IsSatisfied(PrvIterator const &Prv) const APT_PURE;
773e2c1f 357 void GlobOr(DepIterator &Start,DepIterator &End);
e841200b
DK
358 Version **AllTargets() const;
359 bool SmartTargetPkg(PkgIterator &Result) const;
71c9e95b
DK
360 inline const char *CompType() const {return Owner->CompType(S2->CompareOp);}
361 inline const char *DepType() const {return Owner->DepType(S2->Type);}
362
363 // overrides because we are special
364 struct DependencyProxy
365 {
366 map_stringitem_t &Version;
367 map_pointer_t &Package;
4dc77823 368 map_id_t &ID;
71c9e95b
DK
369 unsigned char &Type;
370 unsigned char &CompareOp;
371 map_pointer_t &ParentVer;
372 map_pointer_t &DependencyData;
373 map_pointer_t &NextRevDepends;
374 map_pointer_t &NextDepends;
b291aa59 375 map_pointer_t &NextData;
71c9e95b
DK
376 DependencyProxy const * operator->() const { return this; }
377 DependencyProxy * operator->() { return this; }
378 };
350d30d2
JAK
379 inline DependencyProxy operator->() const {return (DependencyProxy) { S2->Version, S2->Package, S->ID, S2->Type, S2->CompareOp, S->ParentVer, S->DependencyData, S->NextRevDepends, S->NextDepends, S2->NextData };}
380 inline DependencyProxy operator->() {return (DependencyProxy) { S2->Version, S2->Package, S->ID, S2->Type, S2->CompareOp, S->ParentVer, S->DependencyData, S->NextRevDepends, S->NextDepends, S2->NextData };}
71c9e95b
DK
381 void ReMap(void const * const oldMap, void const * const newMap)
382 {
383 Iterator<Dependency, DepIterator>::ReMap(oldMap, newMap);
384 if (Owner == 0 || S == 0 || S2 == 0)
385 return;
386 S2 += (DependencyData const * const)(newMap) - (DependencyData const * const)(oldMap);
387 }
773e2c1f 388
47f6d1b7 389 //Nice printable representation
84573326 390 APT_DEPRECATED_MSG("Use APT::PrettyDep instead") friend std::ostream& operator <<(std::ostream& out, DepIterator D);
47f6d1b7 391
773e2c1f 392 inline DepIterator(pkgCache &Owner, Dependency *Trg, Version* = 0) :
71c9e95b 393 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepVer), S2(Trg == 0 ? Owner.DepDataP : (Owner.DepDataP + Trg->DependencyData)) {
773e2c1f
DK
394 if (S == 0)
395 S = Owner.DepP;
d3e8fbb3 396 }
773e2c1f 397 inline DepIterator(pkgCache &Owner, Dependency *Trg, Package*) :
71c9e95b 398 Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepRev), S2(Trg == 0 ? Owner.DepDataP : (Owner.DepDataP + Trg->DependencyData)) {
773e2c1f
DK
399 if (S == 0)
400 S = Owner.DepP;
d3e8fbb3 401 }
71c9e95b 402 inline DepIterator() : Iterator<Dependency, DepIterator>(), Type(DepVer), S2(0) {}
578bfd0a 403};
92fcbfc1
DK
404 /*}}}*/
405// Provides iterator /*{{{*/
773e2c1f
DK
406class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
407 enum {PrvVer, PrvPkg} Type;
408
3707fd4f 409 public:
773e2c1f 410 inline Provides* OwnerPointer() const {
c55b8a54 411 return (Owner != 0) ? Owner->ProvideP : 0;
d3e8fbb3 412 }
773e2c1f 413
773e2c1f 414 // Iteration
3707fd4f
DK
415 inline PrvIterator& operator ++() {if (S != Owner->ProvideP) S = Owner->ProvideP +
416 (Type == PrvVer?S->NextPkgProv:S->NextProvides); return *this;}
417 inline PrvIterator operator++(int) { PrvIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
418
419 // Accessors
fe86debb 420 inline const char *Name() const {return ParentPkg().Name();}
d3e8fbb3
DK
421 inline const char *ProvideVersion() const {return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;}
422 inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
423 inline VerIterator OwnerVer() const {return VerIterator(*Owner,Owner->VerP + S->Version);}
424 inline PkgIterator OwnerPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->Version].ParentPkg);}
773e2c1f 425
8c7af4d4
DK
426 /* MultiArch can be translated to SingleArch for an resolver and we did so,
427 by adding provides to help the resolver understand the problem, but
428 sometimes it is needed to identify these to ignore them… */
429 bool IsMultiArchImplicit() const APT_PURE
430 { return (S->Flags & pkgCache::Flag::MultiArchImplicit) == pkgCache::Flag::MultiArchImplicit; }
431
773e2c1f 432
d3e8fbb3 433 inline PrvIterator() : Iterator<Provides, PrvIterator>(), Type(PrvVer) {}
773e2c1f
DK
434 inline PrvIterator(pkgCache &Owner, Provides *Trg, Version*) :
435 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvVer) {
436 if (S == 0)
437 S = Owner.ProvideP;
d3e8fbb3 438 }
773e2c1f
DK
439 inline PrvIterator(pkgCache &Owner, Provides *Trg, Package*) :
440 Iterator<Provides, PrvIterator>(Owner, Trg), Type(PrvPkg) {
441 if (S == 0)
442 S = Owner.ProvideP;
d3e8fbb3 443 }
578bfd0a 444};
92fcbfc1 445 /*}}}*/
b07aeb1a
DK
446// Release file /*{{{*/
447class pkgCache::RlsFileIterator : public Iterator<ReleaseFile, RlsFileIterator> {
3707fd4f 448 public:
b07aeb1a
DK
449 inline ReleaseFile* OwnerPointer() const {
450 return (Owner != 0) ? Owner->RlsFileP : 0;
d3e8fbb3 451 }
773e2c1f 452
773e2c1f 453 // Iteration
3707fd4f
DK
454 inline RlsFileIterator& operator++() {if (S != Owner->RlsFileP) S = Owner->RlsFileP + S->NextFile;return *this;}
455 inline RlsFileIterator operator++(int) { RlsFileIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
456
457 // Accessors
d3e8fbb3
DK
458 inline const char *FileName() const {return S->FileName == 0?0:Owner->StrP + S->FileName;}
459 inline const char *Archive() const {return S->Archive == 0?0:Owner->StrP + S->Archive;}
d3e8fbb3
DK
460 inline const char *Version() const {return S->Version == 0?0:Owner->StrP + S->Version;}
461 inline const char *Origin() const {return S->Origin == 0?0:Owner->StrP + S->Origin;}
462 inline const char *Codename() const {return S->Codename ==0?0:Owner->StrP + S->Codename;}
463 inline const char *Label() const {return S->Label == 0?0:Owner->StrP + S->Label;}
464 inline const char *Site() const {return S->Site == 0?0:Owner->StrP + S->Site;}
b07aeb1a
DK
465 inline bool Flagged(pkgCache::Flag::ReleaseFileFlags const flag) const {return (S->Flags & flag) == flag; }
466
467 bool IsOk();
468 std::string RelStr();
469
470 // Constructors
471 inline RlsFileIterator() : Iterator<ReleaseFile, RlsFileIterator>() {}
e8afd168 472 explicit inline RlsFileIterator(pkgCache &Owner) : Iterator<ReleaseFile, RlsFileIterator>(Owner, Owner.RlsFileP) {}
b07aeb1a
DK
473 inline RlsFileIterator(pkgCache &Owner,ReleaseFile *Trg) : Iterator<ReleaseFile, RlsFileIterator>(Owner, Trg) {}
474};
475 /*}}}*/
476// Package file /*{{{*/
477class pkgCache::PkgFileIterator : public Iterator<PackageFile, PkgFileIterator> {
3707fd4f 478 public:
b07aeb1a
DK
479 inline PackageFile* OwnerPointer() const {
480 return (Owner != 0) ? Owner->PkgFileP : 0;
481 }
482
b07aeb1a 483 // Iteration
3707fd4f
DK
484 inline PkgFileIterator& operator++() {if (S != Owner->PkgFileP) S = Owner->PkgFileP + S->NextFile; return *this;}
485 inline PkgFileIterator operator++(int) { PkgFileIterator const tmp(*this); operator++(); return tmp; }
b07aeb1a
DK
486
487 // Accessors
488 inline const char *FileName() const {return S->FileName == 0?0:Owner->StrP + S->FileName;}
489 inline pkgCache::RlsFileIterator ReleaseFile() const {return RlsFileIterator(*Owner, Owner->RlsFileP + S->Release);}
490 inline const char *Archive() const {return S->Release == 0 ? Component() : ReleaseFile().Archive();}
491 inline const char *Version() const {return S->Release == 0 ? NULL : ReleaseFile().Version();}
492 inline const char *Origin() const {return S->Release == 0 ? NULL : ReleaseFile().Origin();}
493 inline const char *Codename() const {return S->Release == 0 ? NULL : ReleaseFile().Codename();}
494 inline const char *Label() const {return S->Release == 0 ? NULL : ReleaseFile().Label();}
495 inline const char *Site() const {return S->Release == 0 ? NULL : ReleaseFile().Site();}
496 inline bool Flagged(pkgCache::Flag::ReleaseFileFlags const flag) const {return S->Release== 0 ? false : ReleaseFile().Flagged(flag);}
497 inline bool Flagged(pkgCache::Flag::PkgFFlags const flag) const {return (S->Flags & flag) == flag;}
498 inline const char *Component() const {return S->Component == 0?0:Owner->StrP + S->Component;}
d3e8fbb3
DK
499 inline const char *Architecture() const {return S->Architecture == 0?0:Owner->StrP + S->Architecture;}
500 inline const char *IndexType() const {return S->IndexType == 0?0:Owner->StrP + S->IndexType;}
773e2c1f
DK
501
502 bool IsOk();
8f3ba4e8 503 std::string RelStr();
773e2c1f
DK
504
505 // Constructors
d3e8fbb3 506 inline PkgFileIterator() : Iterator<PackageFile, PkgFileIterator>() {}
e8afd168 507 explicit inline PkgFileIterator(pkgCache &Owner) : Iterator<PackageFile, PkgFileIterator>(Owner, Owner.PkgFileP) {}
d3e8fbb3 508 inline PkgFileIterator(pkgCache &Owner,PackageFile *Trg) : Iterator<PackageFile, PkgFileIterator>(Owner, Trg) {}
578bfd0a 509};
92fcbfc1
DK
510 /*}}}*/
511// Version File /*{{{*/
773e2c1f 512class pkgCache::VerFileIterator : public pkgCache::Iterator<VerFile, VerFileIterator> {
3707fd4f 513 public:
773e2c1f 514 inline VerFile* OwnerPointer() const {
c55b8a54 515 return (Owner != 0) ? Owner->VerFileP : 0;
d3e8fbb3 516 }
773e2c1f 517
773e2c1f 518 // Iteration
3707fd4f
DK
519 inline VerFileIterator& operator++() {if (S != Owner->VerFileP) S = Owner->VerFileP + S->NextFile; return *this;}
520 inline VerFileIterator operator++(int) { VerFileIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
521
522 // Accessors
d3e8fbb3 523 inline PkgFileIterator File() const {return PkgFileIterator(*Owner,S->File + Owner->PkgFileP);}
773e2c1f 524
d3e8fbb3
DK
525 inline VerFileIterator() : Iterator<VerFile, VerFileIterator>() {}
526 inline VerFileIterator(pkgCache &Owner,VerFile *Trg) : Iterator<VerFile, VerFileIterator>(Owner, Trg) {}
dcb79bae 527};
92fcbfc1
DK
528 /*}}}*/
529// Description File /*{{{*/
773e2c1f 530class pkgCache::DescFileIterator : public Iterator<DescFile, DescFileIterator> {
3707fd4f 531 public:
773e2c1f 532 inline DescFile* OwnerPointer() const {
c55b8a54 533 return (Owner != 0) ? Owner->DescFileP : 0;
d3e8fbb3 534 }
773e2c1f 535
773e2c1f 536 // Iteration
3707fd4f
DK
537 inline DescFileIterator& operator++() {if (S != Owner->DescFileP) S = Owner->DescFileP + S->NextFile; return *this;}
538 inline DescFileIterator operator++(int) { DescFileIterator const tmp(*this); operator++(); return tmp; }
773e2c1f
DK
539
540 // Accessors
d3e8fbb3 541 inline PkgFileIterator File() const {return PkgFileIterator(*Owner,S->File + Owner->PkgFileP);}
773e2c1f 542
d3e8fbb3
DK
543 inline DescFileIterator() : Iterator<DescFile, DescFileIterator>() {}
544 inline DescFileIterator(pkgCache &Owner,DescFile *Trg) : Iterator<DescFile, DescFileIterator>(Owner, Trg) {}
a52f938b 545};
92fcbfc1 546 /*}}}*/
1e3f4083 547// Inlined Begin functions can't be in the class because of order problems /*{{{*/
5bf15716 548inline pkgCache::PkgIterator pkgCache::GrpIterator::PackageList() const
d3e8fbb3 549 {return PkgIterator(*Owner,Owner->PkgP + S->FirstPackage);}
578bfd0a 550inline pkgCache::VerIterator pkgCache::PkgIterator::VersionList() const
d3e8fbb3 551 {return VerIterator(*Owner,Owner->VerP + S->VersionList);}
578bfd0a 552inline pkgCache::VerIterator pkgCache::PkgIterator::CurrentVer() const
d3e8fbb3 553 {return VerIterator(*Owner,Owner->VerP + S->CurrentVer);}
578bfd0a 554inline pkgCache::DepIterator pkgCache::PkgIterator::RevDependsList() const
d3e8fbb3 555 {return DepIterator(*Owner,Owner->DepP + S->RevDepends,S);}
578bfd0a 556inline pkgCache::PrvIterator pkgCache::PkgIterator::ProvidesList() const
d3e8fbb3 557 {return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);}
a52f938b 558inline pkgCache::DescIterator pkgCache::VerIterator::DescriptionList() const
d3e8fbb3 559 {return DescIterator(*Owner,Owner->DescP + S->DescriptionList);}
578bfd0a 560inline pkgCache::PrvIterator pkgCache::VerIterator::ProvidesList() const
d3e8fbb3 561 {return PrvIterator(*Owner,Owner->ProvideP + S->ProvidesList,S);}
a473295d
JF
562inline pkgCache::TagIterator pkgCache::VerIterator::TagList() const
563 {return TagIterator(*Owner,Owner->TagP + S->TagList);};
578bfd0a 564inline pkgCache::DepIterator pkgCache::VerIterator::DependsList() const
d3e8fbb3 565 {return DepIterator(*Owner,Owner->DepP + S->DependsList,S);}
dcb79bae 566inline pkgCache::VerFileIterator pkgCache::VerIterator::FileList() const
d3e8fbb3 567 {return VerFileIterator(*Owner,Owner->VerFileP + S->FileList);}
a52f938b 568inline pkgCache::DescFileIterator pkgCache::DescIterator::FileList() const
d3e8fbb3 569 {return DescFileIterator(*Owner,Owner->DescFileP + S->FileList);}
5dd00edb 570APT_DEPRECATED_MSG("Use the .Section method of VerIterator instead") inline const char * pkgCache::PkgIterator::Section() const
a1dfe337 571 {return S->VersionList == 0 ? 0 : VersionList().Section();}
92fcbfc1 572 /*}}}*/
578bfd0a 573#endif