Skip to main content

visi_core/core/
shared_vec.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use std::ops::{Deref, DerefMut};
3use std::sync::Arc;
4
5/// A `Vec` behind an [`Arc`], cheap to clone and copy-on-write to mutate.
6///
7/// The engine clones whole sheets freely -- to build a compilation context, to
8/// snapshot state -- and most of those clones never write. Sharing the backing
9/// buffer makes that cheap; the first mutation through [`DerefMut`] calls
10/// `Arc::make_mut` and takes a private copy if anyone else still holds one.
11///
12/// Derefs to `[T]` and `Vec<T>`, so it is used exactly like a `Vec`.
13#[derive(Debug, Clone)]
14pub struct SharedVec<T>(Arc<Vec<T>>);
15
16impl<T> SharedVec<T> {
17    /// An empty `SharedVec`.
18    pub fn new() -> Self {
19        Self(Arc::new(Vec::new()))
20    }
21}
22
23impl<T> Default for SharedVec<T> {
24    fn default() -> Self {
25        Self(Arc::new(Vec::new()))
26    }
27}
28
29impl<T> Deref for SharedVec<T> {
30    type Target = Vec<T>;
31
32    fn deref(&self) -> &Self::Target {
33        &self.0
34    }
35}
36
37impl<T: Clone> DerefMut for SharedVec<T> {
38    fn deref_mut(&mut self) -> &mut Self::Target {
39        Arc::make_mut(&mut self.0)
40    }
41}
42
43impl<T: Serialize> Serialize for SharedVec<T> {
44    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
45    where
46        S: Serializer,
47    {
48        self.0.serialize(serializer)
49    }
50}
51
52impl<'de, T: Deserialize<'de>> Deserialize<'de> for SharedVec<T> {
53    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54    where
55        D: Deserializer<'de>,
56    {
57        let vec = Vec::<T>::deserialize(deserializer)?;
58        Ok(Self(Arc::new(vec)))
59    }
60}
61
62impl<T> From<Vec<T>> for SharedVec<T> {
63    fn from(v: Vec<T>) -> Self {
64        Self(Arc::new(v))
65    }
66}
67
68impl<T: PartialEq> PartialEq for SharedVec<T> {
69    fn eq(&self, other: &Self) -> bool {
70        Arc::ptr_eq(&self.0, &other.0) || self.0 == other.0
71    }
72}
73
74impl<T: Eq> Eq for SharedVec<T> {}
75
76impl<T> std::iter::FromIterator<T> for SharedVec<T> {
77    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
78        Self(Arc::new(iter.into_iter().collect()))
79    }
80}
81
82impl<'a, T> IntoIterator for &'a SharedVec<T> {
83    type Item = &'a T;
84    type IntoIter = std::slice::Iter<'a, T>;
85
86    fn into_iter(self) -> Self::IntoIter {
87        self.0.iter()
88    }
89}
90
91impl<'a, T: Clone> IntoIterator for &'a mut SharedVec<T> {
92    type Item = &'a mut T;
93    type IntoIter = std::slice::IterMut<'a, T>;
94
95    fn into_iter(self) -> Self::IntoIter {
96        Arc::make_mut(&mut self.0).iter_mut()
97    }
98}