1use std::slice;
4
5#[repr(C)]
7pub struct ImVector<T> {
8 size: i32,
9 capacity: i32,
10 pub(crate) data: *mut T,
11}
12
13impl<T> ImVector<T> {
14 #[inline]
15 pub fn as_slice(&self) -> &[T] {
16 unsafe { slice::from_raw_parts(self.data, self.size as usize) }
17 }
18}
19
20#[test]
21#[cfg(test)]
22fn test_imvector_memory_layout() {
23 use std::mem;
24 assert_eq!(
25 mem::size_of::<ImVector<u8>>(),
26 mem::size_of::<sys::ImVector_char>()
27 );
28 assert_eq!(
29 mem::align_of::<ImVector<u8>>(),
30 mem::align_of::<sys::ImVector_char>()
31 );
32 use sys::ImVector_char;
33 type VectorChar = ImVector<u8>;
34 macro_rules! assert_field_offset {
35 ($l:ident, $r:ident) => {
36 assert_eq!(
37 memoffset::offset_of!(VectorChar, $l),
38 memoffset::offset_of!(ImVector_char, $r)
39 );
40 };
41 }
42 assert_field_offset!(size, Size);
43 assert_field_offset!(capacity, Capacity);
44 assert_field_offset!(data, Data);
45}
46
47pub trait RawWrapper {
49 type Raw;
51 unsafe fn raw(&self) -> &Self::Raw;
58 unsafe fn raw_mut(&mut self) -> &mut Self::Raw;
65}
66
67pub unsafe trait RawCast<T>: Sized {
69 #[inline]
75 unsafe fn from_raw(raw: &T) -> &Self {
76 &*(raw as *const _ as *const Self)
77 }
78 #[inline]
84 unsafe fn from_raw_mut(raw: &mut T) -> &mut Self {
85 &mut *(raw as *mut _ as *mut Self)
86 }
87 #[inline]
93 unsafe fn raw(&self) -> &T {
94 &*(self as *const _ as *const T)
95 }
96 #[inline]
102 unsafe fn raw_mut(&mut self) -> &mut T {
103 &mut *(self as *mut _ as *mut T)
104 }
105}
106
107#[repr(u32)]
109#[derive(Copy, Clone, Debug, Eq, PartialEq)]
110pub enum DataType {
111 I8 = sys::ImGuiDataType_S8,
112 U8 = sys::ImGuiDataType_U8,
113 I16 = sys::ImGuiDataType_S16,
114 U16 = sys::ImGuiDataType_U16,
115 I32 = sys::ImGuiDataType_S32,
116 U32 = sys::ImGuiDataType_U32,
117 I64 = sys::ImGuiDataType_S64,
118 U64 = sys::ImGuiDataType_U64,
119 F32 = sys::ImGuiDataType_Float,
120 F64 = sys::ImGuiDataType_Double,
121}
122
123pub unsafe trait DataTypeKind: Copy {
128 const KIND: DataType;
129}
130unsafe impl DataTypeKind for i8 {
131 const KIND: DataType = DataType::I8;
132}
133unsafe impl DataTypeKind for u8 {
134 const KIND: DataType = DataType::U8;
135}
136unsafe impl DataTypeKind for i16 {
137 const KIND: DataType = DataType::I16;
138}
139unsafe impl DataTypeKind for u16 {
140 const KIND: DataType = DataType::U16;
141}
142unsafe impl DataTypeKind for i32 {
143 const KIND: DataType = DataType::I32;
144}
145unsafe impl DataTypeKind for u32 {
146 const KIND: DataType = DataType::U32;
147}
148unsafe impl DataTypeKind for i64 {
149 const KIND: DataType = DataType::I64;
150}
151unsafe impl DataTypeKind for u64 {
152 const KIND: DataType = DataType::U64;
153}
154unsafe impl DataTypeKind for f32 {
155 const KIND: DataType = DataType::F32;
156}
157unsafe impl DataTypeKind for f64 {
158 const KIND: DataType = DataType::F64;
159}