[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