use super::server::IPawnScript;
#[cfg(not(target_env = "msvc"))]
#[repr(C)]
pub struct PawnEventHandlerVTable {
pub on_amx_load: unsafe extern "C" fn(*mut PawnEventHandler, *mut IPawnScript),
pub on_amx_unload: unsafe extern "C" fn(*mut PawnEventHandler, *mut IPawnScript),
}
#[cfg(target_env = "msvc")]
#[repr(C)]
pub struct PawnEventHandlerVTable {
pub on_amx_load: unsafe extern "thiscall" fn(*mut PawnEventHandler, *mut IPawnScript),
pub on_amx_unload: unsafe extern "thiscall" fn(*mut PawnEventHandler, *mut IPawnScript),
}
#[repr(C)]
pub struct PawnEventHandler {
vtable: *const PawnEventHandlerVTable,
}
unsafe impl Send for PawnEventHandler {}
unsafe impl Sync for PawnEventHandler {}
impl PawnEventHandler {
#[must_use]
pub fn new(vtable: *const PawnEventHandlerVTable) -> Self {
Self { vtable }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(not(target_env = "msvc"))]
unsafe extern "C" fn noop_amx_load(_: *mut PawnEventHandler, _: *mut IPawnScript) {}
#[cfg(not(target_env = "msvc"))]
unsafe extern "C" fn noop_amx_unload(_: *mut PawnEventHandler, _: *mut IPawnScript) {}
#[cfg(target_env = "msvc")]
unsafe extern "thiscall" fn noop_amx_load(_: *mut PawnEventHandler, _: *mut IPawnScript) {}
#[cfg(target_env = "msvc")]
unsafe extern "thiscall" fn noop_amx_unload(_: *mut PawnEventHandler, _: *mut IPawnScript) {}
static TEST_VTABLE: PawnEventHandlerVTable = PawnEventHandlerVTable {
on_amx_load: noop_amx_load,
on_amx_unload: noop_amx_unload,
};
#[test]
fn pawn_event_handler_new_stores_vtable() {
let handler = PawnEventHandler::new(&raw const TEST_VTABLE);
assert_eq!(handler.vtable, &raw const TEST_VTABLE);
}
#[test]
fn pawn_event_handler_is_send_and_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<PawnEventHandler>();
}
}