]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/pkgcache.h
follow the googletest merge in build-depends
[apt.git] / apt-pkg / pkgcache.h
index 3fa815c159600c3847dd56a074466e8fcd926f8f..91228f7133ac4196571e97ee690c568b57b92dd1 100644 (file)
 #include <time.h>
 #include <stdint.h>
 
 #include <time.h>
 #include <stdint.h>
 
+#ifdef APT_PKG_EXPOSE_STRING_VIEW
+#include <apt-pkg/string_view.h>
+#endif
+
 #ifndef APT_8_CLEANER_HEADERS
 using std::string;
 #endif
 #ifndef APT_8_CLEANER_HEADERS
 using std::string;
 #endif
@@ -97,6 +101,9 @@ typedef uint16_t map_fileid_t;
 typedef uint32_t map_pointer_t;
 // same as the previous, but documented to be to a string item
 typedef map_pointer_t map_stringitem_t;
 typedef uint32_t map_pointer_t;
 // same as the previous, but documented to be to a string item
 typedef map_pointer_t map_stringitem_t;
+// we have only a small amount of flags for each item
+typedef uint8_t map_flags_t;
+typedef uint8_t map_number_t;
 
 class pkgVersioningSystem;
 class pkgCache                                                         /*{{{*/
 
 class pkgVersioningSystem;
 class pkgCache                                                         /*{{{*/
@@ -146,8 +153,12 @@ class pkgCache                                                             /*{{{*/
           The lower 4 bits are used to indicate what operator is being specified and
           the upper 4 bits are flags. OR indicates that the next package is
           or'd with the current package. */
           The lower 4 bits are used to indicate what operator is being specified and
           the upper 4 bits are flags. OR indicates that the next package is
           or'd with the current package. */
-      enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
-        Greater=0x4,Equals=0x5,NotEquals=0x6};
+      enum DepCompareOp {NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
+        Greater=0x4,Equals=0x5,NotEquals=0x6,
+        Or=0x10, /*!< or'ed with the next dependency */
+        MultiArchImplicit=0x20, /*!< generated internally, not spelled out in the index */
+        ArchSpecific=0x40 /*!< was decorated with an explicit architecture in index */
+      };
    };
    
    struct State
    };
    
    struct State
@@ -175,6 +186,10 @@ class pkgCache                                                             /*{{{*/
         NotAutomatic=(1<<0), /*!< archive has a default pin of 1 */
         ButAutomaticUpgrades=(1<<1), /*!< (together with the previous) archive has a default pin of 100 */
       };
         NotAutomatic=(1<<0), /*!< archive has a default pin of 1 */
         ButAutomaticUpgrades=(1<<1), /*!< (together with the previous) archive has a default pin of 100 */
       };
+      enum ProvidesFlags {
+        MultiArchImplicit=pkgCache::Dep::MultiArchImplicit, /*!< generated internally, not spelled out in the index */
+        ArchSpecific=pkgCache::Dep::ArchSpecific /*!< was decorated with an explicit architecture in index */
+      };
    };
    
    protected:
    };
    
    protected:
@@ -182,7 +197,9 @@ class pkgCache                                                              /*{{{*/
    // Memory mapped cache file
    std::string CacheFile;
    MMap &Map;
    // Memory mapped cache file
    std::string CacheFile;
    MMap &Map;
-
+#ifdef APT_PKG_EXPOSE_STRING_VIEW
+   APT_HIDDEN map_id_t sHash(APT::StringView S) const APT_PURE;
+#endif
    map_id_t sHash(const std::string &S) const APT_PURE;
    map_id_t sHash(const char *S) const APT_PURE;
    
    map_id_t sHash(const std::string &S) const APT_PURE;
    map_id_t sHash(const char *S) const APT_PURE;
    
@@ -201,7 +218,7 @@ class pkgCache                                                              /*{{{*/
    Provides *ProvideP;
    Dependency *DepP;
    DependencyData *DepDataP;
    Provides *ProvideP;
    Dependency *DepP;
    DependencyData *DepDataP;
