opencv/traits/opencv_type/
string.rs1use std::ffi::{c_char, c_void, CString};
2
3use super::{OpenCVIntoExternContainer, OpenCVType, OpenCVTypeExternContainer};
4use crate::templ::receive_string;
5use crate::traits::OpenCVFromExtern;
6
7fn cstring_new_nofail(bytes: impl Into<Vec<u8>>) -> CString {
8 CString::new(bytes).unwrap_or_else(|e| {
9 let nul_pos = e.nul_position();
10 let mut bytes = e.into_vec();
11 bytes.drain(nul_pos..);
12 unsafe { CString::from_vec_unchecked(bytes) }
13 })
14}
15
16impl<'a> OpenCVType<'a> for String {
17 type Arg = &'a str;
18}
19
20impl OpenCVFromExtern for String {
21 type ExternReceive = *mut c_void;
22
23 #[inline]
24 unsafe fn opencv_from_extern(s: Self::ExternReceive) -> Self {
25 unsafe { receive_string(s.cast::<String>()) }
26 }
27}
28
29impl OpenCVIntoExternContainer for String {
30 type ExternContainer = CString;
31
32 #[inline]
33 fn opencv_into_extern_container(self) -> crate::Result<Self::ExternContainer> {
34 CString::new(self).map_err(|e| e.into())
35 }
36
37 #[inline]
38 fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer {
39 cstring_new_nofail(self)
40 }
41}
42
43impl OpenCVIntoExternContainer for &str {
44 type ExternContainer = CString;
45
46 #[inline]
47 fn opencv_into_extern_container(self) -> crate::Result<Self::ExternContainer> {
48 CString::new(self).map_err(|e| e.into())
49 }
50
51 #[inline]
52 fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer {
53 cstring_new_nofail(self)
54 }
55}
56
57impl OpenCVTypeExternContainer for CString {
58 type ExternSend = *const c_char;
59 type ExternSendMut = *mut c_char;
60
61 #[inline]
62 fn opencv_as_extern(&self) -> Self::ExternSend {
63 self.as_ptr()
64 }
65
66 #[inline]
67 fn opencv_as_extern_mut(&mut self) -> Self::ExternSendMut {
68 unimplemented!("Casting CString::as_ptr() to mut is UB")
69 }
70}
71
72impl OpenCVType<'_> for Vec<u8> {
73 type Arg = Self;
74}
75
76impl OpenCVFromExtern for Vec<u8> {
77 type ExternReceive = *mut c_void;
78
79 #[inline]
80 unsafe fn opencv_from_extern(s: Self::ExternReceive) -> Self {
81 unsafe { receive_string(s.cast::<Vec<u8>>()) }
82 }
83}
84
85impl OpenCVIntoExternContainer for Vec<u8> {
86 type ExternContainer = Self;
87
88 #[inline]
89 fn opencv_into_extern_container_nofail(self) -> Self::ExternContainer {
90 self
91 }
92}
93
94impl OpenCVTypeExternContainer for Vec<u8> {
95 type ExternSend = *const u8;
96 type ExternSendMut = *mut u8;
97
98 #[inline]
99 fn opencv_as_extern(&self) -> Self::ExternSend {
100 self.as_ptr()
101 }
102
103 #[inline]
104 fn opencv_as_extern_mut(&mut self) -> Self::ExternSendMut {
105 self.as_mut_ptr()
106 }
107}