From 5398cbea9bf2e1d80fda69dcac0a91543bc3a92f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adam=20Wardy=C5=84ski?= <no@email>
Date: Mon, 8 Nov 2010 14:48:56 +0100
Subject: [PATCH] Base class for predicates that operate on two sets

---
 libwccl/ops/setpredicate.h | 46 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 libwccl/ops/setpredicate.h

diff --git a/libwccl/ops/setpredicate.h b/libwccl/ops/setpredicate.h
new file mode 100644
index 0000000..b0f0bb4
--- /dev/null
+++ b/libwccl/ops/setpredicate.h
@@ -0,0 +1,46 @@
+#ifndef SETPREDICATE_H
+#define SETPREDICATE_H
+
+#include <boost/shared_ptr.hpp>
+#include <boost/mpl/list.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/count.hpp>
+#include <libwccl/ops/predicate.h>
+#include <libwccl/ops/formatters.h>
+
+namespace Wccl {
+
+/**
+ * Abstract base class for predicates which operate on two sets
+ */
+template<class T>
+class SetPredicate : public Predicate {
+	BOOST_MPL_ASSERT(( boost::mpl::count<boost::mpl::list<StrSet, TSet>, T> ));
+public:
+	typedef boost::shared_ptr<Function<T> > SetFunctionPtr;
+
+	SetPredicate(const SetFunctionPtr& set1_expr, const SetFunctionPtr& set2_expr)
+		: set1_expr_(set1_expr), set2_expr_(set2_expr)
+	{
+		BOOST_ASSERT(set1_expr_);
+		BOOST_ASSERT(set2_expr_);
+	}
+
+	virtual std::string to_string(const Corpus2::Tagset& tagset) const {
+		return BinaryFunctionFormatter::to_string(tagset, *this, *set1_expr_, *set2_expr_);
+	}
+
+	virtual std::string to_raw_string() const {
+		return BinaryFunctionFormatter::to_raw_string(*this, *set1_expr_, *set2_expr_);
+	}
+
+protected:
+	const SetFunctionPtr set1_expr_;
+	const SetFunctionPtr set2_expr_;
+
+	typedef FunctionBase::BaseRetValPtr BaseRetValPtr;
+};
+
+} /* end ns Wccl */
+
+#endif // SETPREDICATE_H
-- 
GitLab