Skip to main content

any_vec/any_value/
wrapper.rs

1use core::any::TypeId;
2use core::mem::size_of;
3use crate::any_value::{AnyValue, AnyValueMut, AnyValueTypelessMut, AnyValueTypeless, AnyValueSizeless, AnyValueSizelessMut};
4
5/// Helper struct to convert concrete type to [`AnyValueMut`].
6/// 
7/// Unlike [AnyValueRaw] this one owns underlying value. So, its not
8/// special in any way.
9/// 
10/// [AnyValueRaw]: super::AnyValueRaw
11#[derive(Debug)]
12pub struct AnyValueWrapper<T: 'static>{
13    value: T
14}
15impl<T: 'static> AnyValueWrapper<T> {
16    #[inline]
17    pub fn new(value: T) -> Self{
18        Self{ value }
19    }
20}
21impl<T: 'static> AnyValueSizeless for AnyValueWrapper<T> {
22    type Type = T;
23
24    #[inline]
25    fn as_bytes_ptr(&self) -> *const u8 {
26        &self.value as *const _ as *const u8
27    }
28}
29impl<T: 'static> AnyValueSizelessMut for AnyValueWrapper<T> {
30    #[inline]
31    fn as_bytes_mut_ptr(&mut self) -> *mut u8 {
32        &mut self.value as *mut _ as *mut u8
33    }
34}
35impl<T: 'static> AnyValueTypeless for AnyValueWrapper<T> {
36    #[inline]
37    fn size(&self) -> usize {
38        size_of::<T>()
39    }
40}
41impl<T: 'static> AnyValue for AnyValueWrapper<T> {
42    #[inline]
43    fn value_typeid(&self) -> TypeId {
44        TypeId::of::<T>()
45    }
46}
47impl<T: 'static> AnyValueTypelessMut for AnyValueWrapper<T> {}
48impl<T: 'static> AnyValueMut for AnyValueWrapper<T> {}