Skip to content
Snippets Groups Projects
equals.h 2.23 KiB
Newer Older
#ifndef LIBWCCL_OPS_EQUALS_H
#define LIBWCCL_OPS_EQUALS_H

#include <boost/mpl/list.hpp>
#include <boost/mpl/count.hpp>
#include <libwccl/ops/predicate.h>
#include <libwccl/ops/formatters.h>

namespace Wccl {

/**
 * Helper template class to factor out equality comparison
 * (namely for special treatment of Position). By default,
 * T::equals(const T& other) is used.
 */
template <class T>
class EqualityComparer
{
	static boost::shared_ptr<const Value> apply(
			const T& arg1,
			const T& arg2,
			const FunExecContext& context)
		return Predicate::evaluate(arg1.equals(arg2), context);
/**
 * Helper template class to factor out equality comparison.
 * This is specialization for Position that uses
 * Position::equals(const Position& other, const SentenceContext& context)
 */
template <>
class EqualityComparer<Position>
{
public:
	static boost::shared_ptr<const Value> apply(
			const Position& arg1,
			const Position& arg2,
			const FunExecContext& context)
	{
		return Predicate::evaluate(
				arg1.equals(arg2, context.sentence_context()),
				context);
 * Predicate that checks for equality of values
template <class T>
class Equals : public Predicate {
	typedef boost::shared_ptr<Function<T> > ArgFunctionPtr;

	Equals(const ArgFunctionPtr& arg1_expr, const ArgFunctionPtr& arg2_expr)
		: arg1_expr_(arg1_expr), arg2_expr_(arg2_expr)
	{
		BOOST_ASSERT(arg1_expr_);
		BOOST_ASSERT(arg2_expr_);
	}

	virtual std::string to_string(const Corpus2::Tagset& tagset) const {
		return BinaryFunctionFormatter::to_string(tagset, *this, *arg1_expr_, *arg2_expr_);
	}

	virtual std::string to_raw_string() const {
		return BinaryFunctionFormatter::to_raw_string(*this, *arg1_expr_, *arg2_expr_);
	}

	virtual const std::string raw_operator_name() const {
		return "equals";
	}

protected:
	const ArgFunctionPtr arg1_expr_;
	const ArgFunctionPtr arg2_expr_;

	/**
	 * Take values of arguments from expressions and return True if they are equal,
	 * False otherwise.
	virtual BaseRetValPtr apply_internal(const FunExecContext& context) const {
		return EqualityComparer<T>::apply(
			*(this->arg1_expr_->apply(context)),
			*(this->arg2_expr_->apply(context)),
			context);
} /* end ns Wccl */