X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/f5b622ed48fdbe235d81b61b3edd8dbb84d9cc9c..317bb39f3cd6626c74f25d7bdf2907f1b235f553:/apt-pkg/cachefilter.h?ds=sidebyside

diff --git a/apt-pkg/cachefilter.h b/apt-pkg/cachefilter.h
index 5d426008b..30a3368e5 100644
--- a/apt-pkg/cachefilter.h
+++ b/apt-pkg/cachefilter.h
@@ -7,25 +7,145 @@
 #define APT_CACHEFILTER_H
 // Include Files							/*{{{*/
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cacheiterators.h>
 
 #include <string>
+#include <vector>
 
 #include <regex.h>
+
+class pkgCacheFile;
 									/*}}}*/
 namespace APT {
 namespace CacheFilter {
-// PackageNameMatchesRegEx						/*{{{*/
-class PackageNameMatchesRegEx {
-         /** \brief dpointer placeholder (for later in case we need it) */
-         void *d;
+
+class Matcher {
+public:
+   virtual bool operator() (pkgCache::PkgIterator const &/*Pkg*/) = 0;
+   virtual bool operator() (pkgCache::GrpIterator const &/*Grp*/) = 0;
+   virtual bool operator() (pkgCache::VerIterator const &/*Ver*/) = 0;
+   virtual ~Matcher();
+};
+
+class PackageMatcher : public Matcher {
+public:
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE = 0;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) APT_OVERRIDE { return (*this)(Ver.ParentPkg()); }
+   virtual bool operator() (pkgCache::GrpIterator const &/*Grp*/) APT_OVERRIDE { return false; }
+   virtual ~PackageMatcher();
+};
+
+// Generica like True, False, NOT, AND, OR				/*{{{*/
+class TrueMatcher : public Matcher {
+public:
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) APT_OVERRIDE;
+};
+
+class FalseMatcher : public Matcher {
+public:
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) APT_OVERRIDE;
+};
+
+class NOTMatcher : public Matcher {
+   Matcher * const matcher;
+public:
+   explicit NOTMatcher(Matcher * const matcher);
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) APT_OVERRIDE;
+   virtual ~NOTMatcher();
+};
+
+class ANDMatcher : public Matcher {
+   std::vector<Matcher *> matchers;
+public:
+   // 5 ought to be enough for everybody… c++11 variadic templates would be nice
+   ANDMatcher();
+   explicit ANDMatcher(Matcher * const matcher1);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5);
+   ANDMatcher& AND(Matcher * const matcher);
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) APT_OVERRIDE;
+   virtual ~ANDMatcher();
+};
+class ORMatcher : public Matcher {
+   std::vector<Matcher *> matchers;
+public:
+   // 5 ought to be enough for everybody… c++11 variadic templates would be nice
+   ORMatcher();
+   explicit ORMatcher(Matcher * const matcher1);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5);
+   ORMatcher& OR(Matcher * const matcher);
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) APT_OVERRIDE;
+   virtual ~ORMatcher();
+};
+									/*}}}*/
+class PackageNameMatchesRegEx : public PackageMatcher {			/*{{{*/
 	regex_t* pattern;
 public:
-	PackageNameMatchesRegEx(std::string const &Pattern);
-	bool operator() (pkgCache::PkgIterator const &Pkg);
-	bool operator() (pkgCache::GrpIterator const &Grp);
-	~PackageNameMatchesRegEx();
+	explicit PackageNameMatchesRegEx(std::string const &Pattern);
+	virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+	virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+	virtual ~PackageNameMatchesRegEx();
 };
 									/*}}}*/
+class PackageNameMatchesFnmatch : public PackageMatcher {		/*{{{*/
+	const std::string Pattern;
+public:
+	explicit PackageNameMatchesFnmatch(std::string const &Pattern);
+	virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+	virtual bool operator() (pkgCache::GrpIterator const &Grp) APT_OVERRIDE;
+	virtual ~PackageNameMatchesFnmatch() {};
+};
+									/*}}}*/
+class PackageArchitectureMatchesSpecification : public PackageMatcher {	/*{{{*/
+/** \class PackageArchitectureMatchesSpecification
+   \brief matching against architecture specification strings
+
+   The strings are of the format <libc>-<kernel>-<cpu> where either component,
+   or the whole string, can be the wildcard "any" as defined in
+   debian-policy §11.1 "Architecture specification strings".
+
+   Examples: i386, mipsel, musl-linux-amd64, linux-any, any-amd64, any */
+	std::string literal;
+	std::string complete;
+	bool isPattern;
+public:
+	/** \brief matching against architecture specification strings
+	 *
+	 * @param pattern is the architecture specification string
+	 * @param isPattern defines if the given \b pattern is a
+	 *        architecture specification pattern to match others against
+	 *        or if it is the fixed string and matched against patterns
+	 */
+	PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern = true);
+	bool operator() (char const * const &arch);
+	virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+	virtual ~PackageArchitectureMatchesSpecification();
+};
+									/*}}}*/
+class PackageIsNewInstall : public PackageMatcher {			/*{{{*/
+	pkgCacheFile * const Cache;
+public:
+	explicit PackageIsNewInstall(pkgCacheFile * const Cache);
+	virtual bool operator() (pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
+	virtual ~PackageIsNewInstall();
+};
+									/*}}}*/
+
 }
 }
 #endif