use std::fmt;
use crate::value::BatchOp;
pub type BorrowedBytes<'a> = BorrowedSlice<'a, u8>;
pub type BorrowedBatchOps<'a> = BorrowedSlice<'a, BatchOp<'a>>;
#[derive(Debug)]
#[repr(C)]
pub struct BorrowedSlice<'a, T> {
ptr: *const T,
len: usize,
marker: std::marker::PhantomData<&'a [T]>,
}
impl<T> Clone for BorrowedSlice<'_, T> {
fn clone(&self) -> Self {
*self
}
}
impl<T> Copy for BorrowedSlice<'_, T> {}
impl<'a, T> BorrowedSlice<'a, T> {
#[must_use]
pub const fn as_slice(&self) -> &'a [T] {
if self.ptr.is_null() {
&[]
} else {
unsafe { std::slice::from_raw_parts(self.ptr, self.len) }
}
}
#[must_use]
pub const fn from_slice(slice: &'a [T]) -> Self {
let len = slice.len();
Self {
ptr: std::ptr::from_ref(slice).cast(),
len,
marker: std::marker::PhantomData,
}
}
#[must_use]
pub const fn is_null(&self) -> bool {
self.ptr.is_null()
}
}
impl<T> std::ops::Deref for BorrowedSlice<'_, T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
self.as_slice()
}
}
impl<T> AsRef<[T]> for BorrowedSlice<'_, T> {
fn as_ref(&self) -> &[T] {
self.as_slice()
}
}
impl<T> std::borrow::Borrow<[T]> for BorrowedSlice<'_, T> {
fn borrow(&self) -> &[T] {
self.as_slice()
}
}
impl<T: std::hash::Hash> std::hash::Hash for BorrowedSlice<'_, T> {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.as_slice().hash(state);
}
}
impl<T: PartialEq> PartialEq for BorrowedSlice<'_, T> {
fn eq(&self, other: &Self) -> bool {
self.as_slice() == other.as_slice()
}
}
impl<T: Eq> Eq for BorrowedSlice<'_, T> {}
impl<T: PartialOrd> PartialOrd for BorrowedSlice<'_, T> {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.as_slice().partial_cmp(other.as_slice())
}
}
impl<T: Ord> Ord for BorrowedSlice<'_, T> {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.as_slice().cmp(other.as_slice())
}
}
impl<'a, T> IntoIterator for BorrowedSlice<'a, T> {
type Item = &'a T;
type IntoIter = std::slice::Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.as_slice().iter()
}
}
impl fmt::Display for BorrowedBytes<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let precision = f.precision().unwrap_or(64);
write!(f, "{:.precision$}", super::DisplayHex(self.as_slice()))
}
}
impl fmt::Pointer for BorrowedBytes<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.ptr.fmt(f)
}
}
impl<'a> BorrowedBytes<'a> {
pub const fn as_str(&self) -> Result<&'a str, std::str::Utf8Error> {
std::str::from_utf8(self.as_slice())
}
}
unsafe impl<T: Sync> Send for BorrowedSlice<'_, T> {}
unsafe impl<T: Sync> Sync for BorrowedSlice<'_, T> {}