Files
gpx.studio/gpx-rs/src/gpx/segment.rs
T

61 lines
1.3 KiB
Rust
Raw Normal View History

2026-09-18 09:50:04 +02:00
use std::rc::Rc;
2026-09-18 09:03:51 +02:00
use crate::gpx::TrackPoint;
#[derive(Debug, Default)]
pub struct TrackSegment {
2026-09-18 09:50:04 +02:00
pub chunks: Vec<Rc<TrackPointChunk>>,
2026-09-18 09:03:51 +02:00
}
2026-09-21 23:49:57 +02:00
impl TrackSegment {
pub fn iter(&self) -> TrackSegmentIterator {
TrackSegmentIterator::new(self)
}
}
pub struct TrackSegmentIterator<'a> {
trkseg: &'a TrackSegment,
chunk_idx: usize,
trkpt_idx: usize,
}
impl<'a> TrackSegmentIterator<'a> {
pub fn new(trkseg: &'a TrackSegment) -> Self {
Self {
trkseg,
chunk_idx: 0,
trkpt_idx: 0,
}
}
}
impl<'a> Iterator for TrackSegmentIterator<'a> {
type Item = &'a TrackPoint;
fn next(&mut self) -> Option<Self::Item> {
if self.chunk_idx >= self.trkseg.chunks.len() {
None
} else if self.trkpt_idx >= self.trkseg.chunks[self.chunk_idx].trkpt.len() {
self.chunk_idx += 1;
self.trkpt_idx = 0;
self.next()
} else {
self.trkpt_idx += 1;
Some(&self.trkseg.chunks[self.chunk_idx].trkpt[self.trkpt_idx - 1])
}
}
}
2026-09-18 09:03:51 +02:00
static MAX_CHUNK_SIZE: usize = 4096;
#[derive(Debug, Default)]
pub struct TrackPointChunk {
pub trkpt: Vec<TrackPoint>,
}
2026-09-18 09:50:04 +02:00
impl TrackPointChunk {
pub fn is_full(&self) -> bool {
self.trkpt.len() == MAX_CHUNK_SIZE
}
}