visi_core/core/
shared_vec.rs1use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use std::ops::{Deref, DerefMut};
5use std::sync::Arc;
6
7#[derive(Debug, Clone)]
16pub struct SharedVec<T>(Arc<Vec<T>>);
17
18impl<T> SharedVec<T> {
19 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}