-   APT_DEPRECATED StringItem *StringItemP;
+   APT_DEPRECATED_MSG("Not used anymore in cache generation and without a replacement") StringItem *StringItemP;
    char *StrP;
 
    virtual bool ReMap(bool const &Errorchecks = true);
    char *StrP;
 
    virtual bool ReMap(bool const &Errorchecks = true);
@@ -210,13 +227,34 @@ class pkgCache                                                            /*{{{*/
    inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}
       
    // String hashing function (512 range)
    inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}
       
    // String hashing function (512 range)
+#ifdef APT_PKG_EXPOSE_STRING_VIEW
+   APT_HIDDEN inline map_id_t Hash(APT::StringView S) const {return sHash(S);}
+#endif
    inline map_id_t Hash(const std::string &S) const {return sHash(S);}
    inline map_id_t Hash(const char *S) const {return sHash(S);}
 
    inline map_id_t Hash(const std::string &S) const {return sHash(S);}
    inline map_id_t Hash(const char *S) const {return sHash(S);}
 
+   APT_HIDDEN uint32_t CacheHash();
+
    // Useful transformation things
    // Useful transformation things
-   const char *Priority(unsigned char Priority);
+   static const char *Priority(unsigned char Priority);
    
    // Accessors
    
    // Accessors
+#ifdef APT_PKG_EXPOSE_STRING_VIEW
+   APT_HIDDEN GrpIterator FindGrp(APT::StringView Name);
+   APT_HIDDEN PkgIterator FindPkg(APT::StringView Name);
+   APT_HIDDEN PkgIterator FindPkg(APT::StringView Name, APT::StringView Arch);
+#endif
+
+#ifdef APT_PKG_EXPOSE_STRING_VIEW
+   APT::StringView ViewString(map_stringitem_t idx) const
+   {
+      char *name = StrP + idx;
+      uint16_t len = *reinterpret_cast<const uint16_t*>(name - sizeof(uint16_t));
+      return APT::StringView(name, len);
+   }
+#endif
+
+
    GrpIterator FindGrp(const std::string &Name);
    PkgIterator FindPkg(const std::string &Name);
    PkgIterator FindPkg(const std::string &Name, const std::string &Arch);
    GrpIterator FindGrp(const std::string &Name);
    PkgIterator FindPkg(const std::string &Name);
    PkgIterator FindPkg(const std::string &Name, const std::string &Arch);
@@ -248,7 +286,6 @@ class pkgCache                                                              /*{{{*/
 private:
    void * const d;
    bool MultiArchEnabled;
 private:
    void * const d;
    bool MultiArchEnabled;
-   APT_HIDDEN PkgIterator SingleArchFindPkg(const std::string &Name);
 };
                                                                        /*}}}*/
 // Header structure                                                    /*{{{*/
 };
                                                                        /*}}}*/
 // Header structure                                                    /*{{{*/
@@ -259,10 +296,10 @@ struct pkgCache::Header
        This must contain the hex value 0x98FE76DC which is designed to
        verify that the system loading the image has the same byte order
        and byte size as the system saving the image */
        This must contain the hex value 0x98FE76DC which is designed to
        verify that the system loading the image has the same byte order
        and byte size as the system saving the image */
-   unsigned long Signature;
+   uint32_t Signature;
    /** These contain the version of the cache file */
    /** These contain the version of the cache file */
-   short MajorVersion;
-   short MinorVersion;
+   map_number_t MajorVersion;
+   map_number_t MinorVersion;
    /** \brief indicates if the cache should be erased
 
        Dirty is true if the cache file was opened for reading, the client
    /** \brief indicates if the cache should be erased
 
        Dirty is true if the cache file was opened for reading, the client
@@ -277,18 +314,18 @@ struct pkgCache::Header
 
        If any of the size values do not exactly match what the client expects
        then the client should refuse the load the file. */
 
        If any of the size values do not exactly match what the client expects
        then the client should refuse the load the file. */
