Prechádzať zdrojové kódy

Port TagIterator to correctly support ReMap (doh).

Jay Freeman (saurik) 9 rokov pred
rodič
commit
c2fb49ca17
2 zmenil súbory, kde vykonal 28 pridanie a 37 odobranie
  1. 16 31
      apt-pkg/cacheiterators.h
  2. 12 6
      apt-pkg/pkgcachegen.cc

+ 16 - 31
apt-pkg/cacheiterators.h

@@ -250,45 +250,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							/*{{{*/

+ 12 - 6
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;
 }