tesseract_swift_utils/
array.rs1use super::error::CError;
2use super::ptr::SyncPtr;
3use super::result::Result;
4use super::traits::{QuickClone, TryAsRef, AsCRef};
5use std::borrow::Borrow;
6use std::mem::ManuallyDrop;
7
8#[repr(C)]
9#[derive(Debug)]
10pub struct CArrayRef<'a, Value> {
11 pub ptr: SyncPtr<Value>,
12 pub len: usize,
13 _lifecycle: std::marker::PhantomData<&'a Value>
14}
15
16impl<'a, Value> CArrayRef<'a, Value> {
17 pub fn cloned(&self) -> Result<Vec<Value>> where Value: Clone {
18 Ok(self.try_as_ref()?.iter().map(|v| v.clone()).collect())
19 }
20
21 pub fn quick_cloned(&self) -> Result<Vec<Value>> where Value: Copy {
22 Ok(self.try_as_ref()?.to_owned())
23 }
24}
25
26impl<'a, Value> TryAsRef<[Value]> for CArrayRef<'a, Value> {
27 type Error = CError;
28
29 fn try_as_ref(&self) -> std::result::Result<&'a [Value], Self::Error> {
30 if self.ptr.is_null() {
31 Err(CError::null::<Self>())
32 } else {
33 unsafe { Ok(std::slice::from_raw_parts(self.ptr.ptr(), self.len)) }
34 }
35 }
36}
37
38impl<'a, Value, T> From<T> for CArrayRef<'a, Value> where T: Borrow<[Value]> {
39 fn from(value: T) -> Self {
40 let bw: &[Value] = value.borrow();
41 Self{ ptr: bw.as_ptr().into(), len: bw.len(), _lifecycle: std::marker::PhantomData }
42 }
43}
44
45#[repr(C)]
46#[derive(Debug)]
47pub struct CArray<Value> {
48 pub ptr: SyncPtr<Value>,
49 pub len: usize,
50}
51
52impl<Value: Clone> Clone for CArray<Value> {
53 fn clone(&self) -> Self {
54 let vec: Vec<Value> = self
55 .try_as_ref()
56 .unwrap()
57 .iter()
58 .map(|v| v.clone())
59 .collect();
60 vec.into()
61 }
62}
63
64impl<Value: Copy> QuickClone for CArray<Value> {
65 fn quick_clone(&self) -> Self {
66 self.try_as_ref().unwrap().into()
67 }
68}
69
70impl<Value> Drop for CArray<Value> {
71 fn drop(&mut self) {
72 let _ = unsafe { Vec::from_raw_parts(self.ptr.ptr() as *mut Value, self.len, self.len) };
73 self.ptr = SyncPtr::null();
74 }
75}
76
77impl<'a, V> AsCRef<CArrayRef<'a, V>> for CArray<V> {
78 fn as_cref(&self) -> CArrayRef<'a, V> {
79 CArrayRef { ptr: self.ptr.ptr().into(), len: self.len, _lifecycle: std::marker::PhantomData }
80 }
81}
82
83impl<'a, V> AsCRef<CArrayRef<'a, V>> for Vec<V> {
84 fn as_cref(&self) -> CArrayRef<'a, V> {
85 CArrayRef { ptr: self.as_ptr().into(), len: self.len(), _lifecycle: std::marker::PhantomData }
86 }
87}
88
89impl<'a, V> AsCRef<CArrayRef<'a, V>> for &'a[V] {
90 fn as_cref(&self) -> CArrayRef<'a, V> {
91 CArrayRef { ptr: self.as_ptr().into(), len: self.len(), _lifecycle: std::marker::PhantomData }
92 }
93}
94
95impl<Value> TryAsRef<[Value]> for CArray<Value> {
96 type Error = CError;
97
98 fn try_as_ref(&self) -> Result<&[Value]> {
99 if self.ptr.is_null() {
100 Err(CError::null::<Self>())
101 } else {
102 unsafe { Ok(std::slice::from_raw_parts(self.ptr.ptr(), self.len)) }
103 }
104 }
105}
106
107impl<'a, Value> TryFrom<&'a CArray<Value>> for &'a [Value] {
108 type Error = CError;
109
110 fn try_from(value: &'a CArray<Value>) -> Result<Self> {
111 value.try_as_ref()
112 }
113}
114
115impl<Value> TryFrom<CArray<Value>> for Vec<Value> {
116 type Error = CError;
117
118 fn try_from(value: CArray<Value>) -> Result<Self> {
119 if value.ptr.is_null() {
120 Err(CError::null::<CArray<Value>>())
121 } else {
122 let value = ManuallyDrop::new(value); unsafe {
124 Ok(Vec::from_raw_parts(
125 value.ptr.ptr() as *mut Value,
126 value.len,
127 value.len,
128 ))
129 }
130 }
131 }
132}
133
134impl<V1, V2: Into<V1> + Clone> From<&[V2]> for CArray<V1> {
135 fn from(array: &[V2]) -> Self {
136 Vec::from(array).into()
137 }
138}
139
140impl<V1, V2: Into<V1>> From<Vec<V2>> for CArray<V1> {
141 fn from(array: Vec<V2>) -> Self {
142 let mapped: Vec<V1> = array.into_iter().map(|v| v.into()).collect();
143 let mut mapped = ManuallyDrop::new(mapped.into_boxed_slice());
144 Self {
145 ptr: mapped.as_mut_ptr().into(),
146 len: mapped.len(),
147 }
148 }
149}