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