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}