makepad_platform/
component_list.rs1use 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}