-   unsigned short HeaderSz;
-   unsigned short GroupSz;
-   unsigned short PackageSz;
-   unsigned short ReleaseFileSz;
-   unsigned short PackageFileSz;
-   unsigned short VersionSz;
-   unsigned short DescriptionSz;
-   unsigned short DependencySz;
-   unsigned short DependencyDataSz;
-   unsigned short ProvidesSz;
-   unsigned short VerFileSz;
-   unsigned short DescFileSz;
+   uint16_t HeaderSz;
+   map_number_t GroupSz;
+   map_number_t PackageSz;
+   map_number_t ReleaseFileSz;
+   map_number_t PackageFileSz;
+   map_number_t VersionSz;
+   map_number_t DescriptionSz;
+   map_number_t DependencySz;
+   map_number_t DependencyDataSz;
+   map_number_t ProvidesSz;
+   map_number_t VerFileSz;
+   map_number_t DescFileSz;
 
    /** \brief Structure counts
 
 
    /** \brief Structure counts
 
@@ -346,15 +383,15 @@ struct pkgCache::Header
        In the PkgHashTable is it possible that multiple packages have the same name -
        these packages are stored as a sequence in the list.
        The size of both tables is the same. */
        In the PkgHashTable is it possible that multiple packages have the same name -
        these packages are stored as a sequence in the list.
        The size of both tables is the same. */
-   unsigned int HashTableSize;
-   unsigned int GetHashTableSize() const { return HashTableSize; }
+   uint32_t HashTableSize;
+   uint32_t GetHashTableSize() const { return HashTableSize; }
    void SetHashTableSize(unsigned int const sz) { HashTableSize = sz; }
    map_pointer_t GetArchitectures() const { return Architectures; }
    void SetArchitectures(map_pointer_t const idx) { Architectures = idx; }
    map_pointer_t * PkgHashTableP() const { return (map_pointer_t*) (this + 1); }
    map_pointer_t * GrpHashTableP() const { return PkgHashTableP() + GetHashTableSize(); }
 
    void SetHashTableSize(unsigned int const sz) { HashTableSize = sz; }
    map_pointer_t GetArchitectures() const { return Architectures; }
    void SetArchitectures(map_pointer_t const idx) { Architectures = idx; }
    map_pointer_t * PkgHashTableP() const { return (map_pointer_t*) (this + 1); }
    map_pointer_t * GrpHashTableP() const { return PkgHashTableP() + GetHashTableSize(); }
 
-   /** \brief Size of the complete cache file */
+   /** \brief Hash of the file (TODO: Rename) */
    map_filesize_small_t CacheFileSize;
 
    bool CheckSizes(Header &Against) const APT_PURE;
    map_filesize_small_t CacheFileSize;
 
    bool CheckSizes(Header &Against) const APT_PURE;
@@ -403,7 +440,7 @@ struct pkgCache::Package
     * Note that the access method Name() will remain. It is just this data member
     * deprecated as this information is already stored and available via the
     * associated Group – so it is wasting precious binary cache space */
     * Note that the access method Name() will remain. It is just this data member
     * deprecated as this information is already stored and available via the
     * associated Group – so it is wasting precious binary cache space */
-   APT_DEPRECATED map_stringitem_t Name;
+   APT_DEPRECATED_MSG("Use the .Name() method instead of accessing the member directly") map_stringitem_t Name;
    /** \brief Architecture of the package */
    map_stringitem_t Arch;
    /** \brief Base of a singly linked list of versions
    /** \brief Architecture of the package */
    map_stringitem_t Arch;
    /** \brief Base of a singly linked list of versions
@@ -418,12 +455,6 @@ struct pkgCache::Package
    map_pointer_t VersionList;       // Version
    /** \brief index to the installed version */
    map_pointer_t CurrentVer;        // Version
    map_pointer_t VersionList;       // Version
    /** \brief index to the installed version */
    map_pointer_t CurrentVer;        // Version
