clroxide 1.1.1

A library that allows you to host the CLR and execute dotnet binaries.
Documentation
use crate::primitives::{IUnknown, IUnknownVtbl, Interface, GUID, HRESULT};
use std::{ffi::c_void, ops::Deref};

#[repr(C)]
pub struct IEnumUnknown {
    pub vtable: *const IEnumUnknownVtbl,
}

#[repr(C)]
pub struct IEnumUnknownVtbl {
    pub parent: IUnknownVtbl,
    pub Next: unsafe extern "system" fn(
        this: *mut c_void,
        celt: u32,
        rgelt: *mut *mut IUnknown,
        pceltFetched: *mut u32,
    ) -> HRESULT,
    pub Skip: unsafe extern "system" fn(this: *mut c_void, celt: u32) -> HRESULT,
    pub Reset: unsafe extern "system" fn(this: *mut c_void) -> HRESULT,
    pub Clone:
        unsafe extern "system" fn(this: *mut c_void, ppenum: *mut *mut IEnumUnknown) -> HRESULT,
}

impl IEnumUnknown {
    #[inline]
    pub unsafe fn Next(
        &self,
        celt: u32,
        rgelt: *mut *mut IUnknown,
        pceltFetched: *mut u32,
    ) -> HRESULT {
        ((*self.vtable).Next)(self as *const _ as *mut _, celt, rgelt, pceltFetched)
    }

    #[inline]
    pub unsafe fn Skip(&self, celt: u32) -> HRESULT {
        ((*self.vtable).Skip)(self as *const _ as *mut _, celt)
    }

    #[inline]
    pub unsafe fn Reset(&self) -> HRESULT {
        ((*self.vtable).Reset)(self as *const _ as *mut _)
    }

    #[inline]
    pub unsafe fn Clone(&self, ppenum: *mut *mut IEnumUnknown) -> HRESULT {
        ((*self.vtable).Clone)(self as *const _ as *mut _, ppenum)
    }
}

impl Interface for IEnumUnknown {
    const IID: GUID = GUID::from_values(
        0x00000100,
        0x0000,
        0x0000,
        [0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46],
    );

    fn vtable(&self) -> *const c_void {
        self.vtable as *const _ as *const c_void
    }
}

impl Deref for IEnumUnknown {
    type Target = IUnknown;

    #[inline]
    fn deref(&self) -> &IUnknown {
        unsafe { &*(self as *const IEnumUnknown as *const IUnknown) }
    }
}