summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2017-01-31 05:53:50 -0800
committerSam Bingner <sam@bingner.com>2020-07-17 00:22:23 -1000
commit79082a4dc7d747da29f7eb2c3016ec862729e919 (patch)
treedc93fa67eb7013dd71493e07d75b3eeec1c168d8
parenteef738b52b591ffb425f6a26838803dd89790196 (diff)
Port TagIterator to correctly support ReMap (doh).
-rw-r--r--apt-pkg/cacheiterators.h47
-rw-r--r--apt-pkg/pkgcachegen.cc18
2 files changed, 28 insertions, 37 deletions
diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h
index fdebbdee4..75581270b 100644
--- a/apt-pkg/cacheiterators.h
+++ b/apt-pkg/cacheiterators.h
@@ -252,45 +252,30 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
};
/*}}}*/
// Tag Iterator /*{{{*/
-class pkgCache::TagIterator
-{
- Tag *Tg;
- pkgCache *Owner;
-
- void _dummy();
-
- public:
+class pkgCache::TagIterator : public Iterator<Tag, TagIterator> {
+ public:
+ inline Tag* OwnerPointer() const {
+ return (Owner != 0) ? Owner->TagP : 0;
+ }
// Iteration
- void operator ++(int) {if (Tg != Owner->TagP) Tg = Owner->TagP + Tg->NextTag;};
+ void operator ++(int) {if (S != Owner->TagP) S = Owner->TagP + S->NextTag;};
inline void operator ++() {operator ++(0);};
- inline bool end() const {return Tg == Owner->TagP?true:false;};
- inline void operator =(const TagIterator &B) {Tg = B.Tg; Owner = B.Owner;};
// Comparison
- inline bool operator ==(const TagIterator &B) const {return Tg == B.Tg;};
- inline bool operator !=(const TagIterator &B) const {return Tg != B.Tg;};
+ inline bool operator ==(const TagIterator &B) const {return S == B.S;};
+ inline bool operator !=(const TagIterator &B) const {return S != B.S;};
int CompareTag(const TagIterator &B) const;
// Accessors
- inline Tag *operator ->() {return Tg;};
- inline Tag const *operator ->() const {return Tg;};
- inline Tag &operator *() {return *Tg;};
- inline Tag const &operator *() const {return *Tg;};
- inline operator Tag *() {return Tg == Owner->TagP?0:Tg;};
- inline operator Tag const *() const {return Tg == Owner->TagP?0:Tg;};
- inline pkgCache *Cache() {return Owner;};
-
- inline const char *Name() const {return Owner->StrP + Tg->Name;};
- inline unsigned long Index() const {return Tg - Owner->TagP;};
-
- inline TagIterator() : Tg(0), Owner(0) {};
- inline TagIterator(pkgCache &Owner,Tag *Trg = 0) : Tg(Trg),
- Owner(&Owner)
- {
- if (Tg == 0)
- Tg = Owner.TagP;
- };
+ inline const char *Name() const {return Owner->StrP + S->Name;};
+ inline unsigned long Index() const {return S - Owner->TagP;};
+
+ inline TagIterator(pkgCache &Owner,Tag *Trg = 0) : Iterator<Tag, TagIterator>(Owner, Trg) {
+ if (S == 0)
+ S = OwnerPointer();
+ }
+ inline TagIterator() : Iterator<Tag, TagIterator>() {}
};
/*}}}*/
// Description Iterator /*{{{*/
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index de724d7d5..796b3b574 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -175,6 +175,10 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM
i != Dynamic<pkgCache::VerIterator>::toReMap.end(); ++i)
if (std::get<1>(seen.insert(*i)) == true)
(*i)->ReMap(oldMap, newMap);
+ for (std::vector<pkgCache::TagIterator*>::const_iterator i = Dynamic<pkgCache::TagIterator>::toReMap.begin();
+ i != Dynamic<pkgCache::TagIterator>::toReMap.end(); ++i)
+ if (std::get<1>(seen.insert(*i)) == true)
+ (*i)->ReMap(oldMap, newMap);
for (std::vector<pkgCache::DepIterator*>::const_iterator i = Dynamic<pkgCache::DepIterator>::toReMap.begin();
i != Dynamic<pkgCache::DepIterator>::toReMap.end(); ++i)
if (std::get<1>(seen.insert(*i)) == true)
@@ -1290,18 +1294,20 @@ bool pkgCacheGenerator::NewTag(pkgCache::VerIterator &Ver,
unsigned int NameSize)
{
// Get a structure
- unsigned long Tagg = AllocateInMap(sizeof(pkgCache::Tag));
- if (Tagg == 0)
+ map_pointer_t const idxTag = AllocateInMap(sizeof(pkgCache::Tag));
+ if (unlikely(idxTag == 0))
return false;
- Cache.HeaderP->TagCount++;
// Fill it in
- pkgCache::TagIterator Tg(Cache,Cache.TagP + Tagg);
- Tg->Name = WriteStringInMap(NameStart,NameSize);
- if (Tg->Name == 0)
+ pkgCache::TagIterator Tg(Cache,Cache.TagP + idxTag);
+ map_pointer_t const idxName = WriteStringInMap(NameStart,NameSize);
+ if (idxName == 0)
return false;
+ Tg->Name = idxName;
+
Tg->NextTag = Ver->TagList;
Ver->TagList = Tg.Index();
+ Cache.HeaderP->TagCount++;
return true;
}