tesseract_swift_utils/
map.rs

1use 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}