-   /** \brief indicates nothing (consistently)
-       This field used to contain ONE section the package belongs to,
-       if those differs between versions it is a RANDOM one.
-       The Section() method tries to reproduce it, but the only sane
-       thing to do is use the Section field from the version! */
-   APT_DEPRECATED map_ptrloc Section; // StringItem
    /** \brief index of the group this package belongs to */
    map_pointer_t Group;             // Group the Package belongs to
 
    /** \brief index of the group this package belongs to */
    map_pointer_t Group;             // Group the Package belongs to
 
@@ -437,15 +468,15 @@ struct pkgCache::Package
 
    // Install/Remove/Purge etc
    /** \brief state that the user wishes the package to be in */
 
    // Install/Remove/Purge etc
    /** \brief state that the user wishes the package to be in */
-   unsigned char SelectedState;     // What
+   map_number_t SelectedState;     // What
    /** \brief installation state of the package
 
        This should be "ok" but in case the installation failed
        it will be different.
    */
    /** \brief installation state of the package
 
        This should be "ok" but in case the installation failed
        it will be different.
    */
-   unsigned char InstState;         // Flags
+   map_number_t InstState;         // Flags
    /** \brief indicates if the package is installed */
    /** \brief indicates if the package is installed */
-   unsigned char CurrentState;      // State
+   map_number_t CurrentState;      // State
 
    /** \brief unique sequel ID
 
 
    /** \brief unique sequel ID
 
@@ -455,7 +486,7 @@ struct pkgCache::Package
        this to track which packages have been emitted already. */
    map_id_t ID;
    /** \brief some useful indicators of the package's state */
        this to track which packages have been emitted already. */
    map_id_t ID;
    /** \brief some useful indicators of the package's state */
-   unsigned long Flags;
+   map_flags_t Flags;
 };
                                                                        /*}}}*/
 // Release File structure                                              /*{{{*/
 };
                                                                        /*}}}*/
 // Release File structure                                              /*{{{*/
@@ -489,7 +520,7 @@ struct pkgCache::ReleaseFile
    time_t mtime;
 
    /** @TODO document PackageFile::Flags */
    time_t mtime;
 
    /** @TODO document PackageFile::Flags */
-   unsigned long Flags;
+   map_flags_t Flags;
 
    // Linked list
    /** \brief Link to the next ReleaseFile in the Cache */
 
    // Linked list
    /** \brief Link to the next ReleaseFile in the Cache */
@@ -528,7 +559,7 @@ struct pkgCache::PackageFile
    time_t mtime;
 
    /** @TODO document PackageFile::Flags */
    time_t mtime;
 
    /** @TODO document PackageFile::Flags */
-   unsigned long Flags;
+   map_flags_t Flags;
 
    // Linked list
    /** \brief Link to the next PackageFile in the Cache */
 
    // Linked list
    /** \brief Link to the next PackageFile in the Cache */
@@ -574,6 +605,7 @@ struct pkgCache::DescFile
     The version list is always sorted from highest version to lowest
     version by the generator. Equal version numbers are either merged
     or handled as separate versions based on the Hash value. */
     The version list is always sorted from highest version to lowest
     version by the generator. Equal version numbers are either merged
     or handled as separate versions based on the Hash value. */
