From 331956f9b59c8c30cce977e8729991559d46005c Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 19 Aug 2005 08:50:57 +0000 Subject: * added a InRootSetFunc class for clients to add own packages to the mark'n'sweep root set --- apt-pkg/algorithms.cc | 10 ++++++++-- apt-pkg/algorithms.h | 14 ++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc index 3978e7561..82ea19c93 100644 --- a/apt-pkg/algorithms.cc +++ b/apt-pkg/algorithms.cc @@ -1342,8 +1342,14 @@ pkgMarkAlwaysInclude(pkgCache::PkgIterator p, vector alwaysMark) return false; } +bool pkgMarkUsed(pkgDepCache &Cache) +{ + InRootSetFunc f; + return pkgMarkUsed(Cache, f); +} + // the main mark algorithm -bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func) +bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc &userFunc) { bool follow_recommends; bool follow_suggests; @@ -1394,7 +1400,7 @@ bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc func) // do the mark part, this is the core bit of the algorithm for(pkgCache::PkgIterator p=Cache.PkgBegin(); !p.end(); ++p) { - if( (func != NULL ? (*func)(p) : false) || + if( userFunc.InRootSet(p) || pkgMarkAlwaysInclude(p, neverAutoRemoveRegexp) || !(Cache[p].Flags & pkgCache::Flag::Auto) || (p->Flags & pkgCache::Flag::Essential)) diff --git a/apt-pkg/algorithms.h b/apt-pkg/algorithms.h index 02b40e15f..e539a410e 100644 --- a/apt-pkg/algorithms.h +++ b/apt-pkg/algorithms.h @@ -134,10 +134,16 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache); void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List); -// callback function that can be used by the client to bring in +// class that can be subclassed by the client to bring in // certain own packages into the root set (if the client returns // True the package will be considered as part of the root set) -typedef bool (*InRootSetFunc)(pkgCache::PkgIterator); +class InRootSetFunc +{ + public: + virtual bool InRootSet(const pkgCache::PkgIterator &pkg) {return false;}; + virtual ~InRootSetFunc() {}; +}; + // Mark all reachable packages with "pkgDepCache::StateCache.Marked=1" // the root-set are all essential packages+everything that was not @@ -147,7 +153,7 @@ typedef bool (*InRootSetFunc)(pkgCache::PkgIterator); // is usefull for clients that have there own idea about the root-set // // Everything that is not reach can be removed -bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc f=NULL); - +bool pkgMarkUsed(pkgDepCache &Cache); +bool pkgMarkUsed(pkgDepCache &Cache, InRootSetFunc &f); #endif -- cgit v1.2.3