merged from debian-sid
[ntk/apt.git] / apt-pkg / cacheiterators.h
index 1da5c6f..31b3ace 100644 (file)
                                                                        /*}}}*/
 #ifndef PKGLIB_CACHEITERATORS_H
 #define PKGLIB_CACHEITERATORS_H
+#include<iterator>
+
+#include<string.h>
 // abstract Iterator template                                          /*{{{*/
 /* This template provides the very basic iterator methods we
-   need to have for doing some walk-over-the-cache magic, */
-template<typename Str, typename Itr> class pkgCache::Iterator {
-       __attribute__ ((deprecated)) void _dummy(); // FIXME: Who on earth uses this method ???
-
+   need to have for doing some walk-over-the-cache magic */
+template<typename Str, typename Itr> class pkgCache::Iterator :
+                       public std::iterator<std::forward_iterator_tag, Str> {
        protected:
        Str *S;
        pkgCache *Owner;
@@ -64,17 +66,69 @@ template<typename Str, typename Itr> class pkgCache::Iterator {
        inline Str const *operator ->() const {return S;};
        inline operator Str *() {return S == OwnerPointer() ? 0 : S;};
        inline operator Str const *() const {return S == OwnerPointer() ? 0 : S;};
+       inline Str &operator *() {return *S;};
        inline Str const &operator *() const {return *S;};
-       inline pkgCache *Cache() {return Owner;};
+       inline pkgCache *Cache() const {return Owner;};
 
        // Mixed stuff
        inline void operator =(const Itr &B) {S = B.S; Owner = B.Owner;};
        inline bool IsGood() const { return S && Owner && ! end();};
        inline unsigned long Index() const {return S - OwnerPointer();};
 
+       void ReMap(void const * const oldMap, void const * const newMap) {
+               if (Owner == 0 || S == 0)
+                       return;
+               S += (Str*)(newMap) - (Str*)(oldMap);
+       }
+
        // Constructors - look out for the variable assigning
        inline Iterator() : S(0), Owner(0) {};
        inline Iterator(pkgCache &Owner,Str *T = 0) : S(T), Owner(&Owner) {};
+};
+                                                                       /*}}}*/
+// Group Iterator                                                      /*{{{*/
+/* Packages with the same name are collected in a Group so someone only
+   interest in package names can iterate easily over the names, so the
+   different architectures can be treated as of the "same" package
+   (apt internally treat them as totally different packages) */
+class pkgCache::GrpIterator: public Iterator<Group, GrpIterator> {
+       long HashIndex;
+
+       protected:
+       inline Group* OwnerPointer() const {
+               return (Owner != 0) ? Owner->GrpP : 0;
+       };
+
+       public:
+       // This constructor is the 'begin' constructor, never use it.
+       inline GrpIterator(pkgCache &Owner) : Iterator<Group, GrpIterator>(Owner), HashIndex(-1) {
+               S = OwnerPointer();
+               operator ++(0);
+       };
+
+       virtual void operator ++(int);
+       virtual void operator ++() {operator ++(0);};
+
+       inline const char *Name() const {return S->Name == 0?0:Owner->StrP + S->Name;};
+       inline PkgIterator PackageList() const;
+       PkgIterator FindPkg(string Arch = "any") const;
+       /** \brief find the package with the "best" architecture
+
+           The best architecture is either the "native" or the first
+           in the list of Architectures which is not an end-Pointer
+
+           \param PreferNonVirtual tries to respond with a non-virtual package
+                  and only if this fails returns the best virtual package */
+       PkgIterator FindPreferredPkg(bool const &PreferNonVirtual = true) const;
+       PkgIterator NextPkg(PkgIterator const &Pkg) const;
+
+       // Constructors
+       inline GrpIterator(pkgCache &Owner, Group *Trg) : Iterator<Group, GrpIterator>(Owner, Trg), HashIndex(0) {
+               if (S == 0)
+                       S = OwnerPointer();
+       };
+       inline GrpIterator() : Iterator<Group, GrpIterator>(), HashIndex(0) {};
+
 };
                                                                        /*}}}*/
 // Package Iterator                                                    /*{{{*/
@@ -83,7 +137,7 @@ class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
 
        protected:
        inline Package* OwnerPointer() const {
-               return Owner->PkgP;
+               return (Owner != 0) ? Owner->PkgP : 0;
        };
 
        public:
@@ -103,6 +157,8 @@ class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
        inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;};
        inline bool Purge() const {return S->CurrentState == pkgCache::State::Purge ||
                (S->CurrentVer == 0 && S->CurrentState == pkgCache::State::NotInstalled);};
+       inline const char *Arch() const {return S->Arch == 0?0:Owner->StrP + S->Arch;};
+       inline GrpIterator Group() const { return GrpIterator(*Owner, Owner->GrpP + S->Group);};
 
        inline VerIterator VersionList() const;
        inline VerIterator CurrentVer() const;
@@ -114,6 +170,7 @@ class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
 
        //Nice printable representation
        friend std::ostream& operator <<(std::ostream& out, PkgIterator i);
+       std::string FullName(bool const &Pretty = false) const;
 
        // Constructors
        inline PkgIterator(pkgCache &Owner,Package *Trg) : Iterator<Package, PkgIterator>(Owner, Trg), HashIndex(0) {
@@ -127,7 +184,7 @@ class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
 class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
        protected:
        inline Version* OwnerPointer() const {
-               return Owner->VerP;
+               return (Owner != 0) ? Owner->VerP : 0;
        };
 
        public:
@@ -137,11 +194,23 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
 
        // Comparison
        int CompareVer(const VerIterator &B) const;
+       /** \brief compares two version and returns if they are similar
+
+           This method should be used to identify if two pseudo versions are
+           refering to the same "real" version */
+       inline bool SimilarVer(const VerIterator &B) const {
+               return (B.end() == false && S->Hash == B->Hash && strcmp(VerStr(), B.VerStr()) == 0);
+       };
 
        // Accessors
        inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;};
        inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;};