+APT_IGNORE_DEPRECATED_PUSH
 struct pkgCache::Version
 {
    /** \brief complete version string */
 struct pkgCache::Version
 {
    /** \brief complete version string */
@@ -588,18 +620,22 @@ struct pkgCache::Version
    map_stringitem_t SourceVerStr;
 
    /** \brief Multi-Arch capabilities of a package version */
    map_stringitem_t SourceVerStr;
 
    /** \brief Multi-Arch capabilities of a package version */
-   enum VerMultiArch { None = 0, /*!< is the default and doesn't trigger special behaviour */
+   enum VerMultiArch { No = 0, /*!< is the default and doesn't trigger special behaviour */
                       All = (1<<0), /*!< will cause that Ver.Arch() will report "all" */
                       Foreign = (1<<1), /*!< can satisfy dependencies in another architecture */
                       Same = (1<<2), /*!< can be co-installed with itself from other architectures */
                       Allowed = (1<<3), /*!< other packages are allowed to depend on thispkg:any */
                       AllForeign = All | Foreign,
                       AllAllowed = All | Allowed };
                       All = (1<<0), /*!< will cause that Ver.Arch() will report "all" */
                       Foreign = (1<<1), /*!< can satisfy dependencies in another architecture */
                       Same = (1<<2), /*!< can be co-installed with itself from other architectures */
                       Allowed = (1<<3), /*!< other packages are allowed to depend on thispkg:any */
                       AllForeign = All | Foreign,
                       AllAllowed = All | Allowed };
+
+   /** \brief deprecated variant of No */
+   static const APT_DEPRECATED_MSG("The default value of the Multi-Arch field is no, not none") VerMultiArch None = No;
+
    /** \brief stores the MultiArch capabilities of this version
 
        Flags used are defined in pkgCache::Version::VerMultiArch
    */
    /** \brief stores the MultiArch capabilities of this version
 
        Flags used are defined in pkgCache::Version::VerMultiArch
    */
-   unsigned char MultiArch;
+   map_number_t MultiArch;
 
    /** \brief references all the PackageFile's that this version came from
 
 
    /** \brief references all the PackageFile's that this version came from
 
@@ -635,8 +671,9 @@ struct pkgCache::Version
    /** \brief unique sequel ID */
    map_id_t ID;
    /** \brief parsed priority value */
    /** \brief unique sequel ID */
    map_id_t ID;
    /** \brief parsed priority value */
-   unsigned char Priority;
+   map_number_t Priority;
 };
 };
+APT_IGNORE_DEPRECATED_POP
                                                                        /*}}}*/
 // Description structure                                               /*{{{*/
 /** \brief datamember of a linked list of available description for a version */
                                                                        /*}}}*/
 // Description structure                                               /*{{{*/
 /** \brief datamember of a linked list of available description for a version */
@@ -682,11 +719,11 @@ struct pkgCache::DependencyData
    map_pointer_t Package;         // Package
 
    /** \brief Dependency type - Depends, Recommends, Conflicts, etc */
    map_pointer_t Package;         // Package
 
    /** \brief Dependency type - Depends, Recommends, Conflicts, etc */
-   unsigned char Type;
+   map_number_t Type;
    /** \brief comparison operator specified on the depends line
 
        If the high bit is set then it is a logical OR with the previous record. */
    /** \brief comparison operator specified on the depends line
 
        If the high bit is set then it is a logical OR with the previous record. */
-   unsigned char CompareOp;
+   map_flags_t CompareOp;
 
    map_pointer_t NextData;
 };
 
    map_pointer_t NextData;
 };
@@ -722,9 +759,9 @@ struct pkgCache::Provides
    /** \brief version in the provides line (if any)
 
        This version allows dependencies to depend on specific versions of a
    /** \brief version in the provides line (if any)
 
        This version allows dependencies to depend on specific versions of a
-       Provides, as well as allowing Provides to override existing packages.
-       This is experimental. Note that Debian doesn't allow versioned provides */
+       Provides, as well as allowing Provides to override existing packages. */
    map_stringitem_t ProvideVersion;
    map_stringitem_t ProvideVersion;
+   map_flags_t Flags;
    /** \brief next provides (based of package) */
    map_pointer_t NextProvides;     // Provides
    /** \brief next provides (based of version) */
    /** \brief next provides (based of package) */
    map_pointer_t NextProvides;     // Provides
    /** \brief next provides (based of version) */
@@ -732,7 +769,7 @@ struct pkgCache::Provides
 };
                                                                        /*}}}*/
 // UNUSED StringItem structure                                         /*{{{*/
 };
                                                                        /*}}}*/
 // UNUSED StringItem structure                                         /*{{{*/
-struct APT_DEPRECATED  pkgCache::StringItem
+struct APT_DEPRECATED_MSG("No longer used in cache generation without a replacement") pkgCache::StringItem
 {
    /** \brief string this refers to */
    map_ptrloc String;        // StringItem
 {
    /** \brief string this refers to */
    map_ptrloc String;        // StringItem