litl_val/
map.rs

1use deepsize::DeepSizeOf;
2
3use super::{key::Key, map_ref::MapRef, slim_boxed_slice::SlimBoxedSlice, val::Val};
4
5#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6pub struct Map(SlimBoxedSlice<(Key, Val)>);
7
8impl Map {
9    pub fn new(mut entries: Vec<(Key, Val)>) -> Self {
10        entries
11            .as_mut_slice()
12            .sort_by(|(k1, _), (k2, _)| k1.cmp(k2));
13        Self(SlimBoxedSlice::from_vec(entries))
14    }
15
16    pub fn clone_from_ref(map: &MapRef) -> Self {
17        Self(SlimBoxedSlice::from_vec(map.0.to_vec()))
18    }
19
20    pub fn get<K: AsRef<str>>(&self, key: K) -> Option<&Val> {
21        self.0.as_ref().iter().find_map(|(k, v)| {
22            if k.as_ref() == key.as_ref() {
23                Some(v)
24            } else {
25                None
26            }
27        })
28    }
29
30    pub fn into_entries(self) -> ValMapEntries {
31        ValMapEntries(self.0.into_vec())
32    }
33
34    pub fn into_raw(self) -> *mut () {
35        self.0.into_raw()
36    }
37
38    pub unsafe fn from_raw(ptr: *mut ()) -> Self {
39        Self(SlimBoxedSlice::from_raw(ptr))
40    }
41
42    pub fn entries(&self) -> &[(Key, Val)] {
43        self.0.as_ref()
44    }
45
46    pub fn as_ref(&self) -> MapRef {
47        MapRef(self.0.as_ref())
48    }
49}
50
51impl DeepSizeOf for Map {
52    fn deep_size_of_children(&self, context: &mut deepsize::Context) -> usize {
53        self.0.deep_size_of_children(context)
54    }
55}
56
57pub struct ValMapEntries(pub Vec<(Key, Val)>);
58
59impl ValMapEntries {
60    pub fn take<K: AsRef<str>>(&mut self, key: K) -> Option<Val> {
61        self.0
62            .iter()
63            .position(|(k, _)| k.as_ref() == key.as_ref())
64            .map(|i| self.0.swap_remove(i).1)
65    }
66}