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