1use crate::entity::iter::{Iter, IterMut};
7use crate::entity::keys::Keys;
8use crate::entity::EntityRef;
9use crate::lib::std::boxed::Box;
10use crate::lib::std::marker::PhantomData;
11use crate::lib::std::ops::{Index, IndexMut};
12use crate::lib::std::slice;
13
14#[derive(Debug, Clone)]
19pub struct BoxedSlice<K, V>
20where
21 K: EntityRef,
22{
23 elems: Box<[V]>,
24 unused: PhantomData<K>,
25}
26
27impl<K, V> BoxedSlice<K, V>
28where
29 K: EntityRef,
30{
31 pub unsafe fn from_raw(raw: *mut [V]) -> Self {
38 Self {
39 elems: Box::from_raw(raw),
40 unused: PhantomData,
41 }
42 }
43
44 pub fn is_valid(&self, k: K) -> bool {
46 k.index() < self.elems.len()
47 }
48
49 pub fn get(&self, k: K) -> Option<&V> {
51 self.elems.get(k.index())
52 }
53
54 pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
56 self.elems.get_mut(k.index())
57 }
58
59 pub fn is_empty(&self) -> bool {
61 self.elems.is_empty()
62 }
63
64 pub fn len(&self) -> usize {
66 self.elems.len()
67 }
68
69 pub fn keys(&self) -> Keys<K> {
71 Keys::with_len(self.elems.len())
72 }
73
74 pub fn values(&self) -> slice::Iter<V> {
76 self.elems.iter()
77 }
78
79 pub fn values_mut(&mut self) -> slice::IterMut<V> {
81 self.elems.iter_mut()
82 }
83
84 pub fn iter(&self) -> Iter<K, V> {
86 Iter::new(self.elems.iter())
87 }
88
89 pub fn iter_mut(&mut self) -> IterMut<K, V> {
91 IterMut::new(self.elems.iter_mut())
92 }
93
94 pub fn last(&self) -> Option<&V> {
96 self.elems.last()
97 }
98}
99
100impl<K, V> Index<K> for BoxedSlice<K, V>
103where
104 K: EntityRef,
105{
106 type Output = V;
107
108 fn index(&self, k: K) -> &V {
109 &self.elems[k.index()]
110 }
111}
112
113impl<K, V> IndexMut<K> for BoxedSlice<K, V>
115where
116 K: EntityRef,
117{
118 fn index_mut(&mut self, k: K) -> &mut V {
119 &mut self.elems[k.index()]
120 }
121}
122
123impl<'a, K, V> IntoIterator for &'a BoxedSlice<K, V>
124where
125 K: EntityRef,
126{
127 type Item = (K, &'a V);
128 type IntoIter = Iter<'a, K, V>;
129
130 fn into_iter(self) -> Self::IntoIter {
131 Iter::new(self.elems.iter())
132 }
133}
134
135impl<'a, K, V> IntoIterator for &'a mut BoxedSlice<K, V>
136where
137 K: EntityRef,
138{
139 type Item = (K, &'a mut V);
140 type IntoIter = IterMut<'a, K, V>;
141
142 fn into_iter(self) -> Self::IntoIter {
143 IterMut::new(self.elems.iter_mut())
144 }
145}
146
147#[cfg(test)]
148mod tests {
149 use super::*;
150 use crate::entity::PrimaryMap;
151 use crate::lib::std::vec::Vec;
152
153 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
155 struct E(u32);
156
157 impl EntityRef for E {
158 fn new(i: usize) -> Self {
159 E(i as u32)
160 }
161 fn index(self) -> usize {
162 self.0 as usize
163 }
164 }
165
166 #[test]
167 fn basic() {
168 let r0 = E(0);
169 let r1 = E(1);
170 let p = PrimaryMap::<E, isize>::new();
171 let m = p.into_boxed_slice();
172
173 let v: Vec<E> = m.keys().collect();
174 assert_eq!(v, []);
175
176 assert!(!m.is_valid(r0));
177 assert!(!m.is_valid(r1));
178 }
179
180 #[test]
181 fn iter() {
182 let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
183 p.push(12);
184 p.push(33);
185 let mut m = p.into_boxed_slice();
186
187 let mut i = 0;
188 for (key, value) in &m {
189 assert_eq!(key.index(), i);
190 match i {
191 0 => assert_eq!(*value, 12),
192 1 => assert_eq!(*value, 33),
193 _ => panic!(),
194 }
195 i += 1;
196 }
197 i = 0;
198 for (key_mut, value_mut) in m.iter_mut() {
199 assert_eq!(key_mut.index(), i);
200 match i {
201 0 => assert_eq!(*value_mut, 12),
202 1 => assert_eq!(*value_mut, 33),
203 _ => panic!(),
204 }
205 i += 1;
206 }
207 }
208
209 #[test]
210 fn iter_rev() {
211 let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
212 p.push(12);
213 p.push(33);
214 let mut m = p.into_boxed_slice();
215
216 let mut i = 2;
217 for (key, value) in m.iter().rev() {
218 i -= 1;
219 assert_eq!(key.index(), i);
220 match i {
221 0 => assert_eq!(*value, 12),
222 1 => assert_eq!(*value, 33),
223 _ => panic!(),
224 }
225 }
226
227 i = 2;
228 for (key, value) in m.iter_mut().rev() {
229 i -= 1;
230 assert_eq!(key.index(), i);
231 match i {
232 0 => assert_eq!(*value, 12),
233 1 => assert_eq!(*value, 33),
234 _ => panic!(),
235 }
236 }
237 }
238 #[test]
239 fn keys() {
240 let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
241 p.push(12);
242 p.push(33);
243 let m = p.into_boxed_slice();
244
245 let mut i = 0;
246 for key in m.keys() {
247 assert_eq!(key.index(), i);
248 i += 1;
249 }
250 }
251
252 #[test]
253 fn keys_rev() {
254 let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
255 p.push(12);
256 p.push(33);
257 let m = p.into_boxed_slice();
258
259 let mut i = 2;
260 for key in m.keys().rev() {
261 i -= 1;
262 assert_eq!(key.index(), i);
263 }
264 }
265
266 #[test]
267 fn values() {
268 let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
269 p.push(12);
270 p.push(33);
271 let mut m = p.into_boxed_slice();
272
273 let mut i = 0;
274 for value in m.values() {
275 match i {
276 0 => assert_eq!(*value, 12),
277 1 => assert_eq!(*value, 33),
278 _ => panic!(),
279 }
280 i += 1;
281 }
282 i = 0;
283 for value_mut in m.values_mut() {
284 match i {
285 0 => assert_eq!(*value_mut, 12),
286 1 => assert_eq!(*value_mut, 33),
287 _ => panic!(),
288 }
289 i += 1;
290 }
291 }
292
293 #[test]
294 fn values_rev() {
295 let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
296 p.push(12);
297 p.push(33);
298 let mut m = p.into_boxed_slice();
299
300 let mut i = 2;
301 for value in m.values().rev() {
302 i -= 1;
303 match i {
304 0 => assert_eq!(*value, 12),
305 1 => assert_eq!(*value, 33),
306 _ => panic!(),
307 }
308 }
309 i = 2;
310 for value_mut in m.values_mut().rev() {
311 i -= 1;
312 match i {
313 0 => assert_eq!(*value_mut, 12),
314 1 => assert_eq!(*value_mut, 33),
315 _ => panic!(),
316 }
317 }
318 }
319}