flams_utils/
vecmap.rs

1use std::fmt::Debug;
2
3#[derive(Clone, Hash, Eq)]
4#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5pub struct VecMap<K, V>(pub Vec<(K, V)>);
6
7impl<K, V, K2, V2> PartialEq<VecMap<K2, V2>> for VecMap<K, V>
8where
9    K: PartialEq<K2>,
10    V: PartialEq<V2>,
11{
12    fn eq(&self, other: &VecMap<K2, V2>) -> bool {
13        self.0.len() == other.0.len()
14            && self
15                .iter()
16                .zip(other.iter())
17                .all(|((k1, v1), (k2, v2))| k1 == k2 && v1 == v2)
18    }
19}
20
21impl<K, V> Default for VecMap<K, V> {
22    fn default() -> Self {
23        Self(Vec::new())
24    }
25}
26impl<K, V> FromIterator<(K, V)> for VecMap<K, V> {
27    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
28        Self(iter.into_iter().collect())
29    }
30}
31impl<K: Debug, V: Debug> Debug for VecMap<K, V> {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        f.debug_map()
34            .entries(self.0.iter().map(|(k, v)| (k, v)))
35            .finish()
36    }
37}
38impl<K, V> VecMap<K, V> {
39    #[must_use]
40    pub const fn new() -> Self {
41        Self(Vec::new())
42    }
43    pub fn get<E: ?Sized>(&self, key: &E) -> Option<&V>
44    where
45        for<'a> &'a E: PartialEq<&'a K>,
46    {
47        self.0.iter().find(|(k, _)| key == k).map(|(_, v)| v)
48    }
49    pub fn get_mut<E: ?Sized>(&mut self, key: &E) -> Option<&mut V>
50    where
51        for<'a> &'a E: PartialEq<&'a K>,
52    {
53        self.0.iter_mut().find(|(k, _)| key == k).map(|(_, v)| v)
54    }
55    pub fn get_mut_index(&mut self, i: usize) -> Option<&mut (K, V)> {
56        self.0.get_mut(i)
57    }
58    pub fn get_or_insert_mut(&mut self, key: K, value: impl FnOnce() -> V) -> &mut V
59    where
60        K: PartialEq,
61    {
62        let ret = if let Some((i, _)) = self.0.iter().enumerate().find(|(_, (k, _))| k == &key) {
63            i
64        } else {
65            self.0.push((key, value()));
66            self.0.len() - 1
67        };
68        &mut self.0[ret].1
69    }
70    pub fn insert(&mut self, key: K, value: V)
71    where
72        K: PartialEq,
73    {
74        match self.0.iter_mut().find(|(k, _)| k == &key) {
75            Some((_, v)) => *v = value,
76            None => self.0.push((key, value)),
77        };
78    }
79    pub fn remove<E: ?Sized>(&mut self, key: &E) -> Option<V>
80    where
81        for<'a> &'a E: PartialEq<&'a K>,
82    {
83        let index = self.0.iter().position(|(k, _)| key == k)?;
84        Some(self.0.remove(index).1)
85    }
86    pub fn remove_index(&mut self, i: usize) -> (K, V) {
87        self.0.remove(i)
88    }
89
90    #[inline]
91    #[must_use]
92    pub fn is_empty(&self) -> bool {
93        self.0.is_empty()
94    }
95    pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
96        self.0.iter().map(|(k, v)| (k, v))
97    }
98    pub fn contains_key<E: ?Sized>(&self, key: &E) -> bool
99    where
100        for<'a> &'a E: PartialEq<&'a K>,
101    {
102        self.0.iter().any(|(k, _)| key == k)
103    }
104}
105impl<K, V> IntoIterator for VecMap<K, V> {
106    type Item = (K, V);
107    type IntoIter = std::vec::IntoIter<Self::Item>;
108    fn into_iter(self) -> Self::IntoIter {
109        self.0.into_iter()
110    }
111}
112
113impl<K, V> From<Vec<(K, V)>> for VecMap<K, V> {
114    fn from(v: Vec<(K, V)>) -> Self {
115        Self(v)
116    }
117}
118
119#[derive(Clone, Hash, Eq)]
120#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
121pub struct VecSet<V>(pub Vec<V>);
122
123impl<V, V2> PartialEq<VecSet<V2>> for VecSet<V>
124where
125    V: PartialEq<V2>,
126{
127    fn eq(&self, other: &VecSet<V2>) -> bool {
128        self.0.len() == other.0.len() && self.iter().zip(other.iter()).all(|(v1, v2)| v1 == v2)
129    }
130}
131
132impl<V> Default for VecSet<V> {
133    #[inline]
134    fn default() -> Self {
135        Self(Vec::new())
136    }
137}
138impl<V: PartialEq<V>> FromIterator<V> for VecSet<V> {
139    fn from_iter<T: IntoIterator<Item = V>>(iter: T) -> Self {
140        let mut v = Vec::new();
141        for i in iter {
142            if !v.contains(&i) {
143                v.push(i);
144            }
145        }
146        Self(v)
147    }
148}
149impl<V: Debug> Debug for VecSet<V> {
150    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
151        f.debug_list().entries(self.0.iter()).finish()
152    }
153}
154impl<V> IntoIterator for VecSet<V> {
155    type Item = V;
156    type IntoIter = std::vec::IntoIter<Self::Item>;
157    #[inline]
158    fn into_iter(self) -> Self::IntoIter {
159        self.0.into_iter()
160    }
161}
162
163impl<V: PartialEq<V>> From<Vec<V>> for VecSet<V> {
164    #[inline]
165    fn from(v: Vec<V>) -> Self {
166        v.into_iter().collect()
167    }
168}
169
170impl<V> VecSet<V> {
171    #[inline]
172    pub fn iter(&self) -> impl Iterator<Item = &V> {
173        self.0.iter()
174    }
175    pub fn insert(&mut self, value: V)
176    where
177        V: PartialEq,
178    {
179        if !self.0.contains(&value) {
180            self.0.push(value);
181        }
182    }
183    #[inline]
184    #[must_use]
185    pub fn is_empty(&self) -> bool {
186        self.0.is_empty()
187    }
188    #[inline]
189    #[must_use]
190    pub const fn new() -> Self {
191        Self(Vec::new())
192    }
193}
194
195impl<V:Clone> VecSet<V> {
196    pub fn insert_clone(&mut self, value: &V)
197    where
198        V: PartialEq {
199            if !self.0.contains(value) {
200                self.0.push(value.clone());
201            }
202    }
203}
204
205
206
207#[derive(Clone, Hash, Eq)]
208#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
209pub struct OrdSet<V:Ord>(pub Vec<V>);
210
211impl<V, V2:Ord> PartialEq<OrdSet<V2>> for OrdSet<V>
212where
213    V: Ord+PartialEq<V2>,
214{
215    fn eq(&self, other: &OrdSet<V2>) -> bool {
216        self.0.len() == other.0.len() && self.iter().zip(other.iter()).all(|(v1, v2)| v1 == v2)
217    }
218}
219
220impl<V:Ord> Default for OrdSet<V> {
221    #[inline]
222    fn default() -> Self {
223        Self(Vec::new())
224    }
225}
226impl<V: PartialEq<V>+Ord> FromIterator<V> for OrdSet<V> {
227    fn from_iter<T: IntoIterator<Item = V>>(iter: T) -> Self {
228        let mut v = Vec::new();
229        for elem in iter {
230            if let Err(i) = v.binary_search(&elem) {
231                v.insert(i, elem);
232            }
233        }
234        Self(v)
235    }
236}
237impl<V: Debug+Ord> Debug for OrdSet<V> {
238    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
239        f.debug_list().entries(self.0.iter()).finish()
240    }
241}
242impl<V:Ord> IntoIterator for OrdSet<V> {
243    type Item = V;
244    type IntoIter = std::vec::IntoIter<Self::Item>;
245    #[inline]
246    fn into_iter(self) -> Self::IntoIter {
247        self.0.into_iter()
248    }
249}
250
251impl<V: PartialEq<V>+Ord> From<Vec<V>> for OrdSet<V> {
252    #[inline]
253    fn from(v: Vec<V>) -> Self {
254        v.into_iter().collect()
255    }
256}
257
258impl<V:Ord> OrdSet<V> {
259    #[inline]
260    pub fn iter(&self) -> impl Iterator<Item = &V> {
261        self.0.iter()
262    }
263    pub fn insert(&mut self, value: V)
264    where
265        V: PartialEq,
266    {
267        if let Err(i) = self.0.binary_search(&value) {
268            self.0.insert(i, value);
269        }
270    }
271    #[inline]
272    #[must_use]
273    pub fn is_empty(&self) -> bool {
274        self.0.is_empty()
275    }
276    #[inline]
277    #[must_use]
278    pub const fn new() -> Self {
279        Self(Vec::new())
280    }
281
282    #[inline]
283    #[must_use]
284    pub fn contains(&self,v:&V) -> bool {
285        self.0.binary_search(v).is_ok()
286    }
287}
288
289impl<V:Ord+Clone> OrdSet<V> {
290    pub fn insert_clone(&mut self, value: &V) {
291        if let Err(i) = self.0.binary_search(value) {
292            self.0.insert(i, value.clone());
293        }
294    }
295}