⛏️ index : haiku.git

/*
 * Copyright 2013-2014, Stephan Aßmus <superstippi@gmx.de>.
 * Copyright 2016-2025, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 *
 * Note that this file included code earlier from `Model.cpp` and
 * copyrights have been latterly been carried across in 2024.
 */
#ifndef PACKAGE_FILTER_H
#define PACKAGE_FILTER_H

#include <vector>

#include <Referenceable.h>
#include <String.h>

#include "PackageFilterSpecification.h"
#include "PackageInfo.h"


/*!	See the class PackageFilterFactory for static factory methods that will
	create concrete instances of this abstract superclass.
*/
class PackageFilter : public BReferenceable
{
public:
	virtual						~PackageFilter();

	virtual	bool				AcceptsPackage(const PackageInfoRef& package) const = 0;
};


typedef BReference<PackageFilter> PackageFilterRef;


class NotFilter : public PackageFilter
{
public:
								NotFilter(PackageFilterRef filter);
	virtual bool				AcceptsPackage(const PackageInfoRef& package) const;

private:
			PackageFilterRef	fFilter;
};


class AndFilter : public PackageFilter
{
public:
			void				AddFilter(PackageFilterRef filter);
	virtual bool				AcceptsPackage(const PackageInfoRef& package) const;

private:
			std::vector<PackageFilterRef>
								fFilters;
};


class PackageFilterFactory
{
public:
	static	PackageFilterRef	CreateCategoryFilter(const BString& category);
	static	PackageFilterRef	CreateSearchTermsFilter(const BString& searchTerms);
	static	PackageFilterRef	CreateDepotFilter(const BString& depotName);
	static	PackageFilterRef	CreateStateFilter(PackageState state);
	static	PackageFilterRef	CreateDesktopFilter();
	static	PackageFilterRef	CreateNativeDesktopFilter();
	static	PackageFilterRef	CreateSourceFilter();
	static	PackageFilterRef	CreateDevelopmentFilter();
	static	PackageFilterRef	CreateFalseFilter();
	static	PackageFilterRef	CreateFilter(const PackageFilterSpecificationRef specification);
};


#endif // PACKAGE_FILTER_H