1use std::marker::PhantomData;
2
3use visa_sys as vs;
4
5pub type RawSs = vs::ViSession;
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10pub struct OwnedSs {
11 s: RawSs,
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16pub struct BorrowedSs<'b> {
17 s: RawSs,
18 _phantom: PhantomData<&'b RawSs>,
19}
20
21impl Drop for OwnedSs {
22 fn drop(&mut self) {
23 unsafe {
24 vs::viClose(self.s);
25 }
26 }
27}
28
29impl BorrowedSs<'_> {
30 pub unsafe fn borrow_raw(ss: RawSs) -> Self {
35 Self {
36 s: ss,
37 _phantom: PhantomData,
38 }
39 }
40}
41
42pub trait AsRawSs {
44 fn as_raw_ss(&self) -> RawSs;
45}
46
47pub trait FromRawSs {
49 unsafe fn from_raw_ss(ss: RawSs) -> Self;
53}
54
55pub trait IntoRawSs {
57 fn into_raw_ss(self) -> RawSs;
58}
59
60pub trait AsSs {
62 fn as_ss(&self) -> BorrowedSs<'_>;
63}
64
65impl AsRawSs for BorrowedSs<'_> {
66 fn as_raw_ss(&self) -> RawSs {
67 self.s
68 }
69}
70
71impl AsRawSs for OwnedSs {
72 fn as_raw_ss(&self) -> RawSs {
73 self.s
74 }
75}
76
77impl IntoRawSs for OwnedSs {
78 fn into_raw_ss(self) -> RawSs {
79 let ss = self.s;
80 std::mem::forget(self);
81 ss
82 }
83}
84
85impl FromRawSs for OwnedSs {
86 unsafe fn from_raw_ss(s: RawSs) -> Self {
87 Self { s }
88 }
89}
90
91impl<T: AsSs> AsSs for &T {
92 #[inline]
93 fn as_ss(&self) -> BorrowedSs<'_> {
94 T::as_ss(self)
95 }
96}
97
98impl<T: AsSs> AsSs for &mut T {
99 #[inline]
100 fn as_ss(&self) -> BorrowedSs<'_> {
101 T::as_ss(self)
102 }
103}
104
105impl AsSs for BorrowedSs<'_> {
106 #[inline]
107 fn as_ss(&self) -> BorrowedSs<'_> {
108 *self
109 }
110}
111
112impl AsSs for OwnedSs {
113 #[inline]
114 fn as_ss(&self) -> BorrowedSs<'_> {
115 unsafe { BorrowedSs::borrow_raw(self.s) }
116 }
117}