From 502de391b235f60d76d7d6f7a198a11dff4dd4bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Wardy=C5=84ski?= <no@email> Date: Thu, 4 Nov 2010 19:46:12 +0100 Subject: [PATCH] LogicalPredicate, abstract base class for predicates that are logical functions taking any number of arguments --- libwccl/CMakeLists.txt | 1 + libwccl/ops/logicalpredicate.cpp | 35 +++++++++++++++++++++++ libwccl/ops/logicalpredicate.h | 48 ++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 libwccl/ops/logicalpredicate.cpp create mode 100644 libwccl/ops/logicalpredicate.h diff --git a/libwccl/CMakeLists.txt b/libwccl/CMakeLists.txt index 398687b..3027aee 100644 --- a/libwccl/CMakeLists.txt +++ b/libwccl/CMakeLists.txt @@ -16,6 +16,7 @@ set(LIBS ${LIBS} ${Boost_LIBRARIES}) SET(libwccl_STAT_SRC exception.cpp main.cpp + ops/logicalpredicate.cpp ops/predicate.cpp sentencecontext.cpp values/bool.cpp diff --git a/libwccl/ops/logicalpredicate.cpp b/libwccl/ops/logicalpredicate.cpp new file mode 100644 index 0000000..750f144 --- /dev/null +++ b/libwccl/ops/logicalpredicate.cpp @@ -0,0 +1,35 @@ +#include <libwccl/ops/logicalpredicate.h> + +namespace Wccl { + +std::string LogicalPredicate::to_string(const Corpus2::Tagset& tagset) const +{ + std::string s(operator_name(tagset)); + s.append("("); + BoolFunctionPtrVector::const_iterator it = expressions_->begin(); + while(it != expressions_->end()) { + s.append((*it)->to_string(tagset)); + if(++it != expressions_->end()) { + s.append(", "); + } + } + s.append(")"); + return s; +} + +std::string LogicalPredicate::to_raw_string() const +{ + std::string s(raw_operator_name()); + s.append("("); + BoolFunctionPtrVector::const_iterator it = expressions_->begin(); + while(it != expressions_->end()) { + s.append((*it)->to_raw_string()); + if(++it != expressions_->end()) { + s.append(", "); + } + } + s.append(")"); + return s; +} + +} /* end ns Wccl */ diff --git a/libwccl/ops/logicalpredicate.h b/libwccl/ops/logicalpredicate.h new file mode 100644 index 0000000..60427e3 --- /dev/null +++ b/libwccl/ops/logicalpredicate.h @@ -0,0 +1,48 @@ +#ifndef LOGICALPREDICATE_H +#define LOGICALPREDICATE_H + +#include <vector> +#include <boost/shared_array.hpp> +#include <boost/assert.hpp> +#include <libcorpus2/tagset.h> + +#include <libwccl/ops/predicate.h> + +namespace Wccl { +/** + * Abstract base class for predicates which are logical functions + * (over any number of arguments) + */ +class LogicalPredicate : public Predicate { +public: + typedef boost::shared_ptr<Function<Bool> > BoolFunctionPtr; + typedef std::vector<BoolFunctionPtr> BoolFunctionPtrVector; + + LogicalPredicate(const boost::shared_ptr<BoolFunctionPtrVector>& expressions) + : expressions_(expressions) + { + BOOST_ASSERT(expressions_); + BOOST_ASSERT(expressions_->size() > 0); + } + + /** + * String representation of the logical predicate, realised by default + * as "operator_name(expr1_string, ..., exprn_string)" + */ + virtual std::string to_string(const Corpus2::Tagset& tagset) const; + + /** + * String representation of the logical predicate, realised by default + * as "raw_operator_name(raw_expr1_string, ..., raw_exprn_string)" + * (this version doesn't require tagset, but may be incomplete and/or + * contain internal info) + */ + virtual std::string to_raw_string() const; + +protected: + const boost::shared_ptr<BoolFunctionPtrVector> expressions_; +}; + +} /* end ns Wccl */ + +#endif // LOGICALPREDICATE_H -- GitLab