tesseract_swift_utils/
map.rs1use super::result::Result;
2use super::array::CArray;
3use super::traits::TryAsRef;
4use std::mem::ManuallyDrop;
5use std::collections::{BTreeMap, HashMap};
6
7#[repr(C)]
8#[derive(Copy, Clone)]
9pub struct CKeyValue<K, V> {
10 pub key: K,
11 pub val: V,
12}
13
14impl<K, V> From<(K, V)> for CKeyValue<K, V> {
15 fn from(tuple: (K, V)) -> Self {
16 Self {
17 key: tuple.0,
18 val: tuple.1,
19 }
20 }
21}
22
23impl<K, V> From<CKeyValue<K, V>> for (K, V) {
24 fn from(kv: CKeyValue<K, V>) -> Self {
25 (kv.key, kv.val)
26 }
27}
28
29pub trait AsHashMap {
30 type Key: std::hash::Hash + Eq + Clone;
31 type Value: Clone;
32
33 unsafe fn as_hash_map(&self) -> Result<HashMap<Self::Key, Self::Value>>;
34}
35
36pub trait AsBTreeMap {
37 type Key: Ord;
38 type Value;
39
40 unsafe fn as_btree_map(&self) -> Result<BTreeMap<Self::Key, Self::Value>>;
41}
42
43impl<K: Ord + Clone, V: Clone> AsBTreeMap for CArray<CKeyValue<K, V>> {
44 type Key = K;
45 type Value = V;
46
47 unsafe fn as_btree_map(&self) -> Result<BTreeMap<K, V>> {
48 self.try_as_ref()
49 .map(|sl| sl.into_iter().cloned().map(|kv| kv.into()).collect())
50 }
51}
52
53impl<K: std::hash::Hash + Eq + Clone, V: Clone> AsHashMap for CArray<CKeyValue<K, V>> {
54 type Key = K;
55 type Value = V;
56
57 unsafe fn as_hash_map(&self) -> Result<HashMap<K, V>> {
58 self.try_as_ref()
59 .map(|sl| sl.into_iter().cloned().map(|kv| kv.into()).collect())
60 }
61}
62
63impl<K1, K2, V1, V2> From<BTreeMap<K2, V2>> for CArray<CKeyValue<K1, V1>>
64where
65 K2: Into<K1>,
66 V2: Into<V1>,
67{
68 fn from(map: BTreeMap<K2, V2>) -> Self {
69 let kvs: Vec<CKeyValue<K1, V1>> = map
70 .into_iter()
71 .map(|(k, v)| (k.into(), v.into()).into())
72 .collect();
73 let mut kvs = ManuallyDrop::new(kvs.into_boxed_slice());
74 Self {
75 ptr: kvs.as_mut_ptr().into(),
76 len: kvs.len(),
77 }
78 }
79}
80
81impl<K1, K2, V1, V2> From<HashMap<K2, V2>> for CArray<CKeyValue<K1, V1>>
82where
83 K2: Into<K1>,
84 V2: Into<V1>,
85{
86 fn from(map: HashMap<K2, V2>) -> Self {
87 let kvs: Vec<CKeyValue<K1, V1>> = map
88 .into_iter()
89 .map(|(k, v)| (k.into(), v.into()).into())
90 .collect();
91 let mut kvs = ManuallyDrop::new(kvs.into_boxed_slice());
92 Self {
93 ptr: kvs.as_mut_ptr().into(),
94 len: kvs.len(),
95 }
96 }
97}