use crate::*;
use crate::d3d11::*;
use std::iter::Iterator;
#[derive(Clone)] #[repr(transparent)]
pub struct LibraryReflection(pub(crate) mcom::Rc<winapi::um::d3d11shader::ID3D11LibraryReflection>);
convert!(unsafe LibraryReflection => Unknown, winapi::um::d3d11shader::ID3D11LibraryReflection);
impl LibraryReflection {
pub fn get_desc(&self) -> Result<LibraryDesc, MethodError> {
let mut desc = LibraryDesc::default();
let hr = unsafe { self.0.GetDesc(desc.as_mut_ptr()) };
MethodError::check("ID3D11LibraryReflection::GetDesc", hr)?;
Ok(desc)
}
pub fn get_function_by_index(&self, function_index: u32) -> FunctionReflection {
let ptr = unsafe { self.0.GetFunctionByIndex(function_index as i32) };
unsafe { FunctionReflection::from_raw(self, ptr) }
}
}
impl LibraryReflection {
pub fn functions(&self) -> Result<impl Iterator<Item = FunctionReflection> + '_, MethodError> {
Ok(LibraryReflectionFunctionsIter {
desc: self.get_desc()?,
library_reflection: self,
index: 0,
})
}
}
struct LibraryReflectionFunctionsIter<'lr> {
library_reflection: &'lr LibraryReflection,
desc: LibraryDesc<'lr>,
index: u32,
}
impl<'lr> Iterator for LibraryReflectionFunctionsIter<'lr> {
type Item = FunctionReflection<'lr>;
fn next(&mut self) -> Option<Self::Item> {
let i = self.index;
if i < self.desc.function_count {
self.index = i + 1;
Some(self.library_reflection.get_function_by_index(i))
} else {
None
}
}
}