use std::marker::PhantomData;
use visa_sys as vs;
pub type RawSs = vs::ViSession;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct OwnedSs {
s: RawSs,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct BorrowedSs<'b> {
s: RawSs,
_phantom: PhantomData<&'b RawSs>,
}
impl Drop for OwnedSs {
fn drop(&mut self) {
unsafe {
vs::viClose(self.s);
}
}
}
impl BorrowedSs<'_> {
pub unsafe fn borrow_raw(ss: RawSs) -> Self {
Self {
s: ss,
_phantom: PhantomData,
}
}
}
pub trait AsRawSs {
fn as_raw_ss(&self) -> RawSs;
}
pub trait FromRawSs {
unsafe fn from_raw_ss(ss: RawSs) -> Self;
}
pub trait IntoRawSs {
fn into_raw_ss(self) -> RawSs;
}
pub trait AsSs {
fn as_ss(&self) -> BorrowedSs<'_>;
}
impl AsRawSs for BorrowedSs<'_> {
fn as_raw_ss(&self) -> RawSs {
self.s
}
}
impl AsRawSs for OwnedSs {
fn as_raw_ss(&self) -> RawSs {
self.s
}
}
impl IntoRawSs for OwnedSs {
fn into_raw_ss(self) -> RawSs {
let ss = self.s;
std::mem::forget(self);
ss
}
}
impl FromRawSs for OwnedSs {
unsafe fn from_raw_ss(s: RawSs) -> Self {
Self { s }
}
}
impl<T: AsSs> AsSs for &T {
#[inline]
fn as_ss(&self) -> BorrowedSs<'_> {
T::as_ss(self)
}
}
impl<T: AsSs> AsSs for &mut T {
#[inline]
fn as_ss(&self) -> BorrowedSs<'_> {
T::as_ss(self)
}
}
impl AsSs for BorrowedSs<'_> {
#[inline]
fn as_ss(&self) -> BorrowedSs<'_> {
*self
}
}
impl AsSs for OwnedSs {
#[inline]
fn as_ss(&self) -> BorrowedSs<'_> {
unsafe { BorrowedSs::borrow_raw(self.s) }
}
}