diff --git a/libwccl/ops/match/applyoperator.cpp b/libwccl/ops/match/applyoperator.cpp index e40ddd8d8764363f7ed13ea270f84efc3048bd4e..cfecd52112358e6187939b69044f51b65b7fd5e4 100644 --- a/libwccl/ops/match/applyoperator.cpp +++ b/libwccl/ops/match/applyoperator.cpp @@ -5,26 +5,24 @@ namespace Wccl { ApplyOperator::ApplyOperator( - const VariableAccessor<Position>& cur_iter_pos, const VariableAccessor<Match>& matches, const boost::shared_ptr<const MatchOperator>& match_op, - const std::vector<boost::shared_ptr<const MatchAction> >& actions, - const std::vector<boost::shared_ptr<const Function<Bool> > >& conditions) - : _cur_iter_pos(cur_iter_pos), - _matches(matches), + const boost::shared_ptr<const std::vector<boost::shared_ptr<MatchAction> > >& actions, + const boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > >& conditions) + : _matches(matches), _match_op(match_op), _actions(actions), _conditions(conditions) { BOOST_ASSERT(_match_op); - BOOST_ASSERT(actions.size() > 0); + BOOST_ASSERT(actions->size() > 0); } void ApplyOperator::execute(const ActionExecContext &context) const { - boost::shared_ptr<Position> iter_pos = context.variables()->get_fast(_cur_iter_pos); + boost::shared_ptr<Position> iter_pos(new Position(0)); boost::shared_ptr<MatchVector> matches = - boost::dynamic_pointer_cast<MatchVector>(context.variables()->get_fast(_matches)); + boost::dynamic_pointer_cast<MatchVector>(context.variables()->get_fast(_matches)); while(context.sentence_context().is_current_inside()) { // Set initial values of $_ and $m:_M variables for this iteration and launch the match: iter_pos->set_value(0); @@ -32,12 +30,12 @@ void ApplyOperator::execute(const ActionExecContext &context) const boost::shared_ptr<Match> match = _match_op->apply(iter_pos, context); // Execute the actions only if match isn't empty and all post-conditions are met: bool should_act = !match->empty(); - for(size_t i = 0; should_act && i < _conditions.size(); ++i) { - should_act = _conditions[i]->apply(context)->get_value(); + for(size_t i = 0; should_act && i < _conditions->size(); ++i) { + should_act = (*_conditions)[i]->apply(context)->get_value(); } if (should_act) { matches->append(match); // the match goes to $m:_M[0] - foreach (const boost::shared_ptr<const MatchAction>& action, _actions) { + foreach (const boost::shared_ptr<MatchAction>& action, *_actions) { action->execute(context); } } @@ -55,22 +53,22 @@ std::string ApplyOperator::to_string(const Corpus2::Tagset& tagset) const { std::ostringstream ostream; ostream << name() << "(" << _match_op->to_string(tagset) << ", "; - if (!_conditions.empty()) { + if (!_conditions->empty()) { ostream << "cond("; - for(size_t i = 0; i < _conditions.size(); ++i) { + for(size_t i = 0; i < _conditions->size(); ++i) { if (i != 0) { ostream << ", "; } - ostream << _conditions[i]->to_string(tagset); + ostream << (*_conditions)[i]->to_string(tagset); } ostream << "), "; } ostream << "actions("; - for(size_t i = 0; i < _actions.size(); ++i) { + for(size_t i = 0; i < _actions->size(); ++i) { if (i != 0) { ostream << ", "; } - ostream << _actions[i]->to_string(tagset); + ostream << (*_actions)[i]->to_string(tagset); } ostream << "))"; return ostream.str(); @@ -79,22 +77,22 @@ std::string ApplyOperator::to_string(const Corpus2::Tagset& tagset) const std::ostream& ApplyOperator::write_to(std::ostream &ostream) const { ostream << name() << "(" << *_match_op << ", "; - if (!_conditions.empty()) { + if (!_conditions->empty()) { ostream << "cond("; - for(size_t i = 0; i < _conditions.size(); ++i) { + for(size_t i = 0; i < _conditions->size(); ++i) { if (i != 0) { ostream << ", "; } - ostream << *_conditions[i]; + ostream << *(*_conditions)[i]; } ostream << "), "; } ostream << "actions("; - for(size_t i = 0; i < _actions.size(); ++i) { + for(size_t i = 0; i < (*_actions).size(); ++i) { if (i != 0) { ostream << ", "; } - ostream << *_actions[i]; + ostream << *(*_actions)[i]; } ostream << "))"; return ostream; diff --git a/libwccl/ops/match/applyoperator.h b/libwccl/ops/match/applyoperator.h index e160a40a4259416e4712247c49d6587ebf44e09f..65db7e946d6cbdb2df2c4456e9e6dbef86109163 100644 --- a/libwccl/ops/match/applyoperator.h +++ b/libwccl/ops/match/applyoperator.h @@ -1,11 +1,12 @@ #ifndef LIBWCCL_OPS_MATCH_APPLYOPERATOR_H #define LIBWCCL_OPS_MATCH_APPLYOPERATOR_H -#include <libwccl/ops/function.h> +#include <libwccl/ops/functions/bool/predicates/logicalpredicate.h> #include <libwccl/ops/match/matchoperator.h> #include <libwccl/ops/match/matchaction.h> + namespace Wccl { /** @@ -14,20 +15,19 @@ namespace Wccl { class ApplyOperator : public Expression { public: - + typedef LogicalPredicate::BoolFunctionPtrVector BoolFunctionPtrVector; /** - * @param cur_iter_pos Accessor to the "$_" variable * @param matches Accessor to the "$m:_M" variable * @param match_op "match" operator for apply * @param actions "actions" section of apply, should not be empty * @param conditions "cond" section of apply, empty by default */ ApplyOperator( - const VariableAccessor<Position>& cur_iter_pos, const VariableAccessor<Match>& matches, const boost::shared_ptr<const MatchOperator>& match_op, - const std::vector<boost::shared_ptr<const MatchAction> >& actions, - const std::vector<boost::shared_ptr<const Function<Bool> > >& conditions = (std::vector<boost::shared_ptr<const Function<Bool> > >())); + const boost::shared_ptr<const std::vector<boost::shared_ptr<MatchAction> > >& actions, + const boost::shared_ptr<const BoolFunctionPtrVector>& conditions + = boost::shared_ptr<const BoolFunctionPtrVector>(new BoolFunctionPtrVector())); /** * @returns Name of the operator. @@ -58,11 +58,10 @@ protected: virtual void execute(const ActionExecContext &context) const; private: - const VariableAccessor<Position> _cur_iter_pos; const VariableAccessor<Match> _matches; const boost::shared_ptr<const MatchOperator> _match_op; - const std::vector<boost::shared_ptr<const MatchAction> > _actions; - const std::vector<boost::shared_ptr<const Function<Bool> > > _conditions; + const boost::shared_ptr<const std::vector<boost::shared_ptr<MatchAction> > > _actions; + const boost::shared_ptr<const std::vector<boost::shared_ptr<Function<Bool> > > > _conditions; }; } /* end ns Wccl */