use core::{ffi::c_void, ops::Deref, slice};
#[derive(Copy, Clone, Debug)]
#[repr(transparent)]
#[doc(alias = "SQLITE_STATIC")]
pub struct Borrowed<'a, T: ?Sized>(&'a T);
impl<'a, T: ?Sized> Borrowed<'a, T> {
pub const fn new(value: &'a T) -> Self {
Self(value)
}
pub const fn into_inner(self) -> &'a T {
self.0
}
#[inline]
pub(crate) fn as_ptr(&self) -> *const T {
self.0 as *const T
}
}
impl<'a> Borrowed<'a, str> {
#[inline]
pub(crate) unsafe fn from_raw_str(data: *const u8, len: i32) -> Self {
let bytes = unsafe { slice::from_raw_parts::<'a, u8>(data, len as usize) };
let text = unsafe { core::str::from_utf8_unchecked(bytes) };
Self(text)
}
}
impl<'a> Borrowed<'a, [u8]> {
#[inline]
pub(crate) unsafe fn from_raw_bytes(data: *const c_void, len: i32) -> Self {
let bytes = unsafe { slice::from_raw_parts::<'a, u8>(data as *const u8, len as usize) };
Self(bytes)
}
}
impl<'a, T: ?Sized> Deref for Borrowed<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.0
}
}