Skip to content
Snippets Groups Projects
Commit 2d404b3a authored by Adam Wardynski's avatar Adam Wardynski
Browse files

Reshuffling code a bit for some optimization.

parent 27614982
No related merge requests found
...@@ -28,30 +28,34 @@ std::string Iteration::to_raw_string() const ...@@ -28,30 +28,34 @@ std::string Iteration::to_raw_string() const
Iteration::BaseRetValPtr Iteration::apply_internal(const FunExecContext& context) const Iteration::BaseRetValPtr Iteration::apply_internal(const FunExecContext& context) const
{ {
const boost::shared_ptr<const Position>& range_begin = left_pos_expr_->apply(context); const boost::shared_ptr<Position>& iter_var =
const boost::shared_ptr<const Position>& range_end = right_pos_expr_->apply(context); context.variables()->get_fast(iter_var_acc_);
const boost::shared_ptr<Position>& iter_var = context.variables()->get_fast(iter_var_acc_);
const SentenceContext& sc = context.sentence_context(); const SentenceContext& sc = context.sentence_context();
// Get absolute values for left and right extremes of the range
int left = sc.get_abs_position(*range_begin);
int right = sc.get_abs_position(*range_end);
// Proceed only if range extremes are not "nowhere". // Proceed only if range extremes are not "nowhere".
if (left != Position::Nowhere && right != Position::Nowhere) { const boost::shared_ptr<const Position>& range_left =
// Trim range to sentence boundaries left_pos_expr_->apply(context);
if (left < 0) { if (range_left->get_value() != Position::Nowhere) {
left = 0; const boost::shared_ptr<const Position>& range_right =
} right_pos_expr_->apply(context);
if (right >= sc.size()) { if (range_right->get_value() != Position::Nowhere) {
right = sc.size() - 1; // Get absolute values for left and right extremes of the range.
} int right = sc.get_abs_position(*range_end);
// Proceed only if range isn't empty int left = sc.get_abs_position(*range_begin);
if (left <= right) { // Trim range to sentence boundaries
// Change range from absolute to relative and iterate if (left < 0) {
left -= sc.get_position(); left = 0;
right -= sc.get_position(); }
if (iterate(left, right, *iter_var, context)) { if (right >= sc.size()) {
return Predicate::True(context); right = sc.size() - 1;
}
// Proceed only if range isn't empty
if (left <= right) {
// Change range from absolute to relative and iterate
left -= sc.get_position();
right -= sc.get_position();
if (iterate(left, right, *iter_var, context)) {
return Predicate::True(context);
}
} }
} }
} }
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment