use crate::core::{Blob, Id, PlacedPoint, Point};
pub type PlaceResult<T> = Result<T, PlaceError>;
#[derive(Debug, Clone, PartialEq)]
pub enum PlaceError {
DimensionalityMismatch { expected: usize, got: usize },
CapacityExceeded,
DuplicateId(Id),
StorageError(String),
}
impl std::fmt::Display for PlaceError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PlaceError::DimensionalityMismatch { expected, got } => {
write!(f, "Dimensionality mismatch: expected {}, got {}", expected, got)
}
PlaceError::CapacityExceeded => write!(f, "Storage capacity exceeded"),
PlaceError::DuplicateId(id) => write!(f, "Duplicate ID: {}", id),
PlaceError::StorageError(msg) => write!(f, "Storage error: {}", msg),
}
}
}
impl std::error::Error for PlaceError {}
pub trait Place: Send + Sync {
fn place(&mut self, point: Point, blob: Blob) -> PlaceResult<Id>;
fn place_with_id(&mut self, id: Id, point: Point, blob: Blob) -> PlaceResult<()>;
fn remove(&mut self, id: Id) -> Option<PlacedPoint>;
fn get(&self, id: Id) -> Option<&PlacedPoint>;
fn contains(&self, id: Id) -> bool {
self.get(id).is_some()
}
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn iter(&self) -> Box<dyn Iterator<Item = &PlacedPoint> + '_>;
fn size_bytes(&self) -> usize;
fn clear(&mut self);
}