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}