-       inline const char *Arch() const {return S->Arch == 0?0:Owner->StrP + S->Arch;};
+       inline const char *Arch() const {
+               return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
+       };
+       __deprecated inline const char *Arch(bool const pseudo) const {
+               return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
+       };
        inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);};
 
        inline DescIterator DescriptionList() const;
@@ -150,10 +219,11 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
        inline PrvIterator ProvidesList() const;
        inline VerFileIterator FileList() const;
        bool Downloadable() const;
-       inline const char *PriorityType() {return Owner->Priority(S->Priority);};
-       string RelStr();
+       inline const char *PriorityType() const {return Owner->Priority(S->Priority);};
+       string RelStr() const;
 
        bool Automatic() const;
+       __deprecated bool Pseudo() const;
        VerFileIterator NewestFile() const;
 
        inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
@@ -167,7 +237,7 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
 class pkgCache::DescIterator : public Iterator<Description, DescIterator> {
        protected:
        inline Description* OwnerPointer() const {
-               return Owner->DescP;
+               return (Owner != 0) ? Owner->DescP : 0;
        };
 
        public:
@@ -196,7 +266,7 @@ class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
 
        protected:
        inline Dependency* OwnerPointer() const {
-               return Owner->DepP;
+               return (Owner != 0) ? Owner->DepP : 0;
        };
 
        public:
@@ -207,17 +277,20 @@ class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
 
        // Accessors
        inline const char *TargetVer() const {return S->Version == 0?0:Owner->StrP + S->Version;};
-       inline PkgIterator TargetPkg() {return PkgIterator(*Owner,Owner->PkgP + S->Package);};
-       inline PkgIterator SmartTargetPkg() {PkgIterator R(*Owner,0);SmartTargetPkg(R);return R;};
-       inline VerIterator ParentVer() {return VerIterator(*Owner,Owner->VerP + S->ParentVer);};
-       inline PkgIterator ParentPkg() {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->ParentVer].ParentPkg);};
-       inline bool Reverse() {return Type == DepRev;};
-       bool IsCritical();
+       inline PkgIterator TargetPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->Package);};
+       inline PkgIterator SmartTargetPkg() const {PkgIterator R(*Owner,0);SmartTargetPkg(R);return R;};
+       inline VerIterator ParentVer() const {return VerIterator(*Owner,Owner->VerP + S->ParentVer);};
+       inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->ParentVer].ParentPkg);};
+       inline bool Reverse() const {return Type == DepRev;};
+       bool IsCritical() const;
        void GlobOr(DepIterator &Start,DepIterator &End);
