use crate::{DB, ffi};
use core::ops::Deref;
use libc::size_t;
use std::marker::PhantomData;
use std::slice;
pub struct DBPinnableSlice<'a> {
ptr: *mut ffi::rocksdb_pinnableslice_t,
db: PhantomData<&'a DB>,
}
unsafe impl Send for DBPinnableSlice<'_> {}
unsafe impl Sync for DBPinnableSlice<'_> {}
impl AsRef<[u8]> for DBPinnableSlice<'_> {
fn as_ref(&self) -> &[u8] {
self
}
}
impl Deref for DBPinnableSlice<'_> {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
let mut val_len: size_t = 0;
let val = ffi::rocksdb_pinnableslice_value(self.ptr, &raw mut val_len) as *mut u8;
slice::from_raw_parts(val, val_len)
}
}
}
impl Drop for DBPinnableSlice<'_> {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_pinnableslice_destroy(self.ptr);
}
}
}
impl DBPinnableSlice<'_> {
pub(crate) unsafe fn from_c(ptr: *mut ffi::rocksdb_pinnableslice_t) -> Self {
Self {
ptr,
db: PhantomData,
}
}
}