[Aptitude-devel] r2963 - in branches/aptitude-0.3/aptitude: . src/generic/problemresolver

Daniel Burrows dburrows@costa.debian.org
Sat, 09 Apr 2005 14:57:22 +0000


Author: dburrows
Date: Sat Apr  9 14:57:19 2005
New Revision: 2963

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h
Log:
Don't blow up when iterating over all dependencies.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Sat Apr  9 14:57:19 2005
@@ -2,6 +2,10 @@
 
 	* src/generic/problemresolver/aptitude_resolver.h:
 
+	  Fix the dep_iterator to not blow up.
+
+	* src/generic/problemresolver/aptitude_resolver.h:
+
 	  Make sure to include UNINST in version iteration (avoid
 	  adding an extraneous bool by overloading pkg to track
 	  end-ness).

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/aptitude_resolver.h	Sat Apr  9 14:57:19 2005
@@ -159,6 +159,7 @@
 public:
   aptitude_resolver_dep(const pkgCache::DepIterator dep)
   {
+    assert(!dep.end());
     if(dep->Type != pkgCache::Dep::Conflicts)
       {
 	// Throw away the end, since it's not necessary.
@@ -190,6 +191,7 @@
 
   aptitude_resolver_version get_source()
   {
+    assert(!start.end());
     assert(!start.ParentPkg().end());
     return aptitude_resolver_version(start.ParentPkg(), start.ParentVer());
   }
@@ -507,6 +509,28 @@
     class pkgCache::VerIterator ver;
     class pkgCache::DepIterator dep;
 
+    // Advance to the next valid dep (inclusive of dep).
+    void normalize()
+    {
+      if(dep.end())
+	{
+	  while(!pkg.end())
+	    {
+	      while(dep.end() && !ver.end())
+		{
+		  // Since dep is an end iterator, advance at least
+		  // to the next version.
+		  ++ver;
+
+		  if(!ver.end())
+		    dep=ver.DependsList();
+		}
+	      ++pkg;
+	      if(!pkg.end())
+		ver=pkg.VersionList();
+	    }
+	}
+    }
   public:
     // Start from the given package (typically Head() or End()).
     dep_iterator(const pkgCache::PkgIterator &_pkg)
@@ -516,6 +540,8 @@
 	ver=pkg.VersionList();
       if(!ver.end())
 	dep=ver.DependsList();
+
+      normalize();
     }
 
     aptitude_universe::dep operator*() const
@@ -525,28 +551,16 @@
 
     dep_iterator &operator++()
     {
-      while(!pkg.end())
-	{
-	  while(!ver.end())
-	    {
-	      while(!dep.end() && dep->CompareOp & pkgCache::Dep::Or)
-		++dep;
-
-	      if(!dep.end())
-		++dep;
-
-	      if(!dep.end())
-		return *this;
+      // Advance to the end of the OR...
+      while(!dep.end() && dep->CompareOp & pkgCache::Dep::Or)
+	++dep;
+
+      // ...and beyond!
+      if(!dep.end())
+	++dep;
 
-	      ++ver;
-	      if(!ver.end())
-		dep=ver.DependsList();
-	    }
-	  ++pkg;
-	  if(!pkg.end())
-	    ver=pkg.VersionList();
-	}
-      return *this;
+      // Look for a valid dep.
+      normalize();
     }
 
     bool end() const