micromap_rawl/
ctors.rs

1use crate::Map;
2use core::mem::MaybeUninit;
3
4impl<K: PartialEq, V, const N: usize> Default for Map<K, V, N> {
5    /// Make a default empty [`Map`].
6    #[inline]
7    #[must_use]
8    fn default() -> Self {
9        Self::new()
10    }
11}
12
13impl<K: PartialEq, V, const N: usize> Map<K, V, N> {
14    /// Make it.
15    ///
16    /// The size of the map is defined by the generic argument. For example,
17    /// this is how you make a map of four key-values pairs:
18    #[inline]
19    #[must_use]
20    #[allow(clippy::uninit_assumed_init)]
21    pub const fn new() -> Self {
22        unsafe {
23            Self {
24                len: 0,
25                pairs: MaybeUninit::<[MaybeUninit<(K, V)>; N]>::uninit().assume_init(),
26            }
27        }
28    }
29}
30
31impl<K: PartialEq, V, const N: usize> Drop for Map<K, V, N> {
32    fn drop(&mut self) {
33        for i in 0..self.len {
34            self.item_drop(i);
35        }
36    }
37}
38
39#[cfg(test)]
40mod test {
41    use super::*;
42
43    #[test]
44    fn makes_default_map() {
45        let m: Map<u8, u8, 8> = Map::default();
46        assert_eq!(0, m.len());
47    }
48
49    #[test]
50    fn makes_new_map() {
51        let m: Map<u8, u8, 8> = Map::new();
52        assert_eq!(0, m.len());
53    }
54
55    #[test]
56    fn drops_correctly() {
57        let _m: Map<Vec<u8>, u8, 8> = Map::new();
58    }
59
60    #[test]
61    fn drops_keys() {
62        use std::rc::Rc;
63        let mut m: Map<Rc<()>, (), 8> = Map::new();
64        let k = Rc::new(());
65        m.insert(Rc::clone(&k), ());
66        drop(m);
67        assert_eq!(Rc::strong_count(&k), 1);
68    }
69
70    #[test]
71    fn drops_values() {
72        use std::rc::Rc;
73        let mut m: Map<(), Rc<()>, 8> = Map::new();
74        let v = Rc::new(());
75        m.insert((), Rc::clone(&v));
76        drop(m);
77        assert_eq!(Rc::strong_count(&v), 1);
78    }
79}