-       Version **AllTargets();
-       bool SmartTargetPkg(PkgIterator &Result);
-       inline const char *CompType() {return Owner->CompType(S->CompareOp);};
-       inline const char *DepType() {return Owner->DepType(S->Type);};
+       Version **AllTargets() const;
+       bool SmartTargetPkg(PkgIterator &Result) const;
+       inline const char *CompType() const {return Owner->CompType(S->CompareOp);};
+       inline const char *DepType() const {return Owner->DepType(S->Type);};
+
+       //Nice printable representation
+       friend std::ostream& operator <<(std::ostream& out, DepIterator D);
 
        inline DepIterator(pkgCache &Owner, Dependency *Trg, Version* = 0) :
                Iterator<Dependency, DepIterator>(Owner, Trg), Type(DepVer) {
@@ -238,7 +311,7 @@ class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
 
        protected:
        inline Provides* OwnerPointer() const {
-               return Owner->ProvideP;
+               return (Owner != 0) ? Owner->ProvideP : 0;
        };
 
        public:
@@ -250,9 +323,9 @@ class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
        // Accessors
        inline const char *Name() const {return Owner->StrP + Owner->PkgP[S->ParentPkg].Name;};
        inline const char *ProvideVersion() const {return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;};
-       inline PkgIterator ParentPkg() {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);};
-       inline VerIterator OwnerVer() {return VerIterator(*Owner,Owner->VerP + S->Version);};
-       inline PkgIterator OwnerPkg() {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->Version].ParentPkg);};
+       inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);};
+       inline VerIterator OwnerVer() const {return VerIterator(*Owner,Owner->VerP + S->Version);};
+       inline PkgIterator OwnerPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->Version].ParentPkg);};
 
        inline PrvIterator() : Iterator<Provides, PrvIterator>(), Type(PrvVer) {};
 
@@ -272,7 +345,7 @@ class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
 class pkgCache::PkgFileIterator : public Iterator<PackageFile, PkgFileIterator> {
        protected:
        inline PackageFile* OwnerPointer() const {
-               return Owner->PkgFileP;
+               return (Owner != 0) ? Owner->PkgFileP : 0;
        };
 
        public:
@@ -297,14 +370,15 @@ class pkgCache::PkgFileIterator : public Iterator<PackageFile, PkgFileIterator>
 
        // Constructors
        inline PkgFileIterator() : Iterator<PackageFile, PkgFileIterator>() {};
-       inline PkgFileIterator(pkgCache &Owner,PackageFile *Trg = 0) : Iterator<PackageFile, PkgFileIterator>(Owner, Trg) {};
+       inline PkgFileIterator(pkgCache &Owner) : Iterator<PackageFile, PkgFileIterator>(Owner, Owner.PkgFileP) {};
+       inline PkgFileIterator(pkgCache &Owner,PackageFile *Trg) : Iterator<PackageFile, PkgFileIterator>(Owner, Trg) {};
 };
                                                                        /*}}}*/
 // Version File                                                                /*{{{*/
 class pkgCache::VerFileIterator : public pkgCache::Iterator<VerFile, VerFileIterator> {
        protected:
        inline VerFile* OwnerPointer() const {
-               return Owner->VerFileP;
+               return (Owner != 0) ? Owner->VerFileP : 0;
        };
 
        public:
@@ -323,7 +397,7 @@ class pkgCache::VerFileIterator : public pkgCache::Iterator<VerFile, VerFileIter
 class pkgCache::DescFileIterator : public Iterator<DescFile, DescFileIterator> {
        protected:
        inline DescFile* OwnerPointer() const {
-               return Owner->DescFileP;
+               return (Owner != 0) ? Owner->DescFileP : 0;
        };
 
        public:
@@ -339,6 +413,8 @@ class pkgCache::DescFileIterator : public Iterator<DescFile, DescFileIterator> {
 };
                                                                        /*}}}*/
 // Inlined Begin functions cant be in the class because of order problems /*{{{*/
+inline pkgCache::PkgIterator pkgCache::GrpIterator::PackageList() const
+       {return PkgIterator(*Owner,Owner->PkgP + S->FirstPackage);};
 inline pkgCache::VerIterator pkgCache::PkgIterator::VersionList() const
        {return VerIterator(*Owner,Owner->VerP + S->VersionList);};
 inline pkgCache::VerIterator pkgCache::PkgIterator::CurrentVer() const