spirv_cross2/reflect/
mod.rs1mod buffers;
2mod combined_image_samplers;
3mod constants;
4mod decorations;
5mod entry_points;
6mod execution_modes;
7mod names;
8mod resources;
9mod types;
10
11use crate::{error, SpirvCrossError};
12pub use buffers::*;
13pub use combined_image_samplers::*;
14pub use constants::*;
15pub use decorations::*;
16pub use entry_points::*;
17pub use execution_modes::*;
18pub use resources::*;
19pub use types::*;
20
21#[inline(always)]
23fn enum_slice_is_not_max<T>(enum_slice: &[i32]) -> bool {
24 #[cfg(target_endian = "big")]
25 let memchr = memchr::memmem::find(
26 bytemuck::must_cast_slice(enum_slice),
27 &*i32::MAX.to_be_bytes(),
28 );
29
30 #[cfg(target_endian = "little")]
31 let memchr = memchr::memmem::find(
32 bytemuck::must_cast_slice(enum_slice),
33 i32::MAX.to_le_bytes().as_slice(),
34 );
35
36 if memchr.is_none() {
38 true
39 } else {
40 !enum_slice.contains(&i32::MAX)
41 }
42}
43
44unsafe fn try_valid_slice<'a, T>(ptr: *const T, size: usize) -> error::Result<&'a [T]> {
47 unsafe {
48 let int_slice = std::slice::from_raw_parts(ptr.cast::<i32>(), size);
49 if !enum_slice_is_not_max::<T>(int_slice) {
50 Err(SpirvCrossError::InvalidEnum)
51 } else {
52 Ok(std::slice::from_raw_parts(ptr, size))
53 }
54 }
55}