#[cfg(any(
all(test, feature = "check_contracts_in_tests"),
feature = "check_contracts"
))]
use contracts::*;
#[cfg(not(any(
all(test, feature = "check_contracts_in_tests"),
feature = "check_contracts"
)))]
use disabled_contracts::*;
use std::ffi::c_void;
use std::ptr::NonNull;
#[derive(Debug)]
#[repr(transparent)]
pub struct LinearRef {
inner: NonNull<c_void>,
}
impl LinearRef {
#[allow(clippy::assertions_on_constants)]
#[requires(true, "`inner` must be unique (check manually)")]
#[inline(always)]
pub fn new(inner: NonNull<c_void>) -> Self {
Self { inner }
}
#[inline(always)]
pub fn convert_to_non_null(self) -> NonNull<c_void> {
#[allow(clippy::let_and_return)]
let ret = self.inner;
#[cfg(any(
all(test, feature = "check_contracts_in_tests"),
feature = "check_contracts"
))]
std::mem::forget(self);
ret
}
#[cfg(test)]
pub fn from_address(address: usize) -> Self {
Self::new(NonNull::new(address as *mut c_void).expect("should not be zero"))
}
pub(crate) fn get(&self) -> &NonNull<c_void> {
&self.inner
}
}
#[cfg(any(
all(test, feature = "check_contracts_in_tests"),
feature = "check_contracts"
))]
impl Drop for LinearRef {
#[allow(clippy::assertions_on_constants)]
#[requires(false, "LinearRef should never be dropped.")]
fn drop(&mut self) {}
}
impl PartialEq for LinearRef {
fn eq(&self, other: &Self) -> bool {
self.inner.as_ptr() == other.inner.as_ptr()
}
}
impl Eq for LinearRef {}
unsafe impl Send for LinearRef {}