arcdps 0.11.2

Rust bindings for the Guild Wars 2 dps-meter with focus on ease-of-use and performance.
Documentation
#![allow(clippy::missing_safety_doc)]
use std::{
    ffi::{c_void, CString},
    mem::transmute,
};

use crate::raw_structs::*;

static mut ARCDPS: HANDLE = 0 as _;

#[inline(always)]
pub(crate) unsafe fn __set_handle(arcdps: HANDLE) {
    ARCDPS = arcdps;
}

unsafe fn get_func(e: &str) -> *mut c_void {
    let e = CString::new(e).unwrap();
    GetProcAddress(ARCDPS, e.as_ptr())
}

static mut E0: Option<Export0> = None;
pub unsafe fn e0() -> *mut u16 {
    (&mut *&raw mut E0).get_or_insert_with(|| transmute(get_func("e0")))()
}

static mut E3: Option<Export3> = None;
pub unsafe fn e3(s: *mut u8) {
    (&mut *&raw mut E3).get_or_insert_with(|| transmute(get_func("e3")))(s)
}

static mut E5: Option<Export5> = None;
#[cfg(feature = "imgui")]
pub unsafe fn e5(out: *mut [*mut imgui::sys::ImVec4; 5]) {
    (&mut *&raw mut E5).get_or_insert_with(|| transmute(get_func("e5")))(out)
}

#[cfg(not(feature = "imgui"))]
pub unsafe fn e5(out: *mut [*mut [f32; 4]; 5]) {
    (&mut *&raw mut E5).get_or_insert_with(|| transmute(get_func("e5")))(out)
}

static mut E6: Option<Export6> = None;
pub unsafe fn e6() -> u64 {
    (&mut *&raw mut E6).get_or_insert_with(|| transmute(get_func("e6")))()
}

static mut E7: Option<Export7> = None;
pub unsafe fn e7() -> u64 {
    (&mut *&raw mut E7).get_or_insert_with(|| transmute(get_func("e7")))()
}

static mut E8: Option<Export8> = None;
pub unsafe fn e8(s: *mut u8) {
    (&mut *&raw mut E8).get_or_insert_with(|| transmute(get_func("e8")))(s)
}

static mut E9: Option<Export9> = None;
pub unsafe fn e9(ev: &CombatEvent, sig: u32) {
    (&mut *&raw mut E9).get_or_insert_with(|| transmute(get_func("e9")))(ev, sig)
}