dync/
meta.rs

1use crate::copy_value::*;
2use crate::elem::*;
3#[cfg(feature = "traits")]
4use crate::slice::*;
5use crate::slice_copy::*;
6#[cfg(feature = "traits")]
7use crate::value::*;
8use crate::vec_copy::*;
9use crate::vtable::*;
10
11#[cfg(feature = "traits")]
12use crate::traits::*;
13
14/// Defines a meta struct containing information about a type but not the type itself.
15///
16/// Note that here V would typically represent a pointer type.
17#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
18pub struct Meta<V> {
19    pub elem: ElemInfo,
20    pub vtable: V,
21}
22
23#[cfg(feature = "traits")]
24impl<'a, V: HasDrop> From<ValueRef<'a, V>> for Meta<VTableRef<'a, V>> {
25    #[inline]
26    fn from(val: ValueRef<'a, V>) -> Meta<VTableRef<'a, V>> {
27        Meta {
28            elem: ElemInfo {
29                type_id: val.type_id,
30                size: val.bytes.len() / val.alignment,
31                alignment: val.alignment,
32            },
33            vtable: val.vtable,
34        }
35    }
36}
37
38#[cfg(feature = "traits")]
39impl<'a, V: HasDrop> From<ValueMut<'a, V>> for Meta<VTableRef<'a, V>> {
40    #[inline]
41    fn from(val: ValueMut<'a, V>) -> Meta<VTableRef<'a, V>> {
42        Meta {
43            elem: ElemInfo {
44                type_id: val.type_id,
45                size: val.bytes.len() / val.alignment,
46                alignment: val.alignment,
47            },
48            vtable: val.vtable,
49        }
50    }
51}
52
53impl<'a, V> From<CopyValueRef<'a, V>> for Meta<VTableRef<'a, V>> {
54    #[inline]
55    fn from(val: CopyValueRef<'a, V>) -> Meta<VTableRef<'a, V>> {
56        Meta {
57            elem: ElemInfo {
58                type_id: val.type_id,
59                size: val.bytes.len() / val.alignment,
60                alignment: val.alignment,
61            },
62            vtable: val.vtable,
63        }
64    }
65}
66
67impl<'a, V> From<SliceCopy<'a, V>> for Meta<VTableRef<'a, V>> {
68    #[inline]
69    fn from(slice: SliceCopy<'a, V>) -> Self {
70        Meta {
71            elem: slice.elem,
72            vtable: slice.vtable,
73        }
74    }
75}
76
77impl<'a, V> From<SliceCopyMut<'a, V>> for Meta<VTableRef<'a, V>> {
78    #[inline]
79    fn from(slice: SliceCopyMut<'a, V>) -> Self {
80        Meta {
81            elem: slice.elem,
82            vtable: slice.vtable,
83        }
84    }
85}
86
87#[cfg(feature = "traits")]
88impl<'a, V> From<Slice<'a, V>> for Meta<VTableRef<'a, V>> {
89    #[inline]
90    fn from(slice: Slice<'a, V>) -> Self {
91        Meta::from(slice.data)
92    }
93}
94
95#[cfg(feature = "traits")]
96impl<'a, V> From<SliceMut<'a, V>> for Meta<VTableRef<'a, V>> {
97    #[inline]
98    fn from(slice: SliceMut<'a, V>) -> Self {
99        Meta::from(slice.data)
100    }
101}
102
103impl<'a, V> From<&'a VecCopy<V>> for Meta<VTableRef<'a, V>> {
104    #[inline]
105    fn from(vec: &'a VecCopy<V>) -> Meta<VTableRef<'a, V>> {
106        Meta {
107            elem: vec.data.elem,
108            vtable: VTableRef::Ref(vec.vtable.as_ref()),
109        }
110    }
111}