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#[derive(Debug, Clone)]
7pub struct SharedVec<T>(Arc<Vec<T>>);
8
9impl<T> SharedVec<T> {
10    /// An empty `SharedVec`.
11    pub fn new() -> Self {
12        Self(Arc::new(Vec::new()))
13    }
14}
15
16impl<T> Default for SharedVec<T> {
17    fn default() -> Self {
18        Self(Arc::new(Vec::new()))
19    }
20}
21
22impl<T> Deref for SharedVec<T> {
23    type Target = Vec<T>;
24
25    fn deref(&self) -> &Self::Target {
26        &self.0
27    }
28}
29
30impl<T: Clone> DerefMut for SharedVec<T> {
31    fn deref_mut(&mut self) -> &mut Self::Target {
32        Arc::make_mut(&mut self.0)
33    }
34}
35
36impl<T: Serialize> Serialize for SharedVec<T> {
37    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
38    where
39        S: Serializer,
40    {
41        self.0.serialize(serializer)
42    }
43}
44
45impl<'de, T: Deserialize<'de>> Deserialize<'de> for SharedVec<T> {
46    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
47    where
48        D: Deserializer<'de>,
49    {
50        let vec = Vec::<T>::deserialize(deserializer)?;
51        Ok(Self(Arc::new(vec)))
52    }
53}
54
55impl<T> From<Vec<T>> for SharedVec<T> {
56    fn from(v: Vec<T>) -> Self {
57        Self(Arc::new(v))
58    }
59}
60
61impl<T: PartialEq> PartialEq for SharedVec<T> {
62    fn eq(&self, other: &Self) -> bool {
63        Arc::ptr_eq(&self.0, &other.0) || self.0 == other.0
64    }
65}
66
67impl<T: Eq> Eq for SharedVec<T> {}
68
69impl<T> std::iter::FromIterator<T> for SharedVec<T> {
70    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
71        Self(Arc::new(iter.into_iter().collect()))
72    }
73}
74
75impl<'a, T> IntoIterator for &'a SharedVec<T> {
76    type Item = &'a T;
77    type IntoIter = std::slice::Iter<'a, T>;
78
79    fn into_iter(self) -> Self::IntoIter {
80        self.0.iter()
81    }
82}
83
84impl<'a, T: Clone> IntoIterator for &'a mut SharedVec<T> {
85    type Item = &'a mut T;
86    type IntoIter = std::slice::IterMut<'a, T>;
87
88    fn into_iter(self) -> Self::IntoIter {
89        Arc::make_mut(&mut self.0).iter_mut()
90    }
91}