use std::borrow::Cow;
use itertools::Either;
use re_chunk_store::external::re_chunk::{ChunkComponentIter, ChunkComponentSlicer};
use re_chunk_store::{Chunk, Span};
use re_log_types::{TimeInt, TimePoint, TimelineName};
use re_sdk_types::{Component, ComponentIdentifier, RowId};
use crate::ComponentMappingError;
#[derive(Debug, Clone)]
pub struct ChunksWithComponent<'chunk> {
pub chunks: Cow<'chunk, [Chunk]>,
pub component: ComponentIdentifier,
}
impl ChunksWithComponent<'_> {
#[inline]
pub fn is_empty(&self) -> bool {
self.chunks.is_empty()
}
#[inline]
pub fn iter(&self) -> impl Iterator<Item = ChunkWithComponent<'_>> {
self.chunks.iter().map(move |chunk| ChunkWithComponent {
chunk,
component: self.component,
})
}
#[inline]
pub fn empty(component: ComponentIdentifier) -> Self {
Self {
chunks: Cow::Borrowed(&[]),
component,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct ChunkWithComponent<'chunk> {
pub chunk: &'chunk Chunk,
pub component: ComponentIdentifier,
}
impl<'chunk> ChunkWithComponent<'chunk> {
#[inline]
pub fn iter_component_indices(
&self,
timeline: TimelineName,
) -> impl Iterator<Item = (TimeInt, RowId)> + 'chunk + use<'chunk> {
self.chunk.iter_component_indices(timeline, self.component)
}
#[inline]
pub fn iter_slices<S: ChunkComponentSlicer + 'chunk>(
&self,
) -> impl Iterator<Item = S::Item<'chunk>> + 'chunk + use<'chunk, S> {
self.chunk.iter_slices::<S>(self.component)
}
#[inline]
pub fn iter_component<C: Component>(
&self,
) -> ChunkComponentIter<C, impl Iterator<Item = Span<usize>> + 'chunk + use<'chunk, C>> {
self.chunk.iter_component::<C>(self.component)
}
#[inline]
pub fn iter_component_timepoints(
&self,
) -> impl Iterator<Item = TimePoint> + 'chunk + use<'chunk> {
self.chunk.iter_component_timepoints(self.component)
}
}
#[derive(Debug, Clone)]
pub struct MaybeChunksWithComponent<'chunk> {
pub maybe_chunks: Result<Cow<'chunk, [Chunk]>, ComponentMappingError>,
pub component: ComponentIdentifier,
}
impl MaybeChunksWithComponent<'_> {
#[inline]
pub fn iter(
&self,
mut reporter: impl FnMut(&ComponentMappingError),
) -> Either<
impl Iterator<Item = ChunkWithComponent<'_>>,
impl Iterator<Item = ChunkWithComponent<'_>>,
> {
match self.maybe_chunks.as_ref() {
Ok(chunks) => Either::Left(chunks.iter().map(move |chunk| ChunkWithComponent {
chunk,
component: self.component,
})),
Err(err) => {
reporter(err);
Either::Right(std::iter::empty())
}
}
}
#[inline]
pub fn empty(component: ComponentIdentifier) -> Self {
Self {
maybe_chunks: Ok(Cow::Borrowed(&[])),
component,
}
}
#[inline]
pub fn error(component: ComponentIdentifier, err: ComponentMappingError) -> Self {
Self {
maybe_chunks: Err(err),
component,
}
}
}
impl<'a> TryFrom<MaybeChunksWithComponent<'a>> for ChunksWithComponent<'a> {
type Error = ComponentMappingError;
#[inline]
fn try_from(value: MaybeChunksWithComponent<'a>) -> Result<Self, Self::Error> {
Ok(ChunksWithComponent {
chunks: value.maybe_chunks?,
component: value.component,
})
}
}
impl<'a> From<ChunksWithComponent<'a>> for MaybeChunksWithComponent<'a> {
#[inline]
fn from(ChunksWithComponent { chunks, component }: ChunksWithComponent<'a>) -> Self {
Self {
maybe_chunks: Ok(chunks),
component,
}
}
}