1mod entry;
2mod into_iter;
3mod iter;
4mod iter_mut;
5mod keys;
6mod values;
7mod values_mut;
8
9pub use entry::{Entry, OccupiedEntry, VacantEntry};
10pub use into_iter::IntoIter;
11pub use iter::Iter;
12pub use iter_mut::IterMut;
13pub use keys::Keys;
14pub use values::Values;
15pub use values_mut::ValuesMut;
16
17use core::{
18 borrow::Borrow,
19 cmp::{Ord, Ordering},
20 fmt,
21 hash::{Hash, Hasher},
22 mem::{self, MaybeUninit},
23 ops::{Index, Range},
24 ptr,
25};
26
27enum InsertIndex {
28 Found(usize),
29 NotFound(usize),
30}
31
32struct RetainRestDropper<'a, K, V, const N: usize> {
34 range: Range<usize>,
35 keys: &'a mut [MaybeUninit<K>; N],
36 values: &'a mut [MaybeUninit<V>; N],
37}
38
39impl<'a, K, V, const N: usize> RetainRestDropper<'a, K, V, N> {
40 fn consume(&mut self) {
41 self.range.next();
42 }
43}
44
45impl<'a, K, V, const N: usize> Drop for RetainRestDropper<'a, K, V, N> {
46 fn drop(&mut self) {
47 if self.range.is_empty() {
48 return;
49 }
50 let ptr = unsafe { self.keys.as_mut_ptr().offset(self.range.start as isize) } as *mut K;
51 let key_slice = ptr::slice_from_raw_parts_mut(ptr, self.range.len());
52 let ptr = unsafe { self.values.as_mut_ptr().offset(self.range.start as isize) as *mut V };
53 let value_slice = ptr::slice_from_raw_parts_mut(ptr, self.range.len());
54 unsafe {
55 ptr::drop_in_place(key_slice);
56 ptr::drop_in_place(value_slice);
57 }
58 }
59}
60
61pub struct OrdMap<K, V, const N: usize> {
67 len: usize,
68 keys: [MaybeUninit<K>; N],
69 values: [MaybeUninit<V>; N],
70}
71
72impl<K, V, const N: usize> OrdMap<K, V, N> {
73 fn insert_index(&self, key: &K) -> InsertIndex
74 where
75 K: Ord,
76 {
77 let Some((last, _)) = self.last_key_value() else {
78 return InsertIndex::NotFound(0);
79 };
80 match last.cmp(key) {
81 Ordering::Less => InsertIndex::NotFound(self.len),
82 Ordering::Equal => InsertIndex::Found(self.len - 1),
83 Ordering::Greater => match self.keys_slice().binary_search(key) {
84 Ok(index) => InsertIndex::Found(index),
85 Err(index) => InsertIndex::NotFound(index),
86 },
87 }
88 }
89
90 fn get_index<Q>(&self, key: &Q) -> Option<usize>
91 where
92 K: Borrow<Q>,
93 Q: Ord + ?Sized,
94 {
95 self.keys_slice()
96 .binary_search_by(move |k| <K as Borrow<Q>>::borrow(k).cmp(key))
97 .ok()
98 }
99
100 pub(crate) fn keys_ptr(&self) -> *const K {
101 self.keys.as_ptr() as *const K
102 }
103
104 pub fn keys_slice(&self) -> &[K] {
119 let ptr = self.keys.as_ptr() as *const K;
120 unsafe { core::slice::from_raw_parts(ptr, self.len) }
121 }
122
123 pub fn values_slice(&self) -> &[V] {
138 let ptr = self.values.as_ptr() as *const V;
139 unsafe { core::slice::from_raw_parts(ptr, self.len) }
140 }
141
142 pub fn values_mut_slice(&mut self) -> &mut [V] {
159 let ptr = self.values.as_mut_ptr() as *mut V;
160 unsafe { core::slice::from_raw_parts_mut(ptr, self.len) }
161 }
162
163 pub fn slices(&self) -> (&[K], &[V]) {
178 (self.keys_slice(), self.values_slice())
179 }
180 pub fn slices_mut(&mut self) -> (&[K], &mut [V]) {
181 let keys = {
182 let ptr = self.keys.as_ptr() as *const K;
183 unsafe { core::slice::from_raw_parts(ptr, self.len) }
184 };
185 let values = {
186 let ptr = self.values.as_mut_ptr() as *mut V;
187 unsafe { core::slice::from_raw_parts_mut(ptr, self.len) }
188 };
189 (keys, values)
190 }
191
192 pub fn new() -> Self {
193 Self::default()
194 }
195
196 pub fn len(&self) -> usize {
197 self.len
198 }
199 pub fn is_empty(&self) -> bool {
200 self.len == 0
201 }
202
203 pub fn entry(&mut self, key: K) -> Entry<'_, K, V, N>
204 where
205 K: Ord,
206 {
207 match self.insert_index(&key) {
208 InsertIndex::Found(index) => Entry::occupied(self, index),
209 InsertIndex::NotFound(index) => Entry::vacant(self, index, key),
210 }
211 }
212
213 pub fn insert(&mut self, key: K, value: V) -> Result<Option<(K, V)>, (K, V)>
246 where
247 K: Ord,
248 {
249 match self.insert_index(&key) {
250 InsertIndex::Found(_) => Ok(Some((key, value))),
251 InsertIndex::NotFound(index) => self.insert_at(index, key, value).map(|()| None),
252 }
253 }
254
255 fn insert_at(&mut self, index: usize, key: K, value: V) -> Result<(), (K, V)> {
258 if self.len == N {
259 Err((key, value))
260 } else {
261 self.keys[index..=self.len].rotate_right(1);
262 self.keys[index].write(key);
263 self.values[index..=self.len].rotate_right(1);
264 self.values[index].write(value);
265 self.len += 1;
266 Ok(())
267 }
268 }
269
270 fn replace_at(&mut self, index: usize, key: K, value: V) -> (K, V) {
272 let prev_key = mem::replace(&mut self.keys[index], MaybeUninit::new(key));
273 let prev_value = mem::replace(&mut self.values[index], MaybeUninit::new(value));
274 unsafe { (prev_key.assume_init(), prev_value.assume_init()) }
275 }
276
277 pub fn replace(&mut self, key: K, value: V) -> Result<Option<(K, V)>, (K, V)>
309 where
310 K: Ord,
311 {
312 match self.insert_index(&key) {
313 InsertIndex::Found(index) => Ok(Some(self.replace_at(index, key, value))),
314 InsertIndex::NotFound(index) => self.insert_at(index, key, value).map(|()| None),
315 }
316 }
317
318 pub fn get<Q>(&self, key: &Q) -> Option<&V>
319 where
320 K: Borrow<Q>,
321 Q: Ord + ?Sized,
322 {
323 self.get_index(key)
324 .map(|index| unsafe { self.values[index].assume_init_ref() })
325 }
326
327 pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
328 where
329 K: Borrow<Q>,
330 Q: Ord + ?Sized,
331 {
332 self.get_index(key).map(|index| unsafe {
333 (
334 self.keys[index].assume_init_ref(),
335 self.values[index].assume_init_ref(),
336 )
337 })
338 }
339
340 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
341 where
342 K: Borrow<Q>,
343 Q: Ord + ?Sized,
344 {
345 self.get_index(key)
346 .map(|index| unsafe { self.values[index].assume_init_mut() })
347 }
348
349 pub fn get_key_value_mut<Q>(&mut self, key: &Q) -> Option<(&K, &mut V)>
350 where
351 K: Borrow<Q>,
352 Q: Ord + ?Sized,
353 {
354 self.get_index(key).map(|index| unsafe {
355 (
356 self.keys[index].assume_init_ref(),
357 self.values[index].assume_init_mut(),
358 )
359 })
360 }
361
362 pub fn contains_key<Q>(&self, key: &Q) -> bool
363 where
364 K: Borrow<Q>,
365 Q: Ord + ?Sized,
366 {
367 self.get_index(key).is_some()
368 }
369
370 pub fn remove<Q>(&mut self, key: &Q) -> Option<(K, V)>
373 where
374 K: Borrow<Q>,
375 Q: Ord + ?Sized,
376 {
377 self.get_index(key).map(move |index| self.remove_at(index))
378 }
379
380 fn remove_at(&mut self, index: usize) -> (K, V) {
383 self.keys[index..self.len].rotate_left(1);
384 self.values[index..self.len].rotate_left(1);
385 self.len -= 1;
386 unsafe {
387 (
388 self.keys[self.len].assume_init_read(),
389 self.values[self.len].assume_init_read(),
390 )
391 }
392 }
393
394 pub fn clear(&mut self) {
395 if self.len == 0 {
396 return;
397 }
398
399 let ptr = self.keys.as_mut_ptr() as *mut K;
400 let key_slice = ptr::slice_from_raw_parts_mut(ptr, self.len);
401 let ptr = self.values.as_mut_ptr() as *mut V;
402 let value_slice = ptr::slice_from_raw_parts_mut(ptr, self.len);
403 self.len = 0;
404 unsafe {
405 ptr::drop_in_place(key_slice);
406 ptr::drop_in_place(value_slice);
407 }
408 }
409
410 pub fn iter(&self) -> Iter<'_, K, V> {
411 Iter::new(self.keys_slice(), self.values_slice())
412 }
413
414 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
415 let (keys, values) = self.slices_mut();
416 IterMut::new(keys, values)
417 }
418
419 pub fn keys(&self) -> Keys<'_, K> {
420 Keys::new(self.keys_slice())
421 }
422 pub fn values(&self) -> Values<'_, V> {
423 Values::new(self.values_slice())
424 }
425 pub fn values_mut(&mut self) -> ValuesMut<'_, V> {
426 ValuesMut::new(self.values_mut_slice())
427 }
428 pub fn first_key_value(&self) -> Option<(&K, &V)> {
429 if self.len == 0 {
430 None
431 } else {
432 let key_slot = &self.keys[0];
433 let value_slot = &self.values[0];
434 Some(unsafe { (key_slot.assume_init_ref(), value_slot.assume_init_ref()) })
435 }
436 }
437 pub fn last_key_value(&self) -> Option<(&K, &V)> {
438 if self.len == 0 {
439 None
440 } else {
441 let key_slot = &self.keys[self.len - 1];
442 let value_slot = &self.values[self.len - 1];
443 Some(unsafe { (key_slot.assume_init_ref(), value_slot.assume_init_ref()) })
444 }
445 }
446 pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V, N>> {
447 if self.len == 0 {
448 None
449 } else {
450 Some(OccupiedEntry {
451 map: self,
452 index: 0,
453 })
454 }
455 }
456 pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V, N>> {
457 if self.len == 0 {
458 None
459 } else {
460 let index = self.len - 1;
461 Some(OccupiedEntry { map: self, index })
462 }
463 }
464 pub fn pop_first(&mut self) -> Option<(K, V)> {
465 if self.len == 0 {
466 None
467 } else {
468 self.keys[..self.len].rotate_left(1);
469 self.values[..self.len].rotate_left(1);
470 self.len -= 1;
471 let key_slot = &self.keys[self.len];
472 let value_slot = &self.values[self.len];
473 Some(unsafe { (key_slot.assume_init_read(), value_slot.assume_init_read()) })
474 }
475 }
476 pub fn pop_last(&mut self) -> Option<(K, V)> {
477 if self.len == 0 {
478 None
479 } else {
480 self.len -= 1;
481 let key_slot = &self.keys[self.len];
482 let value_slot = &self.values[self.len];
483 Some(unsafe { (key_slot.assume_init_read(), value_slot.assume_init_read()) })
484 }
485 }
486
487 pub fn retain<F>(&mut self, mut f: F)
539 where
540 K: Ord,
541 F: FnMut(&K, &mut V) -> bool,
542 {
543 let mut dropper = RetainRestDropper {
545 range: 0..self.len,
546 keys: &mut self.keys,
547 values: &mut self.values,
548 };
549 let prev_len = self.len;
550 self.len = 0;
551 for index in 0..prev_len {
552 if f(unsafe { dropper.keys[index].assume_init_ref() }, unsafe {
553 dropper.values[index].assume_init_mut()
554 }) {
555 if index != self.len {
556 dropper.keys[self.len].write(unsafe { dropper.keys[index].assume_init_read() });
557 dropper.values[self.len]
558 .write(unsafe { dropper.values[index].assume_init_read() });
559 }
560 self.len += 1;
561 } else {
562 unsafe {
563 dropper.keys[index].assume_init_drop();
564 dropper.values[index].assume_init_drop();
565 }
566 }
567 dropper.consume();
568 }
569 }
570}
571
572impl<K, V, const N: usize> Default for OrdMap<K, V, N> {
573 fn default() -> Self {
574 Self {
575 len: 0,
576 keys: unsafe { MaybeUninit::uninit().assume_init() },
577 values: unsafe { MaybeUninit::uninit().assume_init() },
578 }
579 }
580}
581impl<K, V, const N: usize> Clone for OrdMap<K, V, N>
582where
583 K: Clone,
584 V: Clone,
585{
586 fn clone(&self) -> Self {
587 let mut keys: [MaybeUninit<K>; N] = unsafe { MaybeUninit::uninit().assume_init() };
588 let mut values: [MaybeUninit<V>; N] = unsafe { MaybeUninit::uninit().assume_init() };
589
590 for (source, destination) in self.keys_slice().iter().zip(&mut keys[..self.len]) {
591 destination.write(source.clone());
592 }
593
594 for (source, destination) in self.values_slice().iter().zip(&mut values[..self.len]) {
595 destination.write(source.clone());
596 }
597
598 Self {
599 keys,
600 values,
601 len: self.len,
602 }
603 }
604}
605
606impl<K, V, const N: usize> Drop for OrdMap<K, V, N> {
607 fn drop(&mut self) {
608 self.clear();
609 }
610}
611
612impl<K, V, const N: usize> fmt::Debug for OrdMap<K, V, N>
613where
614 K: fmt::Debug,
615 V: fmt::Debug,
616{
617 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
618 f.debug_map().entries(self.iter()).finish()
619 }
620}
621
622impl<K, Q, V, const N: usize> Index<&Q> for OrdMap<K, V, N>
623where
624 K: Borrow<Q>,
625 Q: Ord + ?Sized,
626{
627 type Output = V;
628
629 fn index(&self, key: &Q) -> &Self::Output {
630 self.get(key).unwrap()
631 }
632}
633
634impl<K, V, const N: usize> IntoIterator for OrdMap<K, V, N> {
635 type Item = (K, V);
636
637 type IntoIter = IntoIter<K, V, N>;
638
639 fn into_iter(self) -> Self::IntoIter {
640 IntoIter::new(self)
641 }
642}
643
644impl<'a, K, V, const N: usize> IntoIterator for &'a OrdMap<K, V, N> {
645 type Item = (&'a K, &'a V);
646
647 type IntoIter = Iter<'a, K, V>;
648
649 fn into_iter(self) -> Self::IntoIter {
650 self.iter()
651 }
652}
653
654impl<'a, K, V, const N: usize> IntoIterator for &'a mut OrdMap<K, V, N> {
655 type Item = (&'a K, &'a mut V);
656
657 type IntoIter = IterMut<'a, K, V>;
658
659 fn into_iter(self) -> Self::IntoIter {
660 self.iter_mut()
661 }
662}
663
664impl<K, V, const N1: usize, const N2: usize> PartialOrd<OrdMap<K, V, N2>> for OrdMap<K, V, N1>
665where
666 K: PartialOrd<K>,
667 V: PartialOrd<V>,
668{
669 fn partial_cmp(&self, other: &OrdMap<K, V, N2>) -> Option<core::cmp::Ordering> {
670 self.iter().partial_cmp(other.iter())
671 }
672}
673impl<K, V, const N1: usize, const N2: usize> PartialEq<OrdMap<K, V, N2>> for OrdMap<K, V, N1>
674where
675 K: PartialEq<K>,
676 V: PartialEq<V>,
677{
678 fn eq(&self, other: &OrdMap<K, V, N2>) -> bool {
679 self.iter().eq(other.iter())
680 }
681}
682
683impl<K, V, const N: usize> Eq for OrdMap<K, V, N>
684where
685 K: Eq,
686 V: Eq,
687{
688}
689
690impl<K, V, const N: usize> Ord for OrdMap<K, V, N>
691where
692 K: Ord,
693 V: Ord,
694{
695 fn cmp(&self, other: &OrdMap<K, V, N>) -> core::cmp::Ordering {
696 self.iter().cmp(other.iter())
697 }
698}
699
700impl<K, V, const N: usize> Hash for OrdMap<K, V, N>
701where
702 K: Hash,
703 V: Hash,
704{
705 fn hash<H: Hasher>(&self, state: &mut H) {
706 state.write_usize(self.len);
707 for pair in self {
708 pair.hash(state);
709 }
710 }
711}
712
713impl<K, V, const N: usize> Extend<(K, V)> for OrdMap<K, V, N>
715where
716 K: Ord,
717{
718 fn extend<I>(&mut self, iter: I)
719 where
720 I: IntoIterator<Item = (K, V)>,
721 {
722 for (key, value) in iter {
723 if let Err(_) = self.insert(key, value) {
724 panic!("map overflowed on extend");
725 }
726 }
727 }
728}
729
730impl<'a, K, V, const N: usize> Extend<(&'a K, &'a V)> for OrdMap<K, V, N>
732where
733 K: Ord + Copy,
734 V: Copy,
735{
736 fn extend<I>(&mut self, iter: I)
737 where
738 I: IntoIterator<Item = (&'a K, &'a V)>,
739 {
740 for (key, value) in iter {
741 if let Err(_) = self.insert(*key, *value) {
742 panic!("map overflowed on extend");
743 }
744 }
745 }
746}
747
748impl<K, V, const N: usize> FromIterator<(K, V)> for OrdMap<K, V, N>
750where
751 K: Ord,
752{
753 fn from_iter<I>(iter: I) -> Self
754 where
755 I: IntoIterator<Item = (K, V)>,
756 {
757 let mut map = Self::new();
758 for (key, value) in iter {
759 if let Err(_) = map.insert(key, value) {
760 panic!("map overflowed on extend");
761 }
762 }
763 map
764 }
765}
766
767impl<K, V, const N1: usize, const N2: usize> From<[(K, V); N1]> for OrdMap<K, V, N2>
768where
769 K: Ord,
770{
771 fn from(mut value: [(K, V); N1]) -> Self {
772 value.sort_unstable_by(|a, b| a.0.cmp(&b.0));
773 let mut map = Self::new();
774 for (key, value) in value {
775 if map.len == 0 || unsafe { map.keys[map.len - 1].assume_init_ref() } < &key {
776 if map.len == N2 {
777 panic!("map overflowed on extend");
778 }
779 map.keys[map.len].write(key);
780 map.values[map.len].write(value);
781 map.len += 1;
782 }
783 }
784 map
785 }
786}