void debug_traverse(const Node * node) const { if (!node) return; std::cout << node->bounds << ", is leaf " << node->is_leaf() << std::endl; if (node->left) debug_traverse(node->left); if (node->right) debug_traverse(node->right); }
inline bool select_next_ip(operation_type operation, Turn& turn, segment_identifier const& seg_id, Iterator& selected) { if (turn.discarded) { return false; } bool has_tp = false; selected = boost::end(turn.operations); for (Iterator it = boost::begin(turn.operations); it != boost::end(turn.operations); ++it) { if (it->visited.started()) { selected = it; //std::cout << " RETURN"; return true; } // In some cases there are two alternatives. // For "ii", take the other one (alternate) // UNLESS the other one is already visited // For "uu", take the same one (see above); // For "cc", take either one, but if there is a starting one, // take that one. if ( (it->operation == operation_continue && (! has_tp || it->visited.started() ) ) || (it->operation == operation && ! it->visited.finished() && (! has_tp || select_source(operation, it->seg_id.source_index, seg_id.source_index) ) ) ) { selected = it; debug_traverse(turn, *it, " Candidate"); has_tp = true; } } if (has_tp) { debug_traverse(turn, *selected, " Accepted"); } return has_tp; }