use std::collections::BTreeMap;
use re_chunk::TimelineName;
use re_entity_db::EntityDb;
use re_log_types::{AbsoluteTimeRange, TimeInt, Timeline};
pub trait TimeControlDb {
fn prev_time_on_timeline(&self, timeline: &TimelineName, time: TimeInt) -> Option<TimeInt>;
fn next_time_on_timeline(&self, timeline: &TimelineName, time: TimeInt) -> Option<TimeInt>;
fn time_range_for(&self, timeline: &TimelineName) -> Option<AbsoluteTimeRange>;
fn timelines(&self) -> BTreeMap<TimelineName, Timeline>;
fn num_temporal_rows_on_timeline(&self, timeline: &TimelineName) -> u64;
}
impl TimeControlDb for EntityDb {
fn prev_time_on_timeline(&self, timeline: &TimelineName, time: TimeInt) -> Option<TimeInt> {
self.prev_time_on_timeline(timeline, time)
}
fn next_time_on_timeline(&self, timeline: &TimelineName, time: TimeInt) -> Option<TimeInt> {
self.next_time_on_timeline(timeline, time)
}
fn time_range_for(&self, timeline: &TimelineName) -> Option<AbsoluteTimeRange> {
self.time_range_for(timeline)
}
fn timelines(&self) -> BTreeMap<TimelineName, Timeline> {
self.timelines()
}
fn num_temporal_rows_on_timeline(&self, timeline: &TimelineName) -> u64 {
self.num_temporal_rows_on_timeline(timeline)
}
}
pub struct PreviewRecordingsDb<'a> {
pub recordings: &'a [&'a EntityDb],
}
impl TimeControlDb for PreviewRecordingsDb<'_> {
fn prev_time_on_timeline(&self, timeline: &TimelineName, offset: TimeInt) -> Option<TimeInt> {
self.recordings
.iter()
.filter_map(|rec| {
let range = rec.time_range_for(timeline)?;
let absolute = range.min + offset;
let prev_abs = rec.prev_time_on_timeline(timeline, absolute)?;
Some(prev_abs - range.min)
})
.max()
}
fn next_time_on_timeline(&self, timeline: &TimelineName, offset: TimeInt) -> Option<TimeInt> {
self.recordings
.iter()
.filter_map(|rec| {
let range = rec.time_range_for(timeline)?;
let absolute = range.min + offset;
let next_abs = rec.next_time_on_timeline(timeline, absolute)?;
Some(next_abs - range.min)
})
.min()
}
fn time_range_for(&self, timeline: &TimelineName) -> Option<AbsoluteTimeRange> {
let max_span = self
.recordings
.iter()
.filter_map(|rec| {
let range = rec.time_range_for(timeline)?;
Some(range.max - range.min)
})
.max()?;
Some(AbsoluteTimeRange::new(TimeInt::ZERO, max_span))
}
fn timelines(&self) -> BTreeMap<TimelineName, Timeline> {
self.recordings
.iter()
.flat_map(|rec| rec.timelines())
.collect()
}
fn num_temporal_rows_on_timeline(&self, timeline: &TimelineName) -> u64 {
self.recordings
.iter()
.map(|rec| rec.num_temporal_rows_on_timeline(timeline))
.sum()
}
}