// -*- mode: cpp; mode: fold -*-
// Description								/*{{{*/
/** \file cachefilter.h
   Collection of functor classes */
									/*}}}*/
#ifndef APT_CACHEFILTER_H
#define APT_CACHEFILTER_H
// Include Files							/*{{{*/
#include <apt-pkg/pkgcache.h>

#include <string>

#include <regex.h>
									/*}}}*/
namespace APT {
namespace CacheFilter {

#define PACKAGE_MATCHER_ABI_COMPAT 1
#ifdef PACKAGE_MATCHER_ABI_COMPAT

// PackageNameMatchesRegEx						/*{{{*/
class PackageNameMatchesRegEx {
         /** \brief dpointer placeholder (for later in case we need it) */
         void *d;
	regex_t* pattern;
public:
	PackageNameMatchesRegEx(std::string const &Pattern);
	bool operator() (pkgCache::PkgIterator const &Pkg);
	bool operator() (pkgCache::GrpIterator const &Grp);
	~PackageNameMatchesRegEx();
};
									/*}}}*/
// PackageNameMatchesFnmatch						/*{{{*/
 class PackageNameMatchesFnmatch {
         /** \brief dpointer placeholder (for later in case we need it) */
         void *d;
         const std::string Pattern;
public:
         PackageNameMatchesFnmatch(std::string const &Pattern) 
            : Pattern(Pattern) {};
        bool operator() (pkgCache::PkgIterator const &Pkg);
	bool operator() (pkgCache::GrpIterator const &Grp);
	~PackageNameMatchesFnmatch() {};
};
									/*}}}*/
// PackageArchitectureMatchesSpecification				/*{{{*/
/** \class PackageArchitectureMatchesSpecification
   \brief matching against architecture specification strings

   The strings are of the format <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, linux-any, any-amd64, any */
class PackageArchitectureMatchesSpecification {
	std::string literal;
	std::string complete;
	bool isPattern;
	/** \brief dpointer placeholder (for later in case we need it) */
	void *d;
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);
	bool operator() (pkgCache::PkgIterator const &Pkg);
	bool operator() (pkgCache::VerIterator const &Ver);
	~PackageArchitectureMatchesSpecification();
};

#else

class PackageMatcher {
 public:
   virtual bool operator() (pkgCache::PkgIterator const &Pkg) { return false; };
   virtual bool operator() (pkgCache::GrpIterator const &Grp) { return false; };
   virtual bool operator() (pkgCache::VerIterator const &Ver) { return false; };
   
   virtual ~PackageMatcher() {};
};

// PackageNameMatchesRegEx						/*{{{*/
class PackageNameMatchesRegEx : public PackageMatcher {
         /** \brief dpointer placeholder (for later in case we need it) */
         void *d;
	regex_t* pattern;
public:
	PackageNameMatchesRegEx(std::string const &Pattern);
	virtual bool operator() (pkgCache::PkgIterator const &Pkg);
	virtual bool operator() (pkgCache::GrpIterator const &Grp);
	virtual ~PackageNameMatchesRegEx();
};
									/*}}}*/
// PackageNameMatchesFnmatch						/*{{{*/
   class PackageNameMatchesFnmatch : public PackageMatcher{
         /** \brief dpointer placeholder (for later in case we need it) */
         void *d;
         const std::string Pattern;
public:
         PackageNameMatchesFnmatch(std::string const &Pattern) 
            : Pattern(Pattern) {};
        virtual bool operator() (pkgCache::PkgIterator const &Pkg);
	virtual bool operator() (pkgCache::GrpIterator const &Grp);
	virtual ~PackageNameMatchesFnmatch() {};
};
									/*}}}*/
// PackageArchitectureMatchesSpecification				/*{{{*/
/** \class PackageArchitectureMatchesSpecification
   \brief matching against architecture specification strings

   The strings are of the format <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, linux-any, any-amd64, any */
class PackageArchitectureMatchesSpecification : public PackageMatcher {
	std::string literal;
	std::string complete;
	bool isPattern;
	/** \brief dpointer placeholder (for later in case we need it) */
	void *d;
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);
	virtual bool operator() (pkgCache::VerIterator const &Ver);
	virtual ~PackageArchitectureMatchesSpecification();
};
#endif
									/*}}}*/
}
}
#endif