windows_collections/
map_view.rs

1use super::*;
2use windows_core::*;
3
4#[implement(IMapView<K, V>, IIterable<IKeyValuePair<K, V>>)]
5struct StockMapView<K, V>
6where
7    K: RuntimeType + 'static,
8    V: RuntimeType + 'static,
9    K::Default: Clone + Ord,
10    V::Default: Clone,
11{
12    map: std::collections::BTreeMap<K::Default, V::Default>,
13}
14
15impl<K, V> IIterable_Impl<IKeyValuePair<K, V>> for StockMapView_Impl<K, V>
16where
17    K: RuntimeType,
18    V: RuntimeType,
19    K::Default: Clone + Ord,
20    V::Default: Clone,
21{
22    fn First(&self) -> Result<IIterator<IKeyValuePair<K, V>>> {
23        Ok(ComObject::new(StockMapViewIterator::<K, V> {
24            _owner: self.to_object(),
25            current: std::sync::RwLock::new(self.map.iter()),
26        })
27        .into_interface())
28    }
29}
30
31impl<K, V> IMapView_Impl<K, V> for StockMapView_Impl<K, V>
32where
33    K: RuntimeType,
34    V: RuntimeType,
35    K::Default: Clone + Ord,
36    V::Default: Clone,
37{
38    fn Lookup(&self, key: Ref<K>) -> Result<V> {
39        let value = self.map.get(&*key).ok_or_else(|| Error::from(E_BOUNDS))?;
40
41        V::from_default(value)
42    }
43
44    fn Size(&self) -> Result<u32> {
45        Ok(self.map.len().try_into()?)
46    }
47
48    fn HasKey(&self, key: Ref<K>) -> Result<bool> {
49        Ok(self.map.contains_key(&*key))
50    }
51
52    fn Split(&self, first: OutRef<IMapView<K, V>>, second: OutRef<IMapView<K, V>>) -> Result<()> {
53        _ = first.write(None);
54        _ = second.write(None);
55        Ok(())
56    }
57}
58
59#[implement(IIterator<IKeyValuePair<K, V>>)]
60struct StockMapViewIterator<'a, K, V>
61where
62    K: RuntimeType + 'static,
63    V: RuntimeType + 'static,
64    K::Default: Clone + Ord,
65    V::Default: Clone,
66{
67    _owner: ComObject<StockMapView<K, V>>,
68    current: std::sync::RwLock<std::collections::btree_map::Iter<'a, K::Default, V::Default>>,
69}
70
71impl<K, V> IIterator_Impl<IKeyValuePair<K, V>> for StockMapViewIterator_Impl<'_, K, V>
72where
73    K: RuntimeType,
74    V: RuntimeType,
75    K::Default: Clone + Ord,
76    V::Default: Clone,
77{
78    fn Current(&self) -> Result<IKeyValuePair<K, V>> {
79        let mut current = self.current.read().unwrap().clone().peekable();
80
81        if let Some((key, value)) = current.peek() {
82            Ok(ComObject::new(StockKeyValuePair {
83                key: (*key).clone(),
84                value: (*value).clone(),
85            })
86            .into_interface())
87        } else {
88            Err(Error::from(E_BOUNDS))
89        }
90    }
91
92    fn HasCurrent(&self) -> Result<bool> {
93        let mut current = self.current.read().unwrap().clone().peekable();
94        Ok(current.peek().is_some())
95    }
96
97    fn MoveNext(&self) -> Result<bool> {
98        let mut current = self.current.write().unwrap();
99        current.next();
100        Ok(current.clone().peekable().peek().is_some())
101    }
102
103    fn GetMany(&self, pairs: &mut [Option<IKeyValuePair<K, V>>]) -> Result<u32> {
104        let mut current = self.current.write().unwrap();
105        let mut actual = 0;
106
107        for pair in pairs {
108            if let Some((key, value)) = current.next() {
109                *pair = Some(
110                    ComObject::new(StockKeyValuePair {
111                        key: (*key).clone(),
112                        value: (*value).clone(),
113                    })
114                    .into_interface(),
115                );
116                actual += 1;
117            } else {
118                break;
119            }
120        }
121
122        Ok(actual)
123    }
124}
125
126#[implement(IKeyValuePair<K, V>)]
127struct StockKeyValuePair<K, V>
128where
129    K: RuntimeType + 'static,
130    V: RuntimeType + 'static,
131    K::Default: Clone,
132    V::Default: Clone,
133{
134    key: K::Default,
135    value: V::Default,
136}
137
138impl<K, V> IKeyValuePair_Impl<K, V> for StockKeyValuePair_Impl<K, V>
139where
140    K: RuntimeType,
141    V: RuntimeType,
142    K::Default: Clone,
143    V::Default: Clone,
144{
145    fn Key(&self) -> Result<K> {
146        K::from_default(&self.key)
147    }
148
149    fn Value(&self) -> Result<V> {
150        V::from_default(&self.value)
151    }
152}
153
154impl<K, V> From<std::collections::BTreeMap<K::Default, V::Default>> for IMapView<K, V>
155where
156    K: RuntimeType,
157    V: RuntimeType,
158    K::Default: Clone + Ord,
159    V::Default: Clone,
160{
161    fn from(map: std::collections::BTreeMap<K::Default, V::Default>) -> Self {
162        StockMapView { map }.into()
163    }
164}