84 Position_ query_start,
88 std::vector<Index_>& matches)
91 if (subject.root_children == 0) {
128 Position_ query_width = query_end - query_start;
133 auto find_first_child = [&](Index_ children_start, Index_ children_end) -> Index_ {
134 auto ebegin = subject.ends.begin();
135 auto estart = ebegin + children_start;
136 auto eend = ebegin + children_end;
137 return std::lower_bound(estart, eend, query_end) - ebegin;
140 auto is_finished = [&](Position_ subject_start) ->
bool {
141 return subject_start > query_start;
144 Index_ root_child_at = find_first_child(0, subject.root_children);
146 workspace.history.clear();
148 Index_ current_subject;
149 if (workspace.history.empty()) {
150 if (root_child_at == subject.root_children || is_finished(subject.starts[root_child_at])) {
153 current_subject = root_child_at;
156 auto& current_state = workspace.history.back();
157 if (current_state.child_at == current_state.child_end || is_finished(subject.starts[current_state.child_at])) {
158 workspace.history.pop_back();
161 current_subject = current_state.child_at;
162 ++(current_state.child_at);
165 const auto& current_node = subject.nodes[current_subject];
169 bool add_self =
true;
170 if (params.
max_gap.has_value()) {
171 auto subject_start = subject.starts[current_subject];
172 auto subject_end = subject.ends[current_subject];
173 auto subject_width = subject_end - subject_start;
174 if (subject_width - query_width > *(params.
max_gap)) {
180 matches.push_back(current_node.id);
184 if (current_node.duplicates_start != current_node.duplicates_end) {
185 matches.insert(matches.end(), subject.duplicates.begin() + current_node.duplicates_start, subject.duplicates.begin() + current_node.duplicates_end);
189 if (current_node.children_start != current_node.children_end) {
190 Index_ start_pos = find_first_child(current_node.children_start, current_node.children_end);
191 if (start_pos != current_node.children_end) {
192 workspace.history.emplace_back(start_pos, current_node.children_end);
void overlaps_within(const Nclist< Index_, Position_ > &subject, Position_ query_start, Position_ query_end, const OverlapsWithinParameters< Position_ > ¶ms, OverlapsWithinWorkspace< Index_ > &workspace, std::vector< Index_ > &matches)
Definition overlaps_within.hpp:82