1 | use arrayvec::ArrayVec; |
2 | use alloc::{sync::Arc, vec::Vec}; |
3 | use core::{ |
4 | borrow::Borrow, |
5 | cmp::{min, Ord, Ordering}, |
6 | fmt::{self, Debug, Formatter}, |
7 | iter, mem, |
8 | ops::Deref, |
9 | slice, |
10 | }; |
11 | |
12 | #[derive (PartialEq)] |
13 | pub(crate) enum Loc { |
14 | InRight, |
15 | InLeft, |
16 | NotPresent(usize), |
17 | Here(usize), |
18 | } |
19 | |
20 | /* |
21 | elts is a sorted array of pairs, increasing the SIZE has several effects; |
22 | |
23 | -- decreases the height of the tree for a given number of elements, |
24 | decreasing the amount of indirection necessary to get to any given |
25 | key. |
26 | |
27 | -- decreases the number of objects allocated on the heap each time a |
28 | key is added or removed |
29 | |
30 | -- increases the size of each allocation |
31 | |
32 | -- icreases the overall amount of memory allocated for each change to |
33 | the tree |
34 | */ |
35 | pub const DEFAULT_SIZE: usize = 512; |
36 | |
37 | pub(crate) enum UpdateChunk< |
38 | Q: Ord, |
39 | K: Ord + Clone + Borrow<Q>, |
40 | V: Clone, |
41 | D, |
42 | const SIZE: usize, |
43 | > { |
44 | UpdateLeft(Vec<(Q, D)>), |
45 | UpdateRight(Vec<(Q, D)>), |
46 | Updated { |
47 | elts: Chunk<K, V, SIZE>, |
48 | update_left: Vec<(Q, D)>, |
49 | update_right: Vec<(Q, D)>, |
50 | overflow_right: Vec<(K, V)>, |
51 | }, |
52 | Removed { |
53 | not_done: Vec<(Q, D)>, |
54 | update_left: Vec<(Q, D)>, |
55 | update_right: Vec<(Q, D)>, |
56 | }, |
57 | } |
58 | |
59 | pub(crate) enum Update<Q: Ord, K: Ord + Clone + Borrow<Q>, V: Clone, D, const SIZE: usize> |
60 | { |
61 | UpdateLeft(Q, D), |
62 | UpdateRight(Q, D), |
63 | Updated { |
64 | elts: Chunk<K, V, SIZE>, |
65 | overflow: Option<(K, V)>, |
66 | previous: Option<V>, |
67 | }, |
68 | } |
69 | |
70 | pub(crate) enum MutUpdate<Q: Ord, K: Ord + Clone + Borrow<Q>, V: Clone, D> { |
71 | UpdateLeft(Q, D), |
72 | UpdateRight(Q, D), |
73 | Updated { |
74 | overflow: Option<(K, V)>, |
75 | previous: Option<V>, |
76 | }, |
77 | } |
78 | |
79 | #[derive (Clone, PartialEq, Eq, PartialOrd, Ord)] |
80 | pub(crate) struct ChunkInner<K, V, const SIZE: usize> { |
81 | keys: ArrayVec<K, SIZE>, |
82 | vals: ArrayVec<V, SIZE>, |
83 | } |
84 | |
85 | #[derive (Clone, PartialEq, Eq, PartialOrd, Ord)] |
86 | pub(crate) struct Chunk<K, V, const SIZE: usize>(Arc<ChunkInner<K, V, SIZE>>); |
87 | |
88 | impl<K, V, const SIZE: usize> Deref for Chunk<K, V, SIZE> { |
89 | type Target = ChunkInner<K, V, SIZE>; |
90 | |
91 | fn deref(&self) -> &Self::Target { |
92 | &*self.0 |
93 | } |
94 | } |
95 | |
96 | impl<K, V, const SIZE: usize> Debug for Chunk<K, V, SIZE> |
97 | where |
98 | K: Debug, |
99 | V: Debug, |
100 | { |
101 | fn fmt(&self, f: &mut Formatter) -> fmt::Result { |
102 | f.debug_map().entries(self.into_iter()).finish() |
103 | } |
104 | } |
105 | |
106 | impl<K, V, const SIZE: usize> Chunk<K, V, SIZE> |
107 | where |
108 | K: Ord + Clone, |
109 | V: Clone, |
110 | { |
111 | pub(crate) fn singleton(k: K, v: V) -> Self { |
112 | let mut t = Chunk::empty(); |
113 | let inner = Arc::make_mut(&mut t.0); |
114 | inner.keys.push(k); |
115 | inner.vals.push(v); |
116 | t |
117 | } |
118 | |
119 | pub(crate) fn empty() -> Self { |
120 | Chunk(Arc::new(ChunkInner { |
121 | keys: ArrayVec::new(), |
122 | vals: ArrayVec::new(), |
123 | })) |
124 | } |
125 | |
126 | pub(crate) fn create_with<Q, D, F>(chunk: Vec<(Q, D)>, f: &mut F) -> Self |
127 | where |
128 | Q: Ord, |
129 | K: Borrow<Q>, |
130 | F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>, |
131 | { |
132 | let mut t = Chunk::empty(); |
133 | let inner = Arc::make_mut(&mut t.0); |
134 | for (k, v) in chunk.into_iter().filter_map(|(q, d)| f(q, d, None)) { |
135 | inner.keys.push(k); |
136 | inner.vals.push(v); |
137 | } |
138 | t |
139 | } |
140 | |
141 | pub(crate) fn get_local<Q: ?Sized + Ord>(&self, k: &Q) -> Option<usize> |
142 | where |
143 | K: Borrow<Q>, |
144 | { |
145 | match self.keys.binary_search_by_key(&k, |k| k.borrow()) { |
146 | Ok(i) => Some(i), |
147 | Err(_) => None, |
148 | } |
149 | } |
150 | |
151 | pub(crate) fn get<Q: ?Sized + Ord>(&self, k: &Q) -> Loc |
152 | where |
153 | K: Borrow<Q>, |
154 | { |
155 | let len = self.len(); |
156 | if len == 0 { |
157 | Loc::NotPresent(0) |
158 | } else { |
159 | let first = k.cmp(&self.keys[0].borrow()); |
160 | let last = k.cmp(&self.keys[len - 1].borrow()); |
161 | match (first, last) { |
162 | (Ordering::Equal, _) => Loc::Here(0), |
163 | (_, Ordering::Equal) => Loc::Here(len - 1), |
164 | (Ordering::Less, _) => Loc::InLeft, |
165 | (_, Ordering::Greater) => Loc::InRight, |
166 | (Ordering::Greater, Ordering::Less) => { |
167 | match self.keys.binary_search_by_key(&k, |k| k.borrow()) { |
168 | Result::Ok(i) => Loc::Here(i), |
169 | Result::Err(i) => Loc::NotPresent(i), |
170 | } |
171 | } |
172 | } |
173 | } |
174 | } |
175 | |
176 | // invariant: chunk is sorted and deduped |
177 | pub(crate) fn update_chunk<Q, D, F>( |
178 | &self, |
179 | chunk: Vec<(Q, D)>, |
180 | leaf: bool, |
181 | f: &mut F, |
182 | ) -> UpdateChunk<Q, K, V, D, SIZE> |
183 | where |
184 | Q: Ord, |
185 | K: Borrow<Q>, |
186 | F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>, |
187 | { |
188 | assert!(chunk.len() <= SIZE && chunk.len() > 0 && self.len() > 0); |
189 | let full = !leaf || self.len() >= SIZE; |
190 | let in_left = self.get(&chunk[chunk.len() - 1].0) == Loc::InLeft; |
191 | let in_right = self.get(&chunk[0].0) == Loc::InRight; |
192 | if full && in_left { |
193 | UpdateChunk::UpdateLeft(chunk) |
194 | } else if full && in_right { |
195 | UpdateChunk::UpdateRight(chunk) |
196 | } else if leaf && (in_left || in_right) { |
197 | let iter = chunk.into_iter().filter_map(|(q, d)| f(q, d, None)); |
198 | let mut overflow_right = Vec::new(); |
199 | let mut elts = Chunk::empty(); |
200 | let inner = Arc::make_mut(&mut elts.0); |
201 | if in_right { |
202 | inner.clone_from(self); |
203 | for (k, v) in iter { |
204 | if inner.keys.len() < SIZE { |
205 | inner.keys.push(k); |
206 | inner.vals.push(v); |
207 | } else { |
208 | overflow_right.push((k, v)); |
209 | } |
210 | } |
211 | } else { |
212 | for (k, v) in iter { |
213 | if inner.keys.len() < SIZE { |
214 | inner.keys.push(k); |
215 | inner.vals.push(v); |
216 | } else { |
217 | overflow_right.push((k, v)); |
218 | } |
219 | } |
220 | for (k, v) in self.keys.iter().cloned().zip(self.vals.iter().cloned()) { |
221 | if inner.keys.len() < SIZE { |
222 | inner.keys.push(k); |
223 | inner.vals.push(v); |
224 | } else { |
225 | overflow_right.push((k, v)); |
226 | } |
227 | } |
228 | } |
229 | UpdateChunk::Updated { |
230 | elts, |
231 | update_left: Vec::new(), |
232 | update_right: Vec::new(), |
233 | overflow_right, |
234 | } |
235 | } else { |
236 | #[inline (always)] |
237 | fn copy_up_to<K, V, const SIZE: usize>( |
238 | t: &Chunk<K, V, SIZE>, |
239 | elts: &mut ChunkInner<K, V, SIZE>, |
240 | overflow_right: &mut Vec<(K, V)>, |
241 | m: &mut usize, |
242 | i: usize, |
243 | ) where |
244 | K: Ord + Clone, |
245 | V: Clone, |
246 | { |
247 | let n = min(i - *m, SIZE - elts.keys.len()); |
248 | if n > 0 { |
249 | elts.keys.extend(t.keys[*m..*m + n].iter().cloned()); |
250 | elts.vals.extend(t.vals[*m..*m + n].iter().cloned()); |
251 | *m += n; |
252 | } |
253 | if *m < i { |
254 | overflow_right.extend( |
255 | t.keys.as_slice()[*m..i] |
256 | .iter() |
257 | .cloned() |
258 | .zip(t.vals.as_slice()[*m..i].iter().cloned()), |
259 | ); |
260 | *m = i; |
261 | } |
262 | } |
263 | // invariant: don't cross the streams. |
264 | let mut not_done = Vec::new(); |
265 | let mut update_left = Vec::new(); |
266 | let mut update_right = Vec::new(); |
267 | let mut overflow_right = Vec::new(); |
268 | let mut m = 0; |
269 | let mut elts = Chunk::empty(); |
270 | let inner = Arc::make_mut(&mut elts.0); |
271 | let mut chunk = chunk.into_iter(); |
272 | loop { |
273 | if m == self.len() && inner.keys.len() == 0 { |
274 | not_done.extend(chunk); |
275 | break; |
276 | } |
277 | match chunk.next() { |
278 | None => { |
279 | copy_up_to(self, inner, &mut overflow_right, &mut m, self.len()); |
280 | break; |
281 | } |
282 | Some((q, d)) => { |
283 | match self.get(&q) { |
284 | Loc::Here(i) => { |
285 | copy_up_to(self, inner, &mut overflow_right, &mut m, i); |
286 | let r = f(q, d, Some((&self.keys[i], &self.vals[i]))); |
287 | if let Some((k, v)) = r { |
288 | if inner.keys.len() < SIZE { |
289 | inner.keys.push(k); |
290 | inner.vals.push(v); |
291 | } else { |
292 | overflow_right.push((k, v)) |
293 | } |
294 | } |
295 | // self[i] was replaced or deleted, skip it |
296 | m += 1; |
297 | } |
298 | Loc::NotPresent(i) => { |
299 | copy_up_to(self, inner, &mut overflow_right, &mut m, i); |
300 | if let Some((k, v)) = f(q, d, None) { |
301 | if inner.keys.len() < SIZE { |
302 | inner.keys.push(k); |
303 | inner.vals.push(v); |
304 | } else { |
305 | overflow_right.push((k, v)); |
306 | } |
307 | } |
308 | } |
309 | Loc::InLeft => { |
310 | if leaf && inner.keys.len() < SIZE { |
311 | if let Some((k, v)) = f(q, d, None) { |
312 | inner.keys.push(k); |
313 | inner.vals.push(v); |
314 | } |
315 | } else { |
316 | update_left.push((q, d)) |
317 | } |
318 | } |
319 | Loc::InRight => { |
320 | let len = self.len(); |
321 | copy_up_to(self, inner, &mut overflow_right, &mut m, len); |
322 | if leaf && inner.keys.len() < SIZE { |
323 | let iter = iter::once((q, d)) |
324 | .chain(chunk) |
325 | .filter_map(|(q, d)| f(q, d, None)); |
326 | for (k, v) in iter { |
327 | if inner.keys.len() < SIZE { |
328 | inner.keys.push(k); |
329 | inner.vals.push(v); |
330 | } else { |
331 | overflow_right.push((k, v)); |
332 | } |
333 | } |
334 | } else { |
335 | update_right.push((q, d)); |
336 | update_right.extend(chunk); |
337 | } |
338 | break; |
339 | } |
340 | } |
341 | } |
342 | } |
343 | } |
344 | if elts.len() > 0 { |
345 | assert_eq!(not_done.len(), 0); |
346 | UpdateChunk::Updated { |
347 | elts, |
348 | update_left, |
349 | update_right, |
350 | overflow_right, |
351 | } |
352 | } else { |
353 | assert_eq!(overflow_right.len(), 0); |
354 | UpdateChunk::Removed { |
355 | not_done, |
356 | update_left, |
357 | update_right, |
358 | } |
359 | } |
360 | } |
361 | } |
362 | |
363 | pub(crate) fn update<Q, D, F>( |
364 | &self, |
365 | q: Q, |
366 | d: D, |
367 | leaf: bool, |
368 | f: &mut F, |
369 | ) -> Update<Q, K, V, D, SIZE> |
370 | where |
371 | Q: Ord, |
372 | K: Borrow<Q>, |
373 | F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>, |
374 | { |
375 | match self.get(&q) { |
376 | Loc::Here(i) => { |
377 | let mut elts = Chunk::empty(); |
378 | let inner = Arc::make_mut(&mut elts.0); |
379 | inner.keys.extend(self.keys[0..i].iter().cloned()); |
380 | inner.vals.extend(self.vals[0..i].iter().cloned()); |
381 | if let Some((k, v)) = f(q, d, Some((&self.keys[i], &self.vals[i]))) { |
382 | inner.keys.push(k); |
383 | inner.vals.push(v); |
384 | } |
385 | if i + 1 < self.len() { |
386 | inner |
387 | .keys |
388 | .extend(self.keys[i + 1..self.len()].iter().cloned()); |
389 | inner |
390 | .vals |
391 | .extend(self.vals[i + 1..self.len()].iter().cloned()); |
392 | } |
393 | Update::Updated { |
394 | elts, |
395 | overflow: None, |
396 | previous: Some(self.vals[i].clone()), |
397 | } |
398 | } |
399 | Loc::NotPresent(i) => { |
400 | let mut elts = Chunk::empty(); |
401 | let inner = Arc::make_mut(&mut elts.0); |
402 | inner.keys.extend(self.keys[0..i].iter().cloned()); |
403 | inner.vals.extend(self.vals[0..i].iter().cloned()); |
404 | let overflow = match f(q, d, None) { |
405 | None => None, |
406 | Some((k, v)) => { |
407 | if inner.keys.len() == SIZE { |
408 | let (ok, ov) = |
409 | (inner.keys.pop().unwrap(), inner.vals.pop().unwrap()); |
410 | inner.keys.push(k); |
411 | inner.vals.push(v); |
412 | Some((ok, ov)) |
413 | } else { |
414 | inner.keys.push(k); |
415 | inner.vals.push(v); |
416 | let mut iter = self.keys[i..self.len()] |
417 | .iter() |
418 | .cloned() |
419 | .zip(self.vals[i..self.len()].iter().cloned()); |
420 | loop { |
421 | match iter.next() { |
422 | None => break None, |
423 | Some((k, v)) => { |
424 | if inner.keys.len() < SIZE { |
425 | inner.keys.push(k); |
426 | inner.vals.push(v); |
427 | } else { |
428 | break Some((k, v)); |
429 | } |
430 | } |
431 | } |
432 | } |
433 | } |
434 | } |
435 | }; |
436 | Update::Updated { |
437 | elts, |
438 | overflow, |
439 | previous: None, |
440 | } |
441 | } |
442 | loc @ Loc::InLeft | loc @ Loc::InRight => { |
443 | if !leaf || self.len() == SIZE { |
444 | match loc { |
445 | Loc::InLeft => Update::UpdateLeft(q, d), |
446 | Loc::InRight => Update::UpdateRight(q, d), |
447 | Loc::Here(..) | Loc::NotPresent(..) => unreachable!(), |
448 | } |
449 | } else { |
450 | let mut elts = Chunk::empty(); |
451 | let inner = Arc::make_mut(&mut elts.0); |
452 | match loc { |
453 | Loc::InLeft => { |
454 | if let Some((k, v)) = f(q, d, None) { |
455 | inner.keys.push(k); |
456 | inner.vals.push(v); |
457 | } |
458 | inner.keys.extend(self.keys[0..self.len()].iter().cloned()); |
459 | inner.vals.extend(self.vals[0..self.len()].iter().cloned()); |
460 | } |
461 | Loc::InRight => { |
462 | inner.keys.extend(self.keys[0..self.len()].iter().cloned()); |
463 | inner.vals.extend(self.vals[0..self.len()].iter().cloned()); |
464 | if let Some((k, v)) = f(q, d, None) { |
465 | inner.keys.push(k); |
466 | inner.vals.push(v); |
467 | } |
468 | } |
469 | _ => unreachable!("bug" ), |
470 | }; |
471 | Update::Updated { |
472 | elts, |
473 | overflow: None, |
474 | previous: None, |
475 | } |
476 | } |
477 | } |
478 | } |
479 | } |
480 | |
481 | pub(crate) fn update_mut<Q, D, F>( |
482 | &mut self, |
483 | q: Q, |
484 | d: D, |
485 | leaf: bool, |
486 | f: &mut F, |
487 | ) -> MutUpdate<Q, K, V, D> |
488 | where |
489 | Q: Ord, |
490 | K: Borrow<Q>, |
491 | F: FnMut(Q, D, Option<(&K, &V)>) -> Option<(K, V)>, |
492 | { |
493 | match self.get(&q) { |
494 | Loc::Here(i) => match f(q, d, Some((&self.keys[i], &self.vals[i]))) { |
495 | Some((k, v)) => { |
496 | let inner = Arc::make_mut(&mut self.0); |
497 | inner.keys[i] = k; |
498 | MutUpdate::Updated { |
499 | overflow: None, |
500 | previous: Some(mem::replace(&mut inner.vals[i], v)), |
501 | } |
502 | } |
503 | None => { |
504 | let inner = Arc::make_mut(&mut self.0); |
505 | inner.keys.remove(i); |
506 | MutUpdate::Updated { |
507 | overflow: None, |
508 | previous: Some(inner.vals.remove(i)), |
509 | } |
510 | } |
511 | }, |
512 | Loc::NotPresent(i) => match f(q, d, None) { |
513 | Some((k, v)) => { |
514 | let inner = Arc::make_mut(&mut self.0); |
515 | let overflow = if inner.keys.len() == SIZE { |
516 | let (ok, ov) = |
517 | (inner.keys.pop().unwrap(), inner.vals.pop().unwrap()); |
518 | inner.keys.insert(i, k); |
519 | inner.vals.insert(i, v); |
520 | Some((ok, ov)) |
521 | } else { |
522 | inner.keys.insert(i, k); |
523 | inner.vals.insert(i, v); |
524 | None |
525 | }; |
526 | MutUpdate::Updated { |
527 | overflow, |
528 | previous: None, |
529 | } |
530 | } |
531 | None => MutUpdate::Updated { |
532 | overflow: None, |
533 | previous: None, |
534 | }, |
535 | }, |
536 | loc @ Loc::InLeft | loc @ Loc::InRight => { |
537 | if !leaf || self.len() == SIZE { |
538 | match loc { |
539 | Loc::InLeft => MutUpdate::UpdateLeft(q, d), |
540 | Loc::InRight => MutUpdate::UpdateRight(q, d), |
541 | Loc::Here(..) | Loc::NotPresent(..) => unreachable!(), |
542 | } |
543 | } else { |
544 | let inner = Arc::make_mut(&mut self.0); |
545 | match loc { |
546 | Loc::InLeft => { |
547 | if let Some((k, v)) = f(q, d, None) { |
548 | inner.keys.insert(0, k); |
549 | inner.vals.insert(0, v); |
550 | } |
551 | } |
552 | Loc::InRight => { |
553 | if let Some((k, v)) = f(q, d, None) { |
554 | inner.keys.push(k); |
555 | inner.vals.push(v); |
556 | } |
557 | } |
558 | _ => unreachable!("bug" ), |
559 | }; |
560 | MutUpdate::Updated { |
561 | overflow: None, |
562 | previous: None, |
563 | } |
564 | } |
565 | } |
566 | } |
567 | } |
568 | |
569 | pub(crate) fn intersect<F>( |
570 | c0: &Chunk<K, V, SIZE>, |
571 | c1: &Chunk<K, V, SIZE>, |
572 | r: &mut Vec<(K, V)>, |
573 | f: &mut F, |
574 | ) where |
575 | F: FnMut(&K, &V, &V) -> Option<V>, |
576 | { |
577 | if c0.len() > 0 && c1.len() > 0 { |
578 | let (c0, c1) = if c0.len() < c1.len() { |
579 | (c0, c1) |
580 | } else { |
581 | (c1, c0) |
582 | }; |
583 | r.extend(c0.keys.iter().enumerate().filter_map(|(i, k)| { |
584 | match c1.keys.binary_search(&k) { |
585 | Err(_) => None, |
586 | Ok(j) => f(k, &c0.vals[i], &c1.vals[j]).map(|v| (k.clone(), v)), |
587 | } |
588 | })) |
589 | } |
590 | } |
591 | |
592 | pub(crate) fn remove_elt_at(&self, i: usize) -> Self { |
593 | let mut elts = Chunk::empty(); |
594 | let t = Arc::make_mut(&mut elts.0); |
595 | if self.keys.len() == 0 { |
596 | panic!("can't remove from an empty chunk" ) |
597 | } else if self.len() == 1 { |
598 | assert_eq!(i, 0); |
599 | elts |
600 | } else if i == 0 { |
601 | t.keys.extend(self.keys[1..self.len()].iter().cloned()); |
602 | t.vals.extend(self.vals[1..self.len()].iter().cloned()); |
603 | elts |
604 | } else if i == self.keys.len() - 1 { |
605 | t.keys.extend(self.keys[0..self.len() - 1].iter().cloned()); |
606 | t.vals.extend(self.vals[0..self.len() - 1].iter().cloned()); |
607 | elts |
608 | } else { |
609 | t.keys.extend(self.keys[0..i].iter().cloned()); |
610 | t.keys.extend(self.keys[i + 1..self.len()].iter().cloned()); |
611 | t.vals.extend(self.vals[0..i].iter().cloned()); |
612 | t.vals.extend(self.vals[i + 1..self.len()].iter().cloned()); |
613 | elts |
614 | } |
615 | } |
616 | |
617 | pub(crate) fn remove_elt_at_mut(&mut self, i: usize) -> (K, V) { |
618 | if self.len() == 0 { |
619 | panic!("can't remove from an empty chunk" ) |
620 | } else { |
621 | let inner = Arc::make_mut(&mut self.0); |
622 | let k = inner.keys.remove(i); |
623 | let v = inner.vals.remove(i); |
624 | (k, v) |
625 | } |
626 | } |
627 | |
628 | pub(crate) fn append<I: IntoIterator<Item = (K, V)>>(&self, other: I) -> Self { |
629 | let mut elts = self.clone(); |
630 | let inner = Arc::make_mut(&mut elts.0); |
631 | for (k, v) in other { |
632 | if inner.keys.len() < SIZE { |
633 | inner.keys.push(k); |
634 | inner.vals.push(v); |
635 | } |
636 | } |
637 | elts |
638 | } |
639 | |
640 | pub(crate) fn min_max_key(&self) -> Option<(K, K)> { |
641 | if self.len() == 0 { |
642 | None |
643 | } else { |
644 | Some((self.keys[0].clone(), self.keys[self.len() - 1].clone())) |
645 | } |
646 | } |
647 | |
648 | pub(crate) fn min_elt(&self) -> Option<(&K, &V)> { |
649 | if self.len() == 0 { |
650 | None |
651 | } else { |
652 | Some((&self.keys[0], &self.vals[0])) |
653 | } |
654 | } |
655 | |
656 | pub(crate) fn max_elt(&self) -> Option<(&K, &V)> { |
657 | if self.len() == 0 { |
658 | None |
659 | } else { |
660 | let last = self.len() - 1; |
661 | Some((&self.keys[last], &self.vals[last])) |
662 | } |
663 | } |
664 | |
665 | pub(crate) fn len(&self) -> usize { |
666 | self.keys.len() |
667 | } |
668 | |
669 | pub(crate) fn key(&self, i: usize) -> &K { |
670 | &self.keys[i] |
671 | } |
672 | |
673 | pub(crate) fn val(&self, i: usize) -> &V { |
674 | &self.vals[i] |
675 | } |
676 | |
677 | pub(crate) fn val_mut(&mut self, i: usize) -> &mut V { |
678 | &mut Arc::make_mut(&mut self.0).vals[i] |
679 | } |
680 | |
681 | pub(crate) fn kv(&self, i: usize) -> (&K, &V) { |
682 | (&self.keys[i], &self.vals[i]) |
683 | } |
684 | |
685 | pub(crate) fn to_vec(&self) -> Vec<(K, V)> { |
686 | self.into_iter() |
687 | .map(|(k, v)| (k.clone(), v.clone())) |
688 | .collect() |
689 | } |
690 | } |
691 | |
692 | impl<K: Clone, V: Clone, const SIZE: usize> IntoIterator for Chunk<K, V, SIZE> { |
693 | type Item = (K, V); |
694 | type IntoIter = iter::Zip<arrayvec::IntoIter<K, SIZE>, arrayvec::IntoIter<V, SIZE>>; |
695 | fn into_iter(mut self) -> Self::IntoIter { |
696 | let inner: ChunkInner = mem::replace( |
697 | dest:Arc::make_mut(&mut self.0), |
698 | src:ChunkInner { |
699 | keys: ArrayVec::new(), |
700 | vals: ArrayVec::new(), |
701 | }, |
702 | ); |
703 | inner.keys.into_iter().zip(inner.vals.into_iter()) |
704 | } |
705 | } |
706 | |
707 | impl<'a, K, V, const SIZE: usize> IntoIterator for &'a Chunk<K, V, SIZE> { |
708 | type Item = (&'a K, &'a V); |
709 | type IntoIter = iter::Zip<slice::Iter<'a, K>, slice::Iter<'a, V>>; |
710 | fn into_iter(self) -> Self::IntoIter { |
711 | (&self.keys).into_iter().zip(&self.vals) |
712 | } |
713 | } |
714 | |
715 | impl<'a, K: Clone, V: Clone, const SIZE: usize> IntoIterator for &'a mut Chunk<K, V, SIZE> { |
716 | type Item = (&'a K, &'a mut V); |
717 | type IntoIter = iter::Zip<slice::Iter<'a, K>, slice::IterMut<'a, V>>; |
718 | fn into_iter(self) -> Self::IntoIter { |
719 | let inner: &mut ChunkInner = Arc::make_mut(&mut self.0); |
720 | (&inner.keys).into_iter().zip(&mut inner.vals) |
721 | } |
722 | } |
723 | |