summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/cachefilter-patterns.h71
-rw-r--r--apt-pkg/cacheiterators.h21
-rw-r--r--apt-pkg/contrib/hashes.cc23
-rw-r--r--apt-pkg/contrib/hashsum.cc52
-rw-r--r--apt-pkg/contrib/hashsum_template.h21
-rw-r--r--apt-pkg/deb/deblistparser.cc4
-rw-r--r--apt-pkg/edsp/edsplistparser.cc4
-rw-r--r--apt-pkg/pkgcache.cc2
-rw-r--r--apt-pkg/pkgcache.h135
-rw-r--r--apt-pkg/pkgcachegen.cc126
-rw-r--r--apt-pkg/pkgcachegen.h19
-rw-r--r--apt-private/private-cachefile.cc4
-rw-r--r--apt-private/private-cachefile.h10
-rw-r--r--cmdline/apt-cache.cc12
-rw-r--r--debian/libapt-pkg6.0.symbols70
15 files changed, 295 insertions, 279 deletions
diff --git a/apt-pkg/cachefilter-patterns.h b/apt-pkg/cachefilter-patterns.h
index 4eeb68594..2071c80b3 100644
--- a/apt-pkg/cachefilter-patterns.h
+++ b/apt-pkg/cachefilter-patterns.h
@@ -19,6 +19,11 @@
#include <string>
#include <vector>
#include <assert.h>
+
+#ifndef APT_COMPILING_APT
+#error Internal header
+#endif
+
namespace APT
{
@@ -60,15 +65,15 @@ struct PatternTreeParser
std::vector<std::unique_ptr<Node>> arguments;
bool haveArgumentList = false;
- std::ostream &render(std::ostream &stream) override;
- bool matches(APT::StringView name, int min, int max);
+ APT_HIDDEN std::ostream &render(std::ostream &stream) override;
+ APT_HIDDEN bool matches(APT::StringView name, int min, int max);
};
struct WordNode : public Node
{
APT::StringView word;
bool quoted = false;
- std::ostream &render(std::ostream &stream) override;
+ APT_HIDDEN std::ostream &render(std::ostream &stream) override;
};
struct State
@@ -95,16 +100,16 @@ struct PatternTreeParser
std::unique_ptr<Node> parse(); // public for test cases only
private:
- std::unique_ptr<Node> parseOr();
- std::unique_ptr<Node> parseAnd();
- std::unique_ptr<Node> parseUnary();
- std::unique_ptr<Node> parsePrimary();
- std::unique_ptr<Node> parseGroup();
- std::unique_ptr<Node> parsePattern();
- std::unique_ptr<Node> parseShortPattern();
- std::unique_ptr<Node> parseArgument(bool shrt);
- std::unique_ptr<Node> parseWord(bool shrt);
- std::unique_ptr<Node> parseQuotedWord();
+ APT_HIDDEN std::unique_ptr<Node> parseOr();
+ APT_HIDDEN std::unique_ptr<Node> parseAnd();
+ APT_HIDDEN std::unique_ptr<Node> parseUnary();
+ APT_HIDDEN std::unique_ptr<Node> parsePrimary();
+ APT_HIDDEN std::unique_ptr<Node> parseGroup();
+ APT_HIDDEN std::unique_ptr<Node> parsePattern();
+ APT_HIDDEN std::unique_ptr<Node> parseShortPattern();
+ APT_HIDDEN std::unique_ptr<Node> parseArgument(bool shrt);
+ APT_HIDDEN std::unique_ptr<Node> parseWord(bool shrt);
+ APT_HIDDEN std::unique_ptr<Node> parseQuotedWord();
};
/**
@@ -114,7 +119,7 @@ struct PatternTreeParser
* - Word nodes which contains words or quoted words
* - Patterns, which represent ?foo and ?foo(...) patterns
*/
-struct PatternParser
+struct APT_HIDDEN PatternParser
{
pkgCacheFile *file;
@@ -141,7 +146,7 @@ class BaseRegexMatcher
}
};
-struct PackageIsAutomatic : public PackageMatcher
+struct APT_HIDDEN PackageIsAutomatic : public PackageMatcher
{
pkgCacheFile *Cache;
explicit PackageIsAutomatic(pkgCacheFile *Cache) : Cache(Cache) {}
@@ -152,7 +157,7 @@ struct PackageIsAutomatic : public PackageMatcher
}
};
-struct PackageIsBroken : public PackageMatcher
+struct APT_HIDDEN PackageIsBroken : public PackageMatcher
{
pkgCacheFile *Cache;
explicit PackageIsBroken(pkgCacheFile *Cache) : Cache(Cache) {}
@@ -164,7 +169,7 @@ struct PackageIsBroken : public PackageMatcher
}
};
-struct PackageIsConfigFiles : public PackageMatcher
+struct APT_HIDDEN PackageIsConfigFiles : public PackageMatcher
{
bool operator()(pkgCache::PkgIterator const &Pkg) override
{
@@ -172,7 +177,7 @@ struct PackageIsConfigFiles : public PackageMatcher
}
};
-struct PackageIsGarbage : public PackageMatcher
+struct APT_HIDDEN PackageIsGarbage : public PackageMatcher
{
pkgCacheFile *Cache;
explicit PackageIsGarbage(pkgCacheFile *Cache) : Cache(Cache) {}
@@ -182,7 +187,7 @@ struct PackageIsGarbage : public PackageMatcher
return (*Cache)[Pkg].Garbage;
}
};
-struct PackageIsEssential : public PackageMatcher
+struct APT_HIDDEN PackageIsEssential : public PackageMatcher
{
bool operator()(pkgCache::PkgIterator const &Pkg) override
{
@@ -190,7 +195,7 @@ struct PackageIsEssential : public PackageMatcher
}
};
-struct PackageHasExactName : public PackageMatcher
+struct APT_HIDDEN PackageHasExactName : public PackageMatcher
{
std::string name;
explicit PackageHasExactName(std::string name) : name(name) {}
@@ -200,7 +205,7 @@ struct PackageHasExactName : public PackageMatcher
}
};
-struct PackageIsInstalled : public PackageMatcher
+struct APT_HIDDEN PackageIsInstalled : public PackageMatcher
{
pkgCacheFile *Cache;
explicit PackageIsInstalled(pkgCacheFile *Cache) : Cache(Cache) {}
@@ -211,7 +216,7 @@ struct PackageIsInstalled : public PackageMatcher
}
};
-struct PackageIsObsolete : public PackageMatcher
+struct APT_HIDDEN PackageIsObsolete : public PackageMatcher
{
bool operator()(pkgCache::PkgIterator const &pkg) override
{
@@ -235,7 +240,7 @@ struct PackageIsObsolete : public PackageMatcher
}
};
-struct PackageIsUpgradable : public PackageMatcher
+struct APT_HIDDEN PackageIsUpgradable : public PackageMatcher
{
pkgCacheFile *Cache;
explicit PackageIsUpgradable(pkgCacheFile *Cache) : Cache(Cache) {}
@@ -246,7 +251,7 @@ struct PackageIsUpgradable : public PackageMatcher
}
};
-struct PackageIsVirtual : public PackageMatcher
+struct APT_HIDDEN PackageIsVirtual : public PackageMatcher
{
bool operator()(pkgCache::PkgIterator const &Pkg) override
{
@@ -254,7 +259,7 @@ struct PackageIsVirtual : public PackageMatcher
}
};
-struct VersionAnyMatcher : public Matcher
+struct APT_HIDDEN VersionAnyMatcher : public Matcher
{
bool operator()(pkgCache::GrpIterator const &Grp) override { return false; }
bool operator()(pkgCache::VerIterator const &Ver) override = 0;
@@ -269,7 +274,7 @@ struct VersionAnyMatcher : public Matcher
}
};
-struct VersionIsAllVersions : public Matcher
+struct APT_HIDDEN VersionIsAllVersions : public Matcher
{
std::unique_ptr<APT::CacheFilter::Matcher> base;
VersionIsAllVersions(std::unique_ptr<APT::CacheFilter::Matcher> base) : base(std::move(base)) {}
@@ -289,7 +294,7 @@ struct VersionIsAllVersions : public Matcher
}
};
-struct VersionIsAnyVersion : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsAnyVersion : public VersionAnyMatcher
{
std::unique_ptr<APT::CacheFilter::Matcher> base;
VersionIsAnyVersion(std::unique_ptr<APT::CacheFilter::Matcher> base) : base(std::move(base)) {}
@@ -299,7 +304,7 @@ struct VersionIsAnyVersion : public VersionAnyMatcher
}
};
-struct VersionIsArchive : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsArchive : public VersionAnyMatcher
{
BaseRegexMatcher matcher;
VersionIsArchive(std::string const &pattern) : matcher(pattern) {}
@@ -314,7 +319,7 @@ struct VersionIsArchive : public VersionAnyMatcher
}
};
-struct VersionIsOrigin : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsOrigin : public VersionAnyMatcher
{
BaseRegexMatcher matcher;
VersionIsOrigin(std::string const &pattern) : matcher(pattern) {}
@@ -329,7 +334,7 @@ struct VersionIsOrigin : public VersionAnyMatcher
}
};
-struct VersionIsSection : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsSection : public VersionAnyMatcher
{
BaseRegexMatcher matcher;
VersionIsSection(std::string const &pattern) : matcher(pattern) {}
@@ -339,7 +344,7 @@ struct VersionIsSection : public VersionAnyMatcher
}
};
-struct VersionIsSourcePackage : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsSourcePackage : public VersionAnyMatcher
{
BaseRegexMatcher matcher;
VersionIsSourcePackage(std::string const &pattern) : matcher(pattern) {}
@@ -349,7 +354,7 @@ struct VersionIsSourcePackage : public VersionAnyMatcher
}
};
-struct VersionIsSourceVersion : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsSourceVersion : public VersionAnyMatcher
{
BaseRegexMatcher matcher;
VersionIsSourceVersion(std::string const &pattern) : matcher(pattern) {}
@@ -359,7 +364,7 @@ struct VersionIsSourceVersion : public VersionAnyMatcher
}
};
-struct VersionIsVersion : public VersionAnyMatcher
+struct APT_HIDDEN VersionIsVersion : public VersionAnyMatcher
{
BaseRegexMatcher matcher;
VersionIsVersion(std::string const &pattern) : matcher(pattern) {}
diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h
index ff2b65cdf..d2e4f7f90 100644
--- a/apt-pkg/cacheiterators.h
+++ b/apt-pkg/cacheiterators.h
@@ -80,6 +80,7 @@ template<typename Str, typename Itr> class pkgCache::Iterator :
// Mixed stuff
inline bool IsGood() const { return S && Owner && ! end();}
inline unsigned long Index() const {return S - OwnerPointer();}
+ inline map_pointer<Str> MapPointer() const {return map_pointer<Str>(Index()) ;}
void ReMap(void const * const oldMap, void const * const newMap) {
if (Owner == 0 || S == 0)
@@ -293,7 +294,7 @@ class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
inline PkgIterator TargetPkg() const {return PkgIterator(*Owner,Owner->PkgP + S2->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 PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[uint32_t(S->ParentVer)].ParentPkg);}
inline bool Reverse() const {return Type == DepRev;}
bool IsCritical() const APT_PURE;
bool IsNegative() const APT_PURE;
@@ -321,15 +322,15 @@ class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
struct DependencyProxy
{
map_stringitem_t &Version;
- map_pointer_t &Package;
+ map_pointer<pkgCache::Package> &Package;
map_id_t &ID;
unsigned char &Type;
unsigned char &CompareOp;
- map_pointer_t &ParentVer;
- map_pointer_t &DependencyData;
- map_pointer_t &NextRevDepends;
- map_pointer_t &NextDepends;
- map_pointer_t &NextData;
+ map_pointer<pkgCache::Version> &ParentVer;
+ map_pointer<pkgCache::DependencyData> &DependencyData;
+ map_pointer<Dependency> &NextRevDepends;
+ map_pointer<Dependency> &NextDepends;
+ map_pointer<pkgCache::DependencyData> &NextData;
DependencyProxy const * operator->() const { return this; }
DependencyProxy * operator->() { return this; }
};
@@ -378,7 +379,7 @@ class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
inline const char *ProvideVersion() const {return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;}
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 PkgIterator OwnerPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[uint32_t(S->Version)].ParentPkg);}
/* MultiArch can be translated to SingleArch for an resolver and we did so,
by adding provides to help the resolver understand the problem, but
@@ -475,7 +476,7 @@ class pkgCache::VerFileIterator : public pkgCache::Iterator<VerFile, VerFileIter
inline VerFileIterator operator++(int) { VerFileIterator const tmp(*this); operator++(); return tmp; }
// Accessors
- inline PkgFileIterator File() const {return PkgFileIterator(*Owner,S->File + Owner->PkgFileP);}
+ inline PkgFileIterator File() const {return PkgFileIterator(*Owner, Owner->PkgFileP + S->File);}
inline VerFileIterator() : Iterator<VerFile, VerFileIterator>() {}
inline VerFileIterator(pkgCache &Owner,VerFile *Trg) : Iterator<VerFile, VerFileIterator>(Owner, Trg) {}
@@ -493,7 +494,7 @@ class pkgCache::DescFileIterator : public Iterator<DescFile, DescFileIterator> {
inline DescFileIterator operator++(int) { DescFileIterator const tmp(*this); operator++(); return tmp; }
// Accessors
- inline PkgFileIterator File() const {return PkgFileIterator(*Owner,S->File + Owner->PkgFileP);}
+ inline PkgFileIterator File() const {return PkgFileIterator(*Owner, Owner->PkgFileP + S->File);}
inline DescFileIterator() : Iterator<DescFile, DescFileIterator>() {}
inline DescFileIterator(pkgCache &Owner,DescFile *Trg) : Iterator<DescFile, DescFileIterator>(Owner, Trg) {}
diff --git a/apt-pkg/contrib/hashes.cc b/apt-pkg/contrib/hashes.cc
index 6afd0815f..8733f6392 100644
--- a/apt-pkg/contrib/hashes.cc
+++ b/apt-pkg/contrib/hashes.cc
@@ -302,8 +302,30 @@ public:
unsigned long long FileSize;
gcry_md_hd_t hd;
+ void maybeInit()
+ {
+
+ // Yikes, we got to initialize libgcrypt, or we get warnings. But we
+ // abstract away libgcrypt in Hashes from our users - they are not
+ // supposed to know what the hashing backend is, so we can't force
+ // them to init themselves as libgcrypt folks want us to. So this
+ // only leaves us with this option...
+ if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P))
+ {
+ if (!gcry_check_version(nullptr))
+ {
+ fprintf(stderr, "libgcrypt is too old (need %s, have %s)\n",
+ "nullptr", gcry_check_version(NULL));
+ exit(2);
+ }
+
+ gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
+ }
+ }
+
explicit PrivateHashes(unsigned int const CalcHashes) : FileSize(0)
{
+ maybeInit();
gcry_md_open(&hd, 0, 0);
for (auto & Algo : Algorithms)
{
@@ -313,6 +335,7 @@ public:
}
explicit PrivateHashes(HashStringList const &Hashes) : FileSize(0) {
+ maybeInit();
gcry_md_open(&hd, 0, 0);
for (auto & Algo : Algorithms)
{
diff --git a/apt-pkg/contrib/hashsum.cc b/apt-pkg/contrib/hashsum.cc
deleted file mode 100644
index e8e86e92c..000000000
--- a/apt-pkg/contrib/hashsum.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Cryptographic API Base
-#include <config.h>
-
-#include <apt-pkg/fileutl.h>
-
-#include "hashsum_template.h"
-#include <algorithm>
-#include <unistd.h>
-
-// Summation::AddFD - Add content of file into the checksum /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool SummationImplementation::AddFD(int const Fd, unsigned long long Size) {
- unsigned char Buf[64 * 64];
- bool const ToEOF = (Size == 0);
- while (Size != 0 || ToEOF)
- {
- unsigned long long n = sizeof(Buf);
- if (!ToEOF) n = std::min(Size, n);
- ssize_t const Res = read(Fd, Buf, n);
- if (Res < 0 || (!ToEOF && Res != (ssize_t) n)) // error, or short read
- return false;
- if (ToEOF && Res == 0) // EOF
- break;
- Size -= Res;
- Add(Buf,Res);
- }
- return true;
-}
-bool SummationImplementation::AddFD(FileFd &Fd, unsigned long long Size) {
- unsigned char Buf[64 * 64];
- bool const ToEOF = (Size == 0);
- while (Size != 0 || ToEOF)
- {
- unsigned long long n = sizeof(Buf);
- if (!ToEOF) n = std::min(Size, n);
- unsigned long long a = 0;
- if (Fd.Read(Buf, n, &a) == false) // error
- return false;
- if (ToEOF == false)
- {
- if (a != n) // short read
- return false;
- }
- else if (a == 0) // EOF
- break;
- Size -= a;
- Add(Buf, a);
- }
- return true;
-}
- /*}}}*/
diff --git a/apt-pkg/contrib/hashsum_template.h b/apt-pkg/contrib/hashsum_template.h
index 12c46e77b..61b047465 100644
--- a/apt-pkg/contrib/hashsum_template.h
+++ b/apt-pkg/contrib/hashsum_template.h
@@ -97,25 +97,4 @@ class HashSumValue
}
};
-class SummationImplementation
-{
- public:
- virtual bool Add(const unsigned char *inbuf, unsigned long long inlen) APT_NONNULL(2) = 0;
- inline bool Add(const char *inbuf, unsigned long long const inlen) APT_NONNULL(2)
- { return Add(reinterpret_cast<const unsigned char *>(inbuf), inlen); }
-
- inline bool Add(const unsigned char *Data) APT_NONNULL(2)
- { return Add(Data, strlen(reinterpret_cast<const char *>(Data))); }
- inline bool Add(const char *Data) APT_NONNULL(2)
- { return Add(reinterpret_cast<const unsigned char *>(Data), strlen(Data)); }
-
- inline bool Add(const unsigned char *Beg, const unsigned char *End) APT_NONNULL(2,3)
- { return Add(Beg, End - Beg); }
- inline bool Add(const char *Beg, const char *End) APT_NONNULL(2,3)
- { return Add(reinterpret_cast<const unsigned char *>(Beg), End - Beg); }
-
- bool AddFD(int Fd, unsigned long long Size = 0);
- bool AddFD(FileFd &Fd, unsigned long long Size = 0);
-};
-
#endif
diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc
index eaa9dfda9..ab957a01a 100644
--- a/apt-pkg/deb/deblistparser.cc
+++ b/apt-pkg/deb/deblistparser.cc
@@ -208,7 +208,7 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
// Link into by source package group.
Ver->SourcePkgName = G->Name;
Ver->NextInSource = G->VersionsInSource;
- G->VersionsInSource = Ver.Index();
+ G->VersionsInSource = Ver.MapPointer();
Ver->MultiArch = ParseMultiArch(true);
// Archive Size
@@ -469,7 +469,7 @@ bool debStatusListParser::ParseStatus(pkgCache::PkgIterator &Pkg,
if (Ver.end() == true)
_error->Warning("Encountered status field in a non-version description");
else
- Pkg->CurrentVer = Ver.Index();
+ Pkg->CurrentVer = Ver.MapPointer();
}
return true;
diff --git a/apt-pkg/edsp/edsplistparser.cc b/apt-pkg/edsp/edsplistparser.cc
index 45abdbc61..34b9ec934 100644
--- a/apt-pkg/edsp/edsplistparser.cc
+++ b/apt-pkg/edsp/edsplistparser.cc
@@ -87,7 +87,7 @@ bool edspListParser::ParseStatus(pkgCache::PkgIterator &Pkg,
if (state != 0)
{
Pkg->CurrentState = pkgCache::State::Installed;
- Pkg->CurrentVer = Ver.Index();
+ Pkg->CurrentVer = Ver.MapPointer();
}
if (Section.FindB("APT-Automatic", false))
@@ -162,7 +162,7 @@ bool eippListParser::ParseStatus(pkgCache::PkgIterator &Pkg,
case pkgCache::State::TriggersAwaited:
case pkgCache::State::TriggersPending:
case pkgCache::State::Installed:
- Pkg->CurrentVer = Ver.Index();
+ Pkg->CurrentVer = Ver.MapPointer();
break;
}
break;
diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc
index 59f4256ea..02448a073 100644
--- a/apt-pkg/pkgcache.cc
+++ b/apt-pkg/pkgcache.cc
@@ -451,7 +451,7 @@ pkgCache::PkgIterator pkgCache::GrpIterator::NextPkg(pkgCache::PkgIterator const
LastPkg.end() == true))
return PkgIterator(*Owner, 0);
- if (S->LastPackage == LastPkg.Index())
+ if (S->LastPackage == LastPkg.MapPointer())
return PkgIterator(*Owner, 0);
return PkgIterator(*Owner, Owner->PkgP + LastPkg->NextPackage);
diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h
index 84fc56db8..f68736ddc 100644
--- a/apt-pkg/pkgcache.h
+++ b/apt-pkg/pkgcache.h
@@ -77,6 +77,7 @@
#include <apt-pkg/macros.h>
#include <apt-pkg/mmap.h>
+#include <cstddef> // required for nullptr_t
#include <string>
#include <stdint.h>
#include <time.h>
@@ -92,10 +93,29 @@ typedef uint32_t map_filesize_small_t;
typedef uint32_t map_id_t;
// some files get an id, too, but in far less absolute numbers
typedef uint16_t map_fileid_t;
+
// relative pointer from cache start
-typedef uint32_t map_pointer_t;
+template <typename T> class map_pointer {
+ uint32_t val;
+public:
+ map_pointer() noexcept : val(0) {}
+ map_pointer(nullptr_t) noexcept : val(0) {}
+ explicit map_pointer(uint32_t n) noexcept : val(n) {}
+ explicit operator uint32_t() noexcept { return val; }
+};
+
+template<typename T> inline T *operator +(T *p, map_pointer<T> m) { return p + uint32_t(m); }
+template<typename T> inline bool operator ==(map_pointer<T> u, map_pointer<T> m) { return uint32_t(u) == uint32_t(m); }
+template<typename T> inline bool operator !=(map_pointer<T> u, map_pointer<T> m) { return uint32_t(u) != uint32_t(m); }
+template<typename T> inline bool operator <(map_pointer<T> u, map_pointer<T> m) { return uint32_t(u) < uint32_t(m); }
+template<typename T> inline bool operator >(map_pointer<T> u, map_pointer<T> m) { return uint32_t(u) > uint32_t(m); }
+template<typename T> inline uint32_t operator -(map_pointer<T> u, map_pointer<T> m) { return uint32_t(u) - uint32_t(m); }
+template<typename T> bool operator ==(map_pointer<T> m, nullptr_t) { return uint32_t(m) == 0; }
+template<typename T> bool operator !=(map_pointer<T> m, nullptr_t) { return uint32_t(m) != 0; }
+
// same as the previous, but documented to be to a string item
-typedef map_pointer_t map_stringitem_t;
+typedef map_pointer<char> 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;
@@ -210,6 +230,7 @@ class pkgCache /*{{{*/
Dependency *DepP;
DependencyData *DepDataP;
char *StrP;
+ void *reserved[12];
virtual bool ReMap(bool const &Errorchecks = true);
inline bool Sync() {return Map.Sync();}
@@ -325,16 +346,16 @@ struct pkgCache::Header
The PackageFile structures are singly linked lists that represent
all package files that have been merged into the cache. */
- map_pointer_t FileList;
+ map_pointer<PackageFile> FileList;
/** \brief index of the first ReleaseFile structure */
- map_pointer_t RlsFileList;
+ map_pointer<ReleaseFile> RlsFileList;
/** \brief String representing the version system used */
- map_pointer_t VerSysName;
+ map_stringitem_t VerSysName;
/** \brief native architecture the cache was built against */
- map_pointer_t Architecture;
+ map_stringitem_t Architecture;
/** \brief all architectures the cache was built against */
- map_pointer_t Architectures;
+ map_stringitem_t Architectures;
/** \brief The maximum size of a raw entry from the original Package file */
map_filesize_t MaxVerFileSize;
/** \brief The maximum size of a raw entry from the original Translation file */
@@ -345,10 +366,10 @@ struct pkgCache::Header
Start indicates the first byte of the pool, Count is the number of objects
remaining in the pool and ItemSize is the structure size (alignment factor)
of the pool. An ItemSize of 0 indicates the pool is empty. There should be
- the same number of pools as there are structure types. The generator
+ twice the number of pools as there are non-private structure types. The generator
stores this information so future additions can make use of any unused pool
blocks. */
- DynamicMMap::Pool Pools[12];
+ DynamicMMap::Pool Pools[2 * 12];
/** \brief hash tables providing rapid group/package name lookup
@@ -363,10 +384,10 @@ struct pkgCache::Header
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(); }
+ map_stringitem_t GetArchitectures() const { return Architectures; }
+ void SetArchitectures(map_stringitem_t const idx) { Architectures = idx; }
+ map_pointer<Package> * PkgHashTableP() const { return (map_pointer<Package>*) (this + 1); }
+ map_pointer<Group> * GrpHashTableP() const { return reinterpret_cast<map_pointer<Group> *>(PkgHashTableP() + GetHashTableSize()); }
/** \brief Hash of the file (TODO: Rename) */
map_filesize_small_t CacheFileSize;
@@ -393,18 +414,20 @@ struct pkgCache::Group
// Linked List
/** \brief Link to the first package which belongs to the group */
- map_pointer_t FirstPackage; // Package
+ map_pointer<Package> FirstPackage;
/** \brief Link to the last package which belongs to the group */
- map_pointer_t LastPackage; // Package
+ map_pointer<Package> LastPackage;
/** \brief Link to the next Group */
- map_pointer_t Next; // Group
+ map_pointer<Group> Next;
/** \brief unique sequel ID */
map_id_t ID;
/** \brief List of binary produces by source package with this name. */
- map_pointer_t VersionsInSource; // Version
+ map_pointer<Version> VersionsInSource;
+ /** \brief Private pointer */
+ map_pointer<void> d;
};
/*}}}*/
// Package structure /*{{{*/
@@ -432,19 +455,19 @@ struct pkgCache::Package
versions of a package can be cleanly handled by the system.
Furthermore, this linked list is guaranteed to be sorted
from Highest version to lowest version with no duplicate entries. */
- map_pointer_t VersionList; // Version
+ map_pointer<Version> VersionList;
/** \brief index to the installed version */
- map_pointer_t CurrentVer; // Version
+ map_pointer<Version> CurrentVer;
/** \brief index of the group this package belongs to */
- map_pointer_t Group; // Group the Package belongs to
+ map_pointer<pkgCache::Group> Group;
// Linked list
/** \brief Link to the next package in the same bucket */
- map_pointer_t NextPackage; // Package
+ map_pointer<Package> NextPackage;
/** \brief List of all dependencies on this package */
- map_pointer_t RevDepends; // Dependency
+ map_pointer<Dependency> RevDepends;
/** \brief List of all "packages" this package provide */
- map_pointer_t ProvidesList; // Provides
+ map_pointer<Provides> ProvidesList;
// Install/Remove/Purge etc
/** \brief state that the user wishes the package to be in */
@@ -467,6 +490,9 @@ struct pkgCache::Package
map_id_t ID;
/** \brief some useful indicators of the package's state */
map_flags_t Flags;
+
+ /** \brief Private pointer */
+ map_pointer<void> d;
};
/*}}}*/
// Release File structure /*{{{*/
@@ -504,9 +530,12 @@ struct pkgCache::ReleaseFile
// Linked list
/** \brief Link to the next ReleaseFile in the Cache */
- map_pointer_t NextFile;
+ map_pointer<ReleaseFile> NextFile;
/** \brief unique sequel ID */
map_fileid_t ID;
+
+ /** \brief Private pointer */
+ map_pointer<void> d;
};
/*}}}*/
// Package File structure /*{{{*/
@@ -520,7 +549,7 @@ struct pkgCache::PackageFile
/** \brief physical disk file that this PackageFile represents */
map_stringitem_t FileName;
/** \brief the release information */
- map_pointer_t Release;
+ map_pointer<ReleaseFile> Release;
map_stringitem_t Component;
map_stringitem_t Architecture;
@@ -543,9 +572,12 @@ struct pkgCache::PackageFile
// Linked list
/** \brief Link to the next PackageFile in the Cache */
- map_pointer_t NextFile; // PackageFile
+ map_pointer<PackageFile> NextFile;
/** \brief unique sequel ID */
map_fileid_t ID;
+
+ /** \brief Private pointer */
+ map_pointer<void> d;
};
/*}}}*/
// VerFile structure /*{{{*/
@@ -556,9 +588,9 @@ struct pkgCache::PackageFile
struct pkgCache::VerFile
{
/** \brief index of the package file that this version was found in */
- map_pointer_t File; // PackageFile
+ map_pointer<PackageFile> File;
/** \brief next step in the linked list */
- map_pointer_t NextFile; // PkgVerFile
+ map_pointer<VerFile> NextFile;
/** \brief position in the package file */
map_filesize_t Offset; // File offset
/** @TODO document pkgCache::VerFile::Size */
@@ -570,9 +602,9 @@ struct pkgCache::VerFile
struct pkgCache::DescFile
{
/** \brief index of the file that this description was found in */
- map_pointer_t File; // PackageFile
+ map_pointer<PackageFile> File;
/** \brief next step in the linked list */
- map_pointer_t NextFile; // PkgVerFile
+ map_pointer<DescFile> NextFile;
/** \brief position in the file */
map_filesize_t Offset; // File offset
/** @TODO document pkgCache::DescFile::Size */
@@ -619,19 +651,19 @@ struct pkgCache::Version
applies to. If FileList is 0 then this is a blank version.
The structure should also have a 0 in all other fields excluding
pkgCache::Version::VerStr and Possibly pkgCache::Version::NextVer. */
- map_pointer_t FileList; // VerFile
+ map_pointer<VerFile> FileList;
/** \brief next (lower or equal) version in the linked list */
- map_pointer_t NextVer; // Version
+ map_pointer<Version> NextVer;
/** \brief next description in the linked list */
- map_pointer_t DescriptionList; // Description
+ map_pointer<Description> DescriptionList;
/** \brief base of the dependency list */
- map_pointer_t DependsList; // Dependency
+ map_pointer<Dependency> DependsList;
/** \brief links to the owning package
This allows reverse dependencies to determine the package */
- map_pointer_t ParentPkg; // Package
+ map_pointer<Package> ParentPkg;
/** \brief list of pkgCache::Provides */
- map_pointer_t ProvidesList; // Provides
+ map_pointer<Provides> ProvidesList;
/** \brief archive size for this version
@@ -649,7 +681,10 @@ struct pkgCache::Version
/** \brief parsed priority value */
map_number_t Priority;
/** \brief next version in the source package (might be different binary) */
- map_pointer_t NextInSource; // Version
+ map_pointer<Version> NextInSource;
+
+ /** \brief Private pointer */
+ map_pointer<void> d;
};
/*}}}*/
// Description structure /*{{{*/
@@ -668,11 +703,11 @@ struct pkgCache::Description
map_stringitem_t md5sum;
/** @TODO document pkgCache::Description::FileList */
- map_pointer_t FileList; // DescFile
+ map_pointer<DescFile> FileList;
/** \brief next translation for this description */
- map_pointer_t NextDesc; // Description
+ map_pointer<Description> NextDesc;
/** \brief the text is a description of this package */
- map_pointer_t ParentPkg; // Package
+ map_pointer<Package> ParentPkg;
/** \brief unique sequel ID */
map_id_t ID;
@@ -693,7 +728,7 @@ struct pkgCache::DependencyData
The generator will - if the package does not already exist -
create a blank (no version records) package. */
- map_pointer_t Package; // Package
+ map_pointer<pkgCache::Package> Package;
/** \brief Dependency type - Depends, Recommends, Conflicts, etc */
map_number_t Type;
@@ -702,17 +737,17 @@ struct pkgCache::DependencyData
If the high bit is set then it is a logical OR with the previous record. */
map_flags_t CompareOp;
- map_pointer_t NextData;
+ map_pointer<DependencyData> NextData;
};
struct pkgCache::Dependency
{
- map_pointer_t DependencyData; // DependencyData
+ map_pointer<pkgCache::DependencyData> DependencyData;
/** \brief version of the package which has the depends */
- map_pointer_t ParentVer; // Version
+ map_pointer<Version> ParentVer;
/** \brief next reverse dependency of this package */
- map_pointer_t NextRevDepends; // Dependency
+ map_pointer<Dependency> NextRevDepends;
/** \brief next dependency of this version */
- map_pointer_t NextDepends; // Dependency
+ map_pointer<Dependency> NextDepends;
/** \brief unique sequel ID */
map_id_t ID;
@@ -730,9 +765,9 @@ struct pkgCache::Dependency
struct pkgCache::Provides
{
/** \brief index of the package providing this */
- map_pointer_t ParentPkg; // Package
+ map_pointer<Package> ParentPkg;
/** \brief index of the version this provide line applies to */
- map_pointer_t Version; // Version
+ map_pointer<pkgCache::Version> Version;
/** \brief version in the provides line (if any)
This version allows dependencies to depend on specific versions of a
@@ -740,9 +775,9 @@ struct pkgCache::Provides
map_stringitem_t ProvideVersion;
map_flags_t Flags;
/** \brief next provides (based of package) */
- map_pointer_t NextProvides; // Provides
+ map_pointer<Provides> NextProvides;
/** \brief next provides (based of version) */
- map_pointer_t NextPkgProv; // Provides
+ map_pointer<Provides> NextPkgProv;
};
/*}}}*/
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 5a7272e84..283866f88 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -48,6 +48,19 @@ static bool IsDuplicateDescription(pkgCache &Cache, pkgCache::DescIterator Desc,
using std::string;
using APT::StringView;
+// Convert an offset returned from e.g. DynamicMMap or ptr difference to
+// an uint32_t location without data loss.
+template <typename T>
+static inline uint32_t NarrowOffset(T ptr)
+{
+ uint32_t res = static_cast<uint32_t>(ptr);
+ if (unlikely(ptr < 0))
+ abort();
+ if (unlikely(static_cast<T>(res) != ptr))
+ abort();
+ return res;
+}
+
// CacheGenerator::pkgCacheGenerator - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* We set the dirty flag and make sure that is written to the disk */
@@ -77,7 +90,7 @@ bool pkgCacheGenerator::Start()
*Cache.HeaderP = pkgCache::Header();
// make room for the hashtables for packages and groups
- if (Map.RawAllocate(2 * (Cache.HeaderP->GetHashTableSize() * sizeof(map_pointer_t))) == 0)
+ if (Map.RawAllocate(2 * (Cache.HeaderP->GetHashTableSize() * sizeof(map_pointer<void>))) == 0)
return false;
map_stringitem_t const idxVerSysName = WriteStringInMap(_system->VS->Label);
@@ -210,7 +223,7 @@ map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String,
const unsigned long &Len) {
size_t oldSize = Map.Size();
void const * const oldMap = Map.Data();
- map_stringitem_t const index = Map.WriteString(String, Len);
+ map_stringitem_t const index{NarrowOffset(Map.WriteString(String, Len))};
if (index != 0)
ReMap(oldMap, Map.Data(), oldSize);
return index;
@@ -220,19 +233,21 @@ map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String,
map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String) {
size_t oldSize = Map.Size();
void const * const oldMap = Map.Data();
- map_stringitem_t const index = Map.WriteString(String);
+ map_stringitem_t const index{NarrowOffset(Map.WriteString(String))};
if (index != 0)
ReMap(oldMap, Map.Data(), oldSize);
return index;
}
/*}}}*/
-map_pointer_t pkgCacheGenerator::AllocateInMap(const unsigned long &size) {/*{{{*/
+uint32_t pkgCacheGenerator::AllocateInMap(const unsigned long &size) {/*{{{*/
size_t oldSize = Map.Size();
void const * const oldMap = Map.Data();
- map_pointer_t const index = Map.Allocate(size);
+ auto index = Map.Allocate(size);
if (index != 0)
ReMap(oldMap, Map.Data(), oldSize);
- return index;
+ if (index != static_cast<uint32_t>(index))
+ abort(); // Internal error
+ return static_cast<uint32_t>(index);
}
/*}}}*/
// CacheGenerator::MergeList - Merge the package list /*{{{*/
@@ -373,7 +388,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
{
pkgCache::VerIterator Ver = Pkg.VersionList();
Dynamic<pkgCache::VerIterator> DynVer(Ver);
- map_pointer_t *LastVer = &Pkg->VersionList;
+ map_pointer<pkgCache::Version> *LastVer = &Pkg->VersionList;
void const * oldMap = Map.Data();
auto Hash = List.VersionHash();
@@ -433,13 +448,13 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
}
// Add a new version
- map_pointer_t const verindex = NewVersion(Ver, Version, Pkg.Index(), Hash, *LastVer);
+ map_pointer<pkgCache::Version> const verindex = NewVersion(Ver, Version, Pkg.MapPointer(), Hash, *LastVer);
if (unlikely(verindex == 0))
return _error->Error(_("Error occurred while processing %s (%s%d)"),
Pkg.Name(), "NewVersion", 1);
if (oldMap != Map.Data())
- LastVer += static_cast<map_pointer_t const *>(Map.Data()) - static_cast<map_pointer_t const *>(oldMap);
+ LastVer += static_cast<map_pointer<pkgCache::Version> const *>(Map.Data()) - static_cast<map_pointer<pkgCache::Version> const *>(oldMap);
*LastVer = verindex;
if (unlikely(List.NewVersion(Ver) == false))
@@ -519,19 +534,19 @@ bool pkgCacheGenerator::AddNewDescription(ListParser &List, pkgCache::VerIterato
pkgCache::DescIterator Desc;
Dynamic<pkgCache::DescIterator> DynDesc(Desc);
- map_pointer_t const descindex = NewDescription(Desc, lang, CurMd5, md5idx);
+ map_pointer<pkgCache::Description> const descindex = NewDescription(Desc, lang, CurMd5, md5idx);
if (unlikely(descindex == 0))
return _error->Error(_("Error occurred while processing %s (%s%d)"),
Ver.ParentPkg().Name(), "NewDescription", 1);
md5idx = Desc->md5sum;
- Desc->ParentPkg = Ver.ParentPkg().Index();
+ Desc->ParentPkg = Ver.ParentPkg().MapPointer();
// we add at the end, so that the start is constant as we need
// that to be able to efficiently share these lists
pkgCache::DescIterator VerDesc = Ver.DescriptionList(); // old value might be invalid after ReMap
for (;VerDesc.end() == false && VerDesc->NextDesc != 0; ++VerDesc);
- map_pointer_t * const LastNextDesc = (VerDesc.end() == true) ? &Ver->DescriptionList : &VerDesc->NextDesc;
+ map_pointer<pkgCache::Description> * const LastNextDesc = (VerDesc.end() == true) ? &Ver->DescriptionList : &VerDesc->NextDesc;
*LastNextDesc = descindex;
if (NewFileDesc(Desc,List) == false)
@@ -553,7 +568,7 @@ bool pkgCacheGenerator::NewGroup(pkgCache::GrpIterator &Grp, StringView Name)
return true;
// Get a structure
- map_pointer_t const Group = AllocateInMap(sizeof(pkgCache::Group));
+ auto const Group = AllocateInMap<pkgCache::Group>();
if (unlikely(Group == 0))
return false;
@@ -566,7 +581,7 @@ bool pkgCacheGenerator::NewGroup(pkgCache::GrpIterator &Grp, StringView Name)
// Insert it into the hash table
unsigned long const Hash = Cache.Hash(Name);
- map_pointer_t *insertAt = &Cache.HeaderP->GrpHashTableP()[Hash];
+ map_pointer<pkgCache::Group> *insertAt = &Cache.HeaderP->GrpHashTableP()[Hash];
while (*insertAt != 0 && StringViewCompareFast(Name, Cache.ViewString((Cache.GrpP + *insertAt)->Name)) > 0)
insertAt = &(Cache.GrpP + *insertAt)->Next;
@@ -594,13 +609,13 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg, StringView Name,
return true;
// Get a structure
- map_pointer_t const Package = AllocateInMap(sizeof(pkgCache::Package));
+ auto const Package = AllocateInMap<pkgCache::Package>();
if (unlikely(Package == 0))
return false;
Pkg = pkgCache::PkgIterator(Cache,Cache.PkgP + Package);
// Set the name, arch and the ID
- Pkg->Group = Grp.Index();
+ Pkg->Group = Grp.MapPointer();
// all is mapped to the native architecture
map_stringitem_t const idxArch = (Arch == "all") ? Cache.HeaderP->Architecture : StoreString(MIXED, Arch);
if (unlikely(idxArch == 0))
@@ -614,7 +629,7 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg, StringView Name,
Grp->FirstPackage = Package;
// Insert it into the hash table
map_id_t const Hash = Cache.Hash(Name);
- map_pointer_t *insertAt = &Cache.HeaderP->PkgHashTableP()[Hash];
+ map_pointer<pkgCache::Package> *insertAt = &Cache.HeaderP->PkgHashTableP()[Hash];
while (*insertAt != 0 && StringViewCompareFast(Name, Cache.ViewString((Cache.GrpP + (Cache.PkgP + *insertAt)->Group)->Name)) > 0)
insertAt = &(Cache.PkgP + *insertAt)->NextPackage;
Pkg->NextPackage = *insertAt;
@@ -678,7 +693,7 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg, StringView Name,
continue;
pkgCache::VerIterator Ver = Dep.ParentVer();
Dynamic<pkgCache::VerIterator> DynVer(Ver);
- map_pointer_t * unused = NULL;
+ map_pointer<pkgCache::Dependency> * unused = NULL;
if (NewDepends(Pkg, Ver, Dep->Version, Dep->CompareOp, Dep->Type, unused) == false)
return false;
}
@@ -747,7 +762,7 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::GrpIterator &G,
{
APT::StringView Arch = P.Arch() == NULL ? "" : P.Arch();
Dynamic<APT::StringView> DynArch(Arch);
- map_pointer_t *OldDepLast = NULL;
+ map_pointer<pkgCache::Dependency> *OldDepLast = NULL;
/* MultiArch handling introduces a lot of implicit Dependencies:
- MultiArch: same → Co-Installable if they have the same version
- All others conflict with all other group members */
@@ -787,7 +802,7 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::VerIterator &V,
/* MultiArch handling introduces a lot of implicit Dependencies:
- MultiArch: same → Co-Installable if they have the same version
- All others conflict with all other group members */
- map_pointer_t *OldDepLast = NULL;
+ map_pointer<pkgCache::Dependency> *OldDepLast = NULL;
bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
if (coInstall == true)
{
@@ -820,19 +835,19 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
return true;
// Get a structure
- map_pointer_t const VerFile = AllocateInMap(sizeof(pkgCache::VerFile));
+ auto const VerFile = AllocateInMap<pkgCache::VerFile>();
if (VerFile == 0)
return false;
pkgCache::VerFileIterator VF(Cache,Cache.VerFileP + VerFile);
- VF->File = CurrentFile - Cache.PkgFileP;
+ VF->File = map_pointer<pkgCache::PackageFile>{NarrowOffset(CurrentFile - Cache.PkgFileP)};
// Link it to the end of the list
- map_pointer_t *Last = &Ver->FileList;
+ map_pointer<pkgCache::VerFile> *Last = &Ver->FileList;
for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; ++V)
Last = &V->NextFile;
VF->NextFile = *Last;
- *Last = VF.Index();
+ *Last = VF.MapPointer();
VF->Offset = List.Offset();
VF->Size = List.Size();
@@ -846,14 +861,14 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
// CacheGenerator::NewVersion - Create a new Version /*{{{*/
// ---------------------------------------------------------------------
/* This puts a version structure in the linked list */
-map_pointer_t pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
+map_pointer<pkgCache::Version> pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
APT::StringView const &VerStr,
- map_pointer_t const ParentPkg,
+ map_pointer<pkgCache::Package> const ParentPkg,
uint32_t Hash,
- map_pointer_t const Next)
+ map_pointer<pkgCache::Version> const Next)
{
// Get a structure
- map_pointer_t const Version = AllocateInMap(sizeof(pkgCache::Version));
+ auto const Version = AllocateInMap<pkgCache::Version>();
if (Version == 0)
return 0;
@@ -905,20 +920,20 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
return true;
// Get a structure
- map_pointer_t const DescFile = AllocateInMap(sizeof(pkgCache::DescFile));
+ auto const DescFile = AllocateInMap<pkgCache::DescFile>();
if (DescFile == 0)
return false;
pkgCache::DescFileIterator DF(Cache,Cache.DescFileP + DescFile);
- DF->File = CurrentFile - Cache.PkgFileP;
+ DF->File = map_pointer<pkgCache::PackageFile>{NarrowOffset(CurrentFile - Cache.PkgFileP)};
// Link it to the end of the list
- map_pointer_t *Last = &Desc->FileList;
+ map_pointer<pkgCache::DescFile> *Last = &Desc->FileList;
for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; ++D)
Last = &D->NextFile;
DF->NextFile = *Last;
- *Last = DF.Index();
+ *Last = DF.MapPointer();
DF->Offset = List.Offset();
DF->Size = List.Size();
@@ -932,13 +947,13 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
// CacheGenerator::NewDescription - Create a new Description /*{{{*/
// ---------------------------------------------------------------------
/* This puts a description structure in the linked list */
-map_pointer_t pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
+map_pointer<pkgCache::Description> pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
const string &Lang,
APT::StringView md5sum,
map_stringitem_t const idxmd5str)
{
// Get a structure
- map_pointer_t const Description = AllocateInMap(sizeof(pkgCache::Description));
+ auto const Description = AllocateInMap<pkgCache::Description>();
if (Description == 0)
return 0;
@@ -969,20 +984,20 @@ map_pointer_t pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
version and to the package that it is pointing to. */
bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
pkgCache::VerIterator &Ver,
- map_pointer_t const Version,
+ map_stringitem_t const Version,
uint8_t const Op,
uint8_t const Type,
- map_pointer_t* &OldDepLast)
+ map_pointer<pkgCache::Dependency> * &OldDepLast)
{
void const * const oldMap = Map.Data();
// Get a structure
- map_pointer_t const Dependency = AllocateInMap(sizeof(pkgCache::Dependency));
+ auto const Dependency = AllocateInMap<pkgCache::Dependency>();
if (unlikely(Dependency == 0))
return false;
bool isDuplicate = false;
- map_pointer_t DependencyData = 0;
- map_pointer_t PreviousData = 0;
+ map_pointer<pkgCache::DependencyData> DependencyData = 0;
+ map_pointer<pkgCache::DependencyData> PreviousData = 0;
if (Pkg->RevDepends != 0)
{
pkgCache::Dependency const * const L = Cache.DepP + Pkg->RevDepends;
@@ -1003,13 +1018,13 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
if (isDuplicate == false)
{
- DependencyData = AllocateInMap(sizeof(pkgCache::DependencyData));
+ DependencyData = AllocateInMap<pkgCache::DependencyData>();
if (unlikely(DependencyData == 0))
return false;
}
pkgCache::Dependency * Link = Cache.DepP + Dependency;
- Link->ParentVer = Ver.Index();
+ Link->ParentVer = Ver.MapPointer();
Link->DependencyData = DependencyData;
Link->ID = Cache.HeaderP->DependsCount++;
@@ -1019,7 +1034,7 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
Dep->Type = Type;
Dep->CompareOp = Op;
Dep->Version = Version;
- Dep->Package = Pkg.Index();
+ Dep->Package = Pkg.MapPointer();
++Cache.HeaderP->DependsDataCount;
if (PreviousData != 0)
{
@@ -1054,7 +1069,7 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; ++D)
OldDepLast = &D->NextDepends;
} else if (oldMap != Map.Data())
- OldDepLast += static_cast<map_pointer_t const *>(Map.Data()) - static_cast<map_pointer_t const *>(oldMap);
+ OldDepLast += static_cast<map_pointer<pkgCache::Dependency> const *>(Map.Data()) - static_cast<map_pointer<pkgCache::Dependency> const *>(oldMap);
Dep->NextDepends = *OldDepLast;
*OldDepLast = Dependency;
@@ -1171,27 +1186,27 @@ bool pkgCacheListParser::NewProvides(pkgCache::VerIterator &Ver,
}
bool pkgCacheGenerator::NewProvides(pkgCache::VerIterator &Ver,
pkgCache::PkgIterator &Pkg,
- map_pointer_t const ProvideVersion,
+ map_stringitem_t const ProvideVersion,
uint8_t const Flags)
{
// Get a structure
- map_pointer_t const Provides = AllocateInMap(sizeof(pkgCache::Provides));
+ auto const Provides = AllocateInMap<pkgCache::Provides>();
if (unlikely(Provides == 0))
return false;
++Cache.HeaderP->ProvidesCount;
// Fill it in
pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + Provides,Cache.PkgP);
- Prv->Version = Ver.Index();
+ Prv->Version = Ver.MapPointer();
Prv->ProvideVersion = ProvideVersion;
Prv->Flags = Flags;
Prv->NextPkgProv = Ver->ProvidesList;
- Ver->ProvidesList = Prv.Index();
+ Ver->ProvidesList = Prv.MapPointer();
// Link it to the package
- Prv->ParentPkg = Pkg.Index();
+ Prv->ParentPkg = Pkg.MapPointer();
Prv->NextProvides = Pkg->ProvidesList;
- Pkg->ProvidesList = Prv.Index();
+ Pkg->ProvidesList = Prv.MapPointer();
return true;
}
/*}}}*/
@@ -1249,7 +1264,7 @@ bool pkgCacheGenerator::SelectReleaseFile(const string &File,const string &Site,
return true;
// Get some space for the structure
- map_pointer_t const idxFile = AllocateInMap(sizeof(*CurrentRlsFile));
+ auto const idxFile = AllocateInMap<pkgCache::ReleaseFile>();
if (unlikely(idxFile == 0))
return false;
CurrentRlsFile = Cache.RlsFileP + idxFile;
@@ -1265,7 +1280,7 @@ bool pkgCacheGenerator::SelectReleaseFile(const string &File,const string &Site,
CurrentRlsFile->Flags = Flags;
CurrentRlsFile->ID = Cache.HeaderP->ReleaseFileCount;
RlsFileName = File;
- Cache.HeaderP->RlsFileList = CurrentRlsFile - Cache.RlsFileP;
+ Cache.HeaderP->RlsFileList = map_pointer<pkgCache::ReleaseFile>{NarrowOffset(CurrentRlsFile - Cache.RlsFileP)};
Cache.HeaderP->ReleaseFileCount++;
return true;
@@ -1283,7 +1298,7 @@ bool pkgCacheGenerator::SelectFile(std::string const &File,
{
CurrentFile = nullptr;
// Get some space for the structure
- map_pointer_t const idxFile = AllocateInMap(sizeof(*CurrentFile));
+ auto const idxFile = AllocateInMap<pkgCache::PackageFile>();
if (unlikely(idxFile == 0))
return false;
CurrentFile = Cache.PkgFileP + idxFile;
@@ -1314,11 +1329,11 @@ bool pkgCacheGenerator::SelectFile(std::string const &File,
CurrentFile->Component = component;
CurrentFile->Flags = Flags;
if (CurrentRlsFile != nullptr)
- CurrentFile->Release = CurrentRlsFile - Cache.RlsFileP;
+ CurrentFile->Release = map_pointer<pkgCache::ReleaseFile>{NarrowOffset(CurrentRlsFile - Cache.RlsFileP)};
else
CurrentFile->Release = 0;
PkgFileName = File;
- Cache.HeaderP->FileList = CurrentFile - Cache.PkgFileP;
+ Cache.HeaderP->FileList = map_pointer<pkgCache::PackageFile>{NarrowOffset(CurrentFile - Cache.PkgFileP)};
Cache.HeaderP->PackageFileCount++;
if (Progress != 0)
@@ -1360,6 +1375,7 @@ public:
ScopedErrorRevert() { _error->PushToStack(); }
~ScopedErrorRevert() { _error->RevertToStack(); }
};
+
static bool CheckValidity(FileFd &CacheFile, std::string const &CacheFileName,
pkgSourceList &List,
FileIterator const Start,
@@ -1630,7 +1646,7 @@ static bool loadBackMMapFromFile(std::unique_ptr<pkgCacheGenerator> &Gen,
if (CacheF.IsOpen() == false || CacheF.Seek(0) == false || CacheF.Failed())
return false;
_error->PushToStack();
- map_pointer_t const alloc = Map->RawAllocate(CacheF.Size());
+ uint32_t const alloc = Map->RawAllocate(CacheF.Size());
bool const newError = _error->PendingError();
_error->MergeWithStack();
if (alloc == 0 && newError)
diff --git a/apt-pkg/pkgcachegen.h b/apt-pkg/pkgcachegen.h
index 70192c28e..f5b4c80b3 100644
--- a/apt-pkg/pkgcachegen.h
+++ b/apt-pkg/pkgcachegen.h
@@ -40,7 +40,10 @@ class APT_HIDDEN pkgCacheGenerator /*{{{*/
APT_HIDDEN map_stringitem_t WriteStringInMap(APT::StringView String) { return WriteStringInMap(String.data(), String.size()); };
APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String);
APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String, const unsigned long &Len);
- APT_HIDDEN map_pointer_t AllocateInMap(const unsigned long &size);
+ APT_HIDDEN uint32_t AllocateInMap(const unsigned long &size);
+ template<typename T> map_pointer<T> AllocateInMap() {
+ return map_pointer<T>{AllocateInMap(sizeof(T))};
+ }
// Dirty hack for public users that do not use C++11 yet
#if __cplusplus >= 201103L
@@ -108,15 +111,15 @@ class APT_HIDDEN pkgCacheGenerator /*{{{*/
bool NewGroup(pkgCache::GrpIterator &Grp, APT::StringView Name);
bool NewPackage(pkgCache::PkgIterator &Pkg, APT::StringView Name, APT::StringView Arch);
- map_pointer_t NewVersion(pkgCache::VerIterator &Ver, APT::StringView const &VerStr,
- map_pointer_t const ParentPkg, uint32_t Hash,
- map_pointer_t const Next);
- map_pointer_t NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang, APT::StringView md5sum,map_stringitem_t const idxmd5str);
+ map_pointer<pkgCache::Version> NewVersion(pkgCache::VerIterator &Ver, APT::StringView const &VerStr,
+ map_pointer<pkgCache::Package> const ParentPkg, uint32_t Hash,
+ map_pointer<pkgCache::Version> const Next);
+ map_pointer<pkgCache::Description> NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang, APT::StringView md5sum,map_stringitem_t const idxmd5str);
bool NewFileVer(pkgCache::VerIterator &Ver,ListParser &List);
bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
- map_pointer_t const Version, uint8_t const Op,
- uint8_t const Type, map_pointer_t* &OldDepLast);
+ map_stringitem_t const Version, uint8_t const Op,
+ uint8_t const Type, map_pointer<pkgCache::Dependency>* &OldDepLast);
bool NewProvides(pkgCache::VerIterator &Ver, pkgCache::PkgIterator &Pkg,
map_stringitem_t const ProvidesVersion, uint8_t const Flags);
@@ -172,7 +175,7 @@ class APT_HIDDEN pkgCacheListParser
// Some cache items
pkgCache::VerIterator OldDepVer;
- map_pointer_t *OldDepLast;
+ map_pointer<pkgCache::Dependency> *OldDepLast;
void * const d;
diff --git a/apt-private/private-cachefile.cc b/apt-private/private-cachefile.cc
index ab25338ff..9d875b4a7 100644
--- a/apt-private/private-cachefile.cc
+++ b/apt-private/private-cachefile.cc
@@ -22,7 +22,7 @@
using namespace std;
static bool SortPackagesByName(pkgCache * const Owner,
- map_pointer_t const A, map_pointer_t const B)
+ map_pointer<pkgCache::Group> const A, map_pointer<pkgCache::Group> const B)
{
if (A == 0)
return false;
@@ -42,7 +42,7 @@ void SortedPackageUniverse::LazyInit() const
return;
pkgCache * const Owner = data();
// In Multi-Arch systems Grps are easier to sort than Pkgs
- std::vector<map_pointer_t> GrpList;
+ std::vector<map_pointer<pkgCache::Group>> GrpList;
List.reserve(Owner->Head().GroupCount);
for (pkgCache::GrpIterator I{Owner->GrpBegin()}; I.end() != true; ++I)
GrpList.emplace_back(I - Owner->GrpP);
diff --git a/apt-private/private-cachefile.h b/apt-private/private-cachefile.h
index 5086ceaeb..ccd47107b 100644
--- a/apt-private/private-cachefile.h
+++ b/apt-private/private-cachefile.h
@@ -13,7 +13,7 @@
class APT_PUBLIC CacheFile : public pkgCacheFile
{
public:
- std::vector<map_pointer_t> UniverseList;
+ std::vector<map_pointer<pkgCache::Package>> UniverseList;
bool CheckDeps(bool AllowBroken = false);
bool BuildCaches(bool WithLock = true)
@@ -40,13 +40,13 @@ class APT_PUBLIC CacheFile : public pkgCacheFile
class SortedPackageUniverse : public APT::PackageUniverse
{
- std::vector<map_pointer_t> &List;
+ std::vector<map_pointer<pkgCache::Package>> &List;
void LazyInit() const;
public:
explicit SortedPackageUniverse(CacheFile &Cache);
- class const_iterator : public APT::Container_iterator_base<APT::PackageContainerInterface, SortedPackageUniverse, SortedPackageUniverse::const_iterator, std::vector<map_pointer_t>::const_iterator, pkgCache::PkgIterator>
+ class const_iterator : public APT::Container_iterator_base<APT::PackageContainerInterface, SortedPackageUniverse, SortedPackageUniverse::const_iterator, std::vector<map_pointer<pkgCache::Package>>::const_iterator, pkgCache::PkgIterator>
{
pkgCache * const Cache;
public:
@@ -55,8 +55,8 @@ public:
if (*_iter == 0) return pkgCache::PkgIterator(*Cache);
return pkgCache::PkgIterator(*Cache, Cache->PkgP + *_iter);
}
- explicit const_iterator(pkgCache * const Owner, std::vector<map_pointer_t>::const_iterator i):
- Container_iterator_base<APT::PackageContainerInterface, SortedPackageUniverse, SortedPackageUniverse::const_iterator, std::vector<map_pointer_t>::const_iterator, pkgCache::PkgIterator>(i), Cache(Owner) {}
+ explicit const_iterator(pkgCache * const Owner, std::vector<map_pointer<pkgCache::Package>>::const_iterator i):
+ Container_iterator_base<APT::PackageContainerInterface, SortedPackageUniverse, SortedPackageUniverse::const_iterator, std::vector<map_pointer<pkgCache::Package>>::const_iterator, pkgCache::PkgIterator>(i), Cache(Owner) {}
};
typedef const_iterator iterator;
diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc
index acf00bdda..23ab7e47f 100644
--- a/cmdline/apt-cache.cc
+++ b/cmdline/apt-cache.cc
@@ -134,14 +134,14 @@ static bool DumpPackage(CommandLine &CmdL)
// ShowHashTableStats - Show stats about a hashtable /*{{{*/
// ---------------------------------------------------------------------
/* */
-static map_pointer_t PackageNext(pkgCache::Package const * const P) { return P->NextPackage; }
-static map_pointer_t GroupNext(pkgCache::Group const * const G) { return G->Next; }
+static map_pointer<pkgCache::Package> PackageNext(pkgCache::Package const * const P) { return P->NextPackage; }
+static map_pointer<pkgCache::Group> GroupNext(pkgCache::Group const * const G) { return G->Next; }
template <class T>
static void ShowHashTableStats(char const *const Type,
T *StartP,
- map_pointer_t *Hashtable,
+ map_pointer<T> *Hashtable,
unsigned long Size,
- map_pointer_t (*Next)(T const *const))
+ map_pointer<T> (*Next)(T const *const))
{
// hashtable stats for the HashTable
unsigned long NumBuckets = Size;
@@ -467,7 +467,7 @@ static bool DumpAvail(CommandLine &)
char *Buffer = new char[Cache->HeaderP->MaxVerFileSize+10];
for (pkgCache::VerFile **J = VFList; *J != 0;)
{
- pkgCache::PkgFileIterator File(*Cache,(*J)->File + Cache->PkgFileP);
+ pkgCache::PkgFileIterator File(*Cache, Cache->PkgFileP + (*J)->File);
// FIXME: Add support for volatile/with-source files
FileFd PkgF(File.FileName(),FileFd::ReadOnly, FileFd::Extension);
if (_error->PendingError() == true)
@@ -481,7 +481,7 @@ static bool DumpAvail(CommandLine &)
unsigned long Pos = 0;
for (; *J != 0; J++)
{
- if ((*J)->File + Cache->PkgFileP != File)
+ if (Cache->PkgFileP + (*J)->File != File)
break;
const pkgCache::VerFile &VF = **J;
diff --git a/debian/libapt-pkg6.0.symbols b/debian/libapt-pkg6.0.symbols
index af66bf981..7a293c115 100644
--- a/debian/libapt-pkg6.0.symbols
+++ b/debian/libapt-pkg6.0.symbols
@@ -407,10 +407,8 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++)"pkgDPkgPM::Configure(pkgCache::PkgIterator)@APTPKG_6.0" 0.8.0
(c++)"pkgDPkgPM::pkgDPkgPM(pkgDepCache*)@APTPKG_6.0" 0.8.0
(c++)"pkgDPkgPM::~pkgDPkgPM()@APTPKG_6.0" 0.8.0
- (c++)"pkgPolicy::GetPriority(pkgCache::PkgIterator const&)@APTPKG_6.0" 0.8.0
(c++)"pkgPolicy::InitDefaults()@APTPKG_6.0" 0.8.0
(c++)"pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const&)@APTPKG_6.0" 0.8.0
- (c++)"pkgPolicy::GetMatch(pkgCache::PkgIterator const&)@APTPKG_6.0" 0.8.0
(c++)"pkgPolicy::CreatePin(pkgVersionMatch::MatchType, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, short)@APTPKG_6.0" 0.8.0
(c++)"pkgPolicy::pkgPolicy(pkgCache*)@APTPKG_6.0" 0.8.0
(c++)"pkgPolicy::~pkgPolicy()@APTPKG_6.0" 0.8.0
@@ -667,29 +665,6 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgIterator const&)@APTPKG_6.0" 0.8.16~exp6
(c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgFileIterator const&)@APTPKG_6.0" 0.8.16~exp6
### generalisation of checksums (with lfs) -- mostly api-compatible available (without sha512 in previous versions)
- (c++)"MD5Summation::Add(unsigned char const*, unsigned long long)@APTPKG_6.0" 0.8.16~exp6
- (c++)"MD5Summation::Result()@APTPKG_6.0" 0.8.16~exp2
- (c++)"MD5Summation::MD5Summation()@APTPKG_6.0" 0.8.16~exp2
- (c++)"SHA1Summation::SHA1Summation()@APTPKG_6.0" 0.8.16~exp2
- (c++)"SHA1Summation::Add(unsigned char const*, unsigned long long)@APTPKG_6.0" 0.8.16~exp6
- (c++)"SHA1Summation::Result()@APTPKG_6.0" 0.8.16~exp2
- (c++)"SummationImplementation::AddFD(int, unsigned long long)@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo for MD5Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo for SHA1Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo for SHA256Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo for SHA512Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo for SHA2SummationBase@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo for SummationImplementation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo name for MD5Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo name for SHA1Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo name for SHA256Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo name for SHA512Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo name for SHA2SummationBase@APTPKG_6.0" 0.8.16~exp6
- (c++)"typeinfo name for SummationImplementation@APTPKG_6.0" 0.8.16~exp6
- (c++)"vtable for MD5Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"vtable for SHA1Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"vtable for SHA256Summation@APTPKG_6.0" 0.8.16~exp6
- (c++)"vtable for SHA512Summation@APTPKG_6.0" 0.8.16~exp6
### large file support - available in older api-compatible versions without lfs ###
(c++)"StrToNum(char const*, unsigned long long&, unsigned int, unsigned int)@APTPKG_6.0" 0.8.16~exp6
(c++)"OpProgress::SubProgress(unsigned long long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, float)@APTPKG_6.0" 0.8.16~exp6
@@ -734,9 +709,6 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++)"pkgDepCache::AddSizes(pkgCache::PkgIterator const&, bool)@APTPKG_6.0" 0.8.16~exp6
(c++)"pkgDepCache::AddStates(pkgCache::PkgIterator const&, bool)@APTPKG_6.0" 0.8.16~exp6
### used internally by public interfaces - if you use them directly, you can keep the pieces
- (c++|optional=internal|regex)"^SHA256_.*@APTPKG_6.0$" 0.8.16~exp2
- (c++|optional=internal|regex)"^SHA384_.*@APTPKG_6.0$" 0.8.16~exp2
- (c++|optional=internal|regex)"^SHA512_.*@APTPKG_6.0$" 0.8.16~exp2
### orderlist rework: the touched methods are protected
(c++)"SigINT(int)@APTPKG_6.0" 0.8.16~exp14
(c++)"pkgPackageManager::SigINTStop@APTPKG_6.0" 0.8.16~exp14
@@ -749,7 +721,6 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++)"FileFd::Open(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, FileFd::CompressMode, unsigned long)@APTPKG_6.0" 0.8.16~exp9
(c++)"FileFd::Open(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, APT::Configuration::Compressor const&, unsigned long)@APTPKG_6.0" 0.8.16~exp9
(c++)"FileFd::ReadLine(char*, unsigned long long)@APTPKG_6.0" 0.8.16~exp9
- (c++)"SummationImplementation::AddFD(FileFd&, unsigned long long)@APTPKG_6.0" 0.8.16~exp9
### CacheSet rework: making them real containers breaks bigtime the API (for the CacheSetHelper)
(c++)"APT::CacheSetHelper::canNotFindTask(APT::PackageContainerInterface*, pkgCacheFile&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)@APTPKG_6.0" 0.8.16~exp9
(c++)"APT::CacheSetHelper::canNotFindRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)@APTPKG_6.0" 0.8.16~exp9
@@ -1319,6 +1290,15 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++)"vtable for pkgSourceList@APTPKG_6.0" 1.1~exp9
(c++)"vtable for SigVerify@APTPKG_6.0" 1.1~exp9
(c++)"vtable for TranslationsCopy@APTPKG_6.0" 1.1~exp9
+### ABI 6
+ (c++)"APT::CacheFilter::ParsePattern(APT::StringView, pkgCacheFile*)@APTPKG_6.0" 1.9.10
+ (c++)"APT::CacheSetHelper::PackageFromPattern(APT::PackageContainerInterface*, pkgCacheFile&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@APTPKG_6.0" 1.9.10
+ (c++)"APT::CacheSetHelper::showPatternSelection(pkgCache::PkgIterator const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@APTPKG_6.0" 1.9.10
+ (c++)"APT::String::DisplayLength(APT::StringView)@APTPKG_6.0" 1.9.10
+ (c++)"Hashes::GetHashString(Hashes::SupportedHashes)@APTPKG_6.0" 1.9.10
+ (c++)"pkgCache::VerIterator::TranslatedDescriptionForLanguage(APT::StringView) const@APTPKG_6.0" 1.9.10
+ (c++)"pkgPolicy::SetPriority(pkgCache::PkgFileIterator const&, short)@APTPKG_6.0" 1.9.10
+ (c++)"pkgPolicy::SetPriority(pkgCache::VerIterator const&, short)@APTPKG_6.0" 1.9.10
### dpkg selection state changer & general dpkg interfacing
(c++)"APT::StateChanges::clear()@APTPKG_6.0" 1.1~exp15
(c++)"APT::StateChanges::empty() const@APTPKG_6.0" 1.1~exp15
@@ -1425,7 +1405,6 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++)"void std::shuffle<__gnu_cxx::__normal_iterator<IndexTarget*, std::vector<IndexTarget, std::allocator<IndexTarget> > >, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>&>(__gnu_cxx::__normal_iterator<IndexTarget*, std::vector<IndexTarget, std::allocator<IndexTarget> > >, __gnu_cxx::__normal_iterator<IndexTarget*, std::vector<IndexTarget, std::allocator<IndexTarget> > >, std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>&)@APTPKG_6.0" 1.3~rc2
(c++)"void std::vector<pkgDPkgPM::Item, std::allocator<pkgDPkgPM::Item> >::emplace_back<pkgDPkgPM::Item::Ops, pkgCache::PkgIterator>(pkgDPkgPM::Item::Ops&&, pkgCache::PkgIterator&&)@APTPKG_6.0" 1.3~rc2
(c++)"void std::vector<pkgDPkgPM::Item, std::allocator<pkgDPkgPM::Item> >::emplace_back<pkgDPkgPM::Item::Ops, pkgCache::PkgIterator&>(pkgDPkgPM::Item::Ops&&, pkgCache::PkgIterator&)@APTPKG_6.0" 1.3~rc2
- (c++)"void std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::emplace_back<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@APTPKG_6.0" 1.3~rc2
(c++)"void std::vector<std::pair<pkgDPkgPM::Item*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<pkgDPkgPM::Item*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::emplace_back<pkgDPkgPM::Item*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(pkgDPkgPM::Item*&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)@APTPKG_6.0" 1.3~rc2
(c++)"APT::String::Join(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@APTPKG_6.0" 1.4~beta4
(c++)"debListParser::ParseDepends(char const*, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&, bool const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@APTPKG_6.0" 1.4~beta3
@@ -1501,8 +1480,35 @@ libapt-pkg.so.6.0 libapt-pkg6.0 #MINVER#
(c++|optional=std)"std::vector<APT::Configuration::Compressor, std::allocator<APT::Configuration::Compressor> >::~vector()@APTPKG_6.0" 0.8.12
(c++|optional=std)"void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag)@APTPKG_6.0" 1.7.0~alpha3~
(c++|optional=std)"void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*>(char const*, char const*, std::forward_iterator_tag)@APTPKG_6.0" 1.7.0~alpha3~
+ (c++|optional=std)"typeinfo for std::_Mutex_base<(__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"typeinfo for std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"typeinfo for std::_Sp_counted_deleter<__res_state*, void (*)(__res_state*), std::allocator<void>, (__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"typeinfo name for std::_Mutex_base<(__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"typeinfo name for std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"typeinfo name for std::_Sp_counted_deleter<__res_state*, void (*)(__res_state*), std::allocator<void>, (__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"typeinfo name for void (*)(__res_state*)@APTPKG_6.0" 1.9.10
+ (c++|optional=std)"vtable for std::_Sp_counted_deleter<__res_state*, void (*)(__res_state*), std::allocator<void>, (__gnu_cxx::_Lock_policy)2>@APTPKG_6.0" 1.9.10
### try to ignore std:: template instances
(c++)"void std::vector<APT::Configuration::Compressor, std::allocator<APT::Configuration::Compressor> >::emplace_back<APT::Configuration::Compressor>(APT::Configuration::Compressor&&)@APTPKG_6.0" 1.9~
(c++)"void std::vector<APT::StringView*, std::allocator<APT::StringView*> >::emplace_back<APT::StringView*>(APT::StringView*&&)@APTPKG_6.0" 1.9~
- (c++)"void std::vector<std::unique_ptr<FileFd, std::default_delete<FileFd> >, std::allocator<std::unique_ptr<FileFd, std::default_delete<FileFd> > > >::emplace_back<FileFd*>(FileFd*&&)@APTPKG_6.0" 1.9~
- (optional)_ZL6hash32jPKhm._GLOBAL___.._apt_pkg_pkgcache.cc_FB5499C7_0x5f8f5e3a3ed634d9.ifunc@APTPKG_6.0 1.9~
+ (regex|optional)".*hash32.*\.ifunc@APTPKG_6.0" 1.9.10
+### Internal functions needed for testing purposes
+ (c++)"APT::Internal::Patterns::BaseRegexMatcher::~BaseRegexMatcher()@APTPKG_6.0" 1.9.10
+ (c++)"APT::Internal::Patterns::BaseRegexMatcher::BaseRegexMatcher(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@APTPKG_6.0" 1.9.10
+ (c++)"APT::Internal::Patterns::BaseRegexMatcher::operator()(char const*)@APTPKG_6.0" 1.9.10
+ (c++)"APT::Internal::PatternTreeParser::Node::error(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)@APTPKG_6.0" 1.9.10
+ (c++)"APT::Internal::PatternTreeParser::parse()@APTPKG_6.0" 1.9.10
+ (c++)"APT::Internal::PatternTreeParser::parseTop()@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo for APT::Internal::PatternTreeParser::Error@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo for APT::Internal::PatternTreeParser::Node@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo for APT::Internal::PatternTreeParser::PatternNode@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo for APT::Internal::PatternTreeParser::WordNode@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo name for APT::Internal::PatternTreeParser::Error@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo name for APT::Internal::PatternTreeParser::Node@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo name for APT::Internal::PatternTreeParser::PatternNode@APTPKG_6.0" 1.9.10
+ (c++)"typeinfo name for APT::Internal::PatternTreeParser::WordNode@APTPKG_6.0" 1.9.10
+ (c++)"void std::vector<std::unique_ptr<APT::Internal::PatternTreeParser::Node, std::default_delete<APT::Internal::PatternTreeParser::Node> >, std::allocator<std::unique_ptr<APT::Internal::PatternTreeParser::Node, std::default_delete<APT::Internal::PatternTreeParser::Node> > > >::emplace_back<std::unique_ptr<APT::Internal::PatternTreeParser::Node, std::default_delete<APT::Internal::PatternTreeParser::Node> > >(std::unique_ptr<APT::Internal::PatternTreeParser::Node, std::default_delete<APT::Internal::PatternTreeParser::Node> >&&)@APTPKG_6.0" 1.9.10
+ (c++)"vtable for APT::Internal::PatternTreeParser::Error@APTPKG_6.0" 1.9.10
+ (c++)"vtable for APT::Internal::PatternTreeParser::Node@APTPKG_6.0" 1.9.10
+ (c++)"vtable for APT::Internal::PatternTreeParser::PatternNode@APTPKG_6.0" 1.9.10
+ (c++)"vtable for APT::Internal::PatternTreeParser::WordNode@APTPKG_6.0" 1.9.10