Skip to main content

visi_core/core/
shared_vec.rs

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