makepad_platform/
component_list.rs

1use std::{
2    collections::HashSet,
3    ops::{Deref, DerefMut, Index, IndexMut},
4};
5
6#[derive(Clone)]
7pub struct ComponentList<K, V> {
8    list: Vec<(K, V)>,
9    visible: HashSet<K>,
10}
11
12impl<K, V> Default for ComponentList<K, V> {
13    fn default() -> Self {
14        Self {
15            list: Vec::new(),
16            visible: HashSet::new(),
17        }
18    }
19}
20
21impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> ComponentList<K, V> {
22    pub fn retain_visible(&mut self) {
23        let visible = &self.visible;
24        self.list.retain(|(k, _)| visible.contains(k));
25        self.visible.clear();
26    }
27
28    pub fn retain_visible_and<CB>(&mut self, cb: CB)
29    where
30        CB: Fn(&K, &V) -> bool,
31    {
32        let visible = &self.visible;
33        self.list.retain(|(k, v)| visible.contains(k) || cb(k, v));
34        self.visible.clear();
35    }
36    pub fn push(&mut self, key: K, value: V) -> () {
37        self.visible.insert(key);
38        self.list.push((key, value));
39    }
40    pub fn len(&self) -> usize {
41        self.list.len()
42    }
43    pub fn with_capacity(capacity: usize) -> Self {
44        Self {
45            list: Vec::with_capacity(capacity),
46            visible: HashSet::new(),
47        }
48    }
49    pub fn extend(&mut self, iter: impl Iterator<Item = (K, V)>) {
50        for (k, v) in iter {
51            self.push(k, v)
52        }
53    }
54    pub fn pop(&mut self) -> Option<(K, V)> {
55        let item = self.list.pop();
56        match &item {
57            Some((k, _)) => {
58                self.visible.remove(k);
59            }
60            None => (),
61        }
62        item
63    }
64    pub fn get(&self, key: usize) -> Option<&(K, V)> {
65        self.list.get(key)
66    }
67    pub fn insert(&mut self, index: usize, item: (K, V)) {
68        self.visible.insert(item.0);
69        self.list.insert(index, item);
70    }
71}
72
73impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> Index<K> for ComponentList<K, V> {
74    type Output = V;
75
76    fn index(&self, index: K) -> &Self::Output {
77        self.list
78            .iter()
79            .find(|(k, _)| *k == index)
80            .map(|(_, v)| v)
81            .unwrap()
82    }
83}
84
85impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> IndexMut<K> for ComponentList<K, V> {
86    fn index_mut(&mut self, index: K) -> &mut Self::Output {
87        self.list
88            .iter_mut()
89            .find(|(k, _)| *k == index)
90            .map(|(_, v)| v)
91            .unwrap()
92    }
93}
94
95impl<K, V> Deref for ComponentList<K, V> {
96    type Target = Vec<(K, V)>;
97
98    fn deref(&self) -> &Self::Target {
99        &self.list
100    }
101}
102
103impl<K, V> DerefMut for ComponentList<K, V> {
104    fn deref_mut(&mut self) -> &mut Self::Target {
105        &mut self.list
106    }
107}
108
109impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> From<Vec<(K, V)>> for ComponentList<K, V> {
110    fn from(value: Vec<(K, V)>) -> Self {
111        let mut list = ComponentList::default();
112        list.extend(value.into_iter());
113        list
114    }
115}
116
117impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> FromIterator<(K, V)> for ComponentList<K, V> {
118    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
119        let mut list = ComponentList::default();
120        for (k, v) in iter {
121            list.push(k, v);
122        }
123        list
124    }
125}