easy_imgui_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(dead_code)]
5#![allow(unnecessary_transmutes)]
6#![allow(clippy::all)]
7
8use std::ops::{Deref, DerefMut, Index};
9
10include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
11
12impl<T> Index<usize> for ImVector<T> {
13    type Output = T;
14
15    fn index(&self, index: usize) -> &Self::Output {
16        if index >= self.Size as usize {
17            panic!("ImVector out of bounds");
18        }
19        unsafe { &*self.Data.add(index) }
20    }
21}
22
23impl<T> Deref for ImVector<T> {
24    type Target = [T];
25    fn deref(&self) -> &[T] {
26        unsafe {
27            if self.Size == 0 {
28                // self.Data may be null, and that will not do for `from_raw_parts`
29                &[]
30            } else {
31                std::slice::from_raw_parts(self.Data, self.Size as usize)
32            }
33        }
34    }
35}
36
37impl<T> DerefMut for ImVector<T> {
38    fn deref_mut(&mut self) -> &mut [T] {
39        unsafe {
40            if self.Size == 0 {
41                // self.Data may be null, and that will not do for `from_raw_parts`
42                &mut []
43            } else {
44                std::slice::from_raw_parts_mut(self.Data, self.Size as usize)
45            }
46        }
47    }
48}
49
50impl<'a, T> IntoIterator for &'a ImVector<T> {
51    type Item = &'a T;
52    type IntoIter = std::slice::Iter<'a, T>;
53    fn into_iter(self) -> Self::IntoIter {
54        self.deref().into_iter()
55    }
56}
57
58impl<'a, T> IntoIterator for &'a mut ImVector<T> {
59    type Item = &'a mut T;
60    type IntoIter = std::slice::IterMut<'a, T>;
61    fn into_iter(self) -> Self::IntoIter {
62        self.deref_mut().into_iter()
63    }
64}
65
66#[cfg(target_env = "msvc")]
67impl From<ImVec2_rr> for ImVec2 {
68    fn from(rr: ImVec2_rr) -> ImVec2 {
69        ImVec2 { x: rr.x, y: rr.y }
70    }
71}