diff --git a/libwccl/ops/isoutside.h b/libwccl/ops/isoutside.h new file mode 100644 index 0000000000000000000000000000000000000000..cf744404fd59830976056e357a952c878c201a4c --- /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 6b479d36f5ac38e5c188fd1a4a6c8572a64fe669..54de8e599b654198377bdc2feb967de966fd3872 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()