Files
gpx.studio/gpx-rs/src/algorithm/smooth.rs
T

50 lines
1.4 KiB
Rust
Raw Normal View History

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
}
}};
}