opencv/traits/opencv_type/
string.rs

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