use std::sync::Arc; use std::fmt; use std::ops::Deref; #[derive(Clone)] pub struct ArcVec { data: Arc>, offset: usize, length: usize, } impl ArcVec { pub fn new(data: Vec) -> ArcVec { let length = data.len(); ArcVec { data: Arc::new(data), offset: 0, length: length } } pub fn offset(mut self, offset: usize) -> ArcVec { assert!(offset <= self.length); self.offset += offset; self.length -= offset; self } pub fn limit(mut self, length: usize) -> ArcVec { assert!(length <= self.length); self.length = length; self } } impl Deref for ArcVec { type Target = [T]; fn deref(&self) -> &[T] { &self.data[self.offset..self.offset+self.length] } } impl fmt::Debug for ArcVec { fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { self.deref().fmt(formatter) } }