use bincode::{Decode, Encode};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)]
pub struct SpaceId(pub u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Encode, Decode)]
pub struct RevisionId(pub u64);
impl RevisionId {
pub const ZERO: RevisionId = RevisionId(0);
pub fn next(self) -> RevisionId {
RevisionId(self.0 + 1)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)]
pub struct DimensionVector {
pub coords: Vec<u32>,
}
impl DimensionVector {
pub fn new(coords: Vec<u32>) -> Self {
assert!(
coords.len() <= 16,
"DimensionVector exceeds maximum of 16 dimensions"
);
Self { coords }
}
pub fn dims(&self) -> usize {
self.coords.len()
}
pub fn coord(&self, idx: usize) -> u32 {
self.coords[idx]
}
pub fn within(&self, min: &DimensionVector, max: &DimensionVector) -> bool {
assert_eq!(self.dims(), min.dims());
assert_eq!(self.dims(), max.dims());
self.coords
.iter()
.zip(min.coords.iter().zip(max.coords.iter()))
.all(|(&v, (&lo, &hi))| v >= lo && v <= hi)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Encode, Decode)]
pub struct Address {
pub space: SpaceId,
pub point: DimensionVector,
}
impl Address {
pub fn new(space: SpaceId, point: DimensionVector) -> Self {
Self { space, point }
}
}