use core::any::TypeId;
use core::ptr::NonNull;
use crate::any_value::{AnyValue, AnyValueMut, AnyValueTypelessMut, AnyValueTypeless, AnyValueSizeless, AnyValueSizelessMut};
use crate::any_value::Unknown;
pub struct AnyValueSizelessRaw {
ptr: NonNull<u8>
}
impl AnyValueSizelessRaw {
#[inline]
pub unsafe fn new(ptr: NonNull<u8>) -> Self{
Self{ptr}
}
}
impl AnyValueSizeless for AnyValueSizelessRaw {
type Type = Unknown;
#[inline]
fn as_bytes_ptr(&self) -> *const u8 {
self.ptr.as_ptr()
}
}
impl AnyValueSizelessMut for AnyValueSizelessRaw {
#[inline]
fn as_bytes_mut_ptr(&mut self) -> *mut u8 {
self.ptr.as_ptr()
}
}
pub struct AnyValueTypelessRaw {
ptr: NonNull<u8>,
size: usize,
}
impl AnyValueTypelessRaw {
#[inline]
pub unsafe fn new(ptr: NonNull<u8>, size: usize) -> Self{
Self{ptr, size}
}
}
impl AnyValueSizeless for AnyValueTypelessRaw {
type Type = Unknown;
#[inline]
fn as_bytes_ptr(&self) -> *const u8 {
self.ptr.as_ptr()
}
}
impl AnyValueSizelessMut for AnyValueTypelessRaw {
#[inline]
fn as_bytes_mut_ptr(&mut self) -> *mut u8 {
self.ptr.as_ptr()
}
}
impl AnyValueTypeless for AnyValueTypelessRaw {
#[inline]
fn size(&self) -> usize {
self.size
}
}
impl AnyValueTypelessMut for AnyValueTypelessRaw {}
pub struct AnyValueRaw {
raw_unsafe: AnyValueTypelessRaw,
typeid: TypeId
}
impl AnyValueRaw {
#[inline]
pub unsafe fn new(ptr: NonNull<u8>, size: usize, typeid: TypeId) -> Self{
Self{
raw_unsafe: AnyValueTypelessRaw::new(ptr, size),
typeid
}
}
}
impl AnyValueSizeless for AnyValueRaw {
type Type = Unknown;
#[inline]
fn as_bytes_ptr(&self) -> *const u8 {
self.raw_unsafe.ptr.as_ptr()
}
}
impl AnyValueSizelessMut for AnyValueRaw {
#[inline]
fn as_bytes_mut_ptr(&mut self) -> *mut u8 {
self.raw_unsafe.ptr.as_ptr()
}
}
impl AnyValueTypeless for AnyValueRaw {
#[inline]
fn size(&self) -> usize {
self.raw_unsafe.size
}
}
impl AnyValue for AnyValueRaw {
#[inline]
fn value_typeid(&self) -> TypeId {
self.typeid
}
}
impl AnyValueTypelessMut for AnyValueRaw {}
impl AnyValueMut for AnyValueRaw {}