2026-09-21 23:49:57 +02:00
|
|
|
#[macro_export]
|
|
|
|
|
macro_rules! for_each_window {
|
|
|
|
|
(
|
2026-09-23 19:53:39 +02:00
|
|
|
$trkseg:expr,
|
2026-09-21 23:49:57 +02:00
|
|
|
$left:expr,
|
|
|
|
|
$right:expr,
|
|
|
|
|
$window:expr,
|
|
|
|
|
|$a:ident, $b:ident| $distance:expr,
|
|
|
|
|
|$i:ident, $l:ident, $r:ident| $body:block,
|
|
|
|
|
) => {{
|
2026-09-23 19:53:39 +02:00
|
|
|
let mut start = $left.unwrap_or_default();
|
|
|
|
|
let mut cur = $left;
|
|
|
|
|
while let Some(idx) = cur {
|
|
|
|
|
// advance left if needed
|
|
|
|
|
while start != idx && {
|
2026-09-21 23:49:57 +02:00
|
|
|
let $a = start;
|
2026-09-23 19:53:39 +02:00
|
|
|
let $b = idx;
|
2026-09-21 23:49:57 +02:00
|
|
|
$distance
|
2026-09-23 19:53:39 +02:00
|
|
|
} > $window {
|
|
|
|
|
if let Some(next) = $trkseg.next_index(Some(start)) {
|
|
|
|
|
if next == idx {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
start = next;
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
2026-09-21 23:49:57 +02:00
|
|
|
}
|
2026-09-23 19:53:39 +02:00
|
|
|
// advance right if needed
|
|
|
|
|
let mut end = idx;
|
|
|
|
|
while let Some(next) = $trkseg.next_index(Some(end)) {
|
|
|
|
|
if {
|
|
|
|
|
let $a = idx;
|
|
|
|
|
let $b = end;
|
|
|
|
|
$distance
|
|
|
|
|
} > $window {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
end = next;
|
2026-09-21 23:49:57 +02:00
|
|
|
}
|
2026-09-23 19:53:39 +02:00
|
|
|
// apply body
|
|
|
|
|
let $i = idx;
|
2026-09-21 23:49:57 +02:00
|
|
|
let $l = start;
|
2026-09-23 19:53:39 +02:00
|
|
|
let $r = end;
|
2026-09-21 23:49:57 +02:00
|
|
|
$body
|
2026-09-23 19:53:39 +02:00
|
|
|
// go next
|
|
|
|
|
cur = $trkseg.next_index(cur);
|
2026-09-21 23:49:57 +02:00
|
|
|
}
|
|
|
|
|
}};
|
|
|
|
|
}
|