From df485eda96734a13f35f2879b213c268849c50ba Mon Sep 17 00:00:00 2001
From: Adam Wardynski <award@.(B-4.4.46a)>
Date: Fri, 19 Nov 2010 18:32:12 +0100
Subject: [PATCH] IsOutside, checks if Position is outside of a Sentence in
 given context

---
 libwccl/ops/isoutside.h      | 54 ++++++++++++++++++++++++++++++++++++
 tests/positionpredicates.cpp | 50 +++++++++++++++++++++++++++++++++
 2 files changed, 104 insertions(+)
 create mode 100644 libwccl/ops/isoutside.h

diff --git a/libwccl/ops/isoutside.h b/libwccl/ops/isoutside.h
new file mode 100644
index 0000000..cf74440
--- /dev/null
+++ b/libwccl/ops/isoutside.h
@@ -0,0 +1,54 @@
+#ifndef LIBWCCL_OPS_ISOUTSIDE_H
+#define LIBWCCL_OPS_ISOUTSIDE_H
+
+#include <libwccl/ops/predicate.h>
+#include <libwccl/ops/formatters.h>
+#include <libwccl/values/position.h>
+
+namespace Wccl {
+
+/**
+ * Predicate that checks if a position is outside of the sentence boundaries
+ */
+class IsOutside : public Predicate {
+public:
+	typedef boost::shared_ptr<Function<Position> > PosFunctionPtr;
+
+	IsOutside(const PosFunctionPtr& pos_expr)
+		: pos_expr_(pos_expr)
+	{
+		BOOST_ASSERT(pos_expr_);
+	}
+
+	virtual std::string to_string(const Corpus2::Tagset& tagset) const {
+		return UnaryFunctionFormatter::to_string(tagset, *this, *pos_expr_);
+	}
+
+	virtual std::string to_raw_string() const {
+		return UnaryFunctionFormatter::to_raw_string(*this, *pos_expr_);
+	}
+
+	virtual const std::string raw_operator_name() const {
+		return "outside";
+	}
+
+protected:
+	const PosFunctionPtr pos_expr_;
+
+	/**
+	 * Takes values of position from argument, and checks if it is outside of the
+	 * sentence boundaries, in the given context (i.e. relative to current position)
+	 * @returns True value if position is outside of the sentence boundaries, False otherwise.
+	 */
+	virtual BaseRetValPtr apply_internal(const FunExecContext& context) const {
+		const boost::shared_ptr<const Position>& pos = pos_expr_->apply(context);
+		if(pos->is_outside(context.sentence_context())) {
+			return Predicate::True(context);
+		}
+		return Predicate::False(context);
+	}
+};
+
+} /* end ns Wccl */
+
+#endif // LIBWCCL_OPS_ISOUTSIDE_H
diff --git a/tests/positionpredicates.cpp b/tests/positionpredicates.cpp
index 6b479d3..54de8e5 100644
--- a/tests/positionpredicates.cpp
+++ b/tests/positionpredicates.cpp
@@ -5,6 +5,7 @@
 
 #include <libwccl/ops/constant.h>
 #include <libwccl/ops/isinside.h>
+#include <libwccl/ops/isoutside.h>
 
 using namespace Wccl;
 
@@ -96,6 +97,45 @@ BOOST_FIXTURE_TEST_CASE(is_inside_end, PosPredFix)
 	BOOST_CHECK(is_inside.apply(cx)->get_value());
 }
 
+BOOST_FIXTURE_TEST_CASE(is_outside_1, PosPredFix)
+{
+	IsOutside is_outside(pos_one_constant);
+	BOOST_CHECK(!is_outside.apply(cx)->get_value());
+	sc.advance();
+	BOOST_CHECK(is_outside.apply(cx)->get_value());
+}
+
+BOOST_FIXTURE_TEST_CASE(is_outside_minus1, PosPredFix)
+{
+	IsOutside is_outside(pos_minus_one_constant);
+	BOOST_CHECK(is_outside.apply(cx)->get_value());
+	sc.advance();
+	BOOST_CHECK(!is_outside.apply(cx)->get_value());
+}
+
+BOOST_FIXTURE_TEST_CASE(is_outside_nowhere, PosPredFix)
+{
+	IsOutside is_outside(nowhere_constant);
+	BOOST_CHECK(is_outside.apply(cx)->get_value());
+	sc.advance();
+	BOOST_CHECK(is_outside.apply(cx)->get_value());
+}
+
+BOOST_FIXTURE_TEST_CASE(is_outside_begin, PosPredFix)
+{
+	IsOutside is_outside(begin_constant);
+	BOOST_CHECK(!is_outside.apply(cx)->get_value());
+	sc.advance();
+	BOOST_CHECK(!is_outside.apply(cx)->get_value());
+}
+
+BOOST_FIXTURE_TEST_CASE(is_outside_end, PosPredFix)
+{
+	IsOutside is_outside(end_constant);
+	BOOST_CHECK(!is_outside.apply(cx)->get_value());
+	sc.advance();
+	BOOST_CHECK(!is_outside.apply(cx)->get_value());
+}
 //------ to_string test cases -------
 
 BOOST_FIXTURE_TEST_CASE(is_inside_to_string, PosPredFix)
@@ -110,5 +150,15 @@ BOOST_FIXTURE_TEST_CASE(is_inside_to_raw_string, PosPredFix)
 	BOOST_CHECK_EQUAL("inside(end)", is_inside.to_raw_string());
 }
 
+BOOST_FIXTURE_TEST_CASE(is_outside_to_string, PosPredFix)
+{
+	IsOutside is_outside(begin_constant);
+	BOOST_CHECK_EQUAL("outside(begin)", is_outside.to_string(tagset));
+}
 
+BOOST_FIXTURE_TEST_CASE(is_outside_to_raw_string, PosPredFix)
+{
+	IsOutside is_outside(nowhere_constant);
+	BOOST_CHECK_EQUAL("outside(nowhere)", is_outside.to_raw_string());
+}
 BOOST_AUTO_TEST_SUITE_END()
-- 
GitLab