mod types;
mod internals;
use std::ffi::CString;
use std::os::raw::{c_char, c_double, c_int, c_void};
use crate::types::GMLDouble;
pub use types::*;
use internals::*;
#[derive(Debug, Eq, PartialEq)]
pub struct DSMap {
pub(crate) map_id: c_int,
}
impl DSMap {
pub unsafe fn register_calls(
event_perform_async: *const c_void,
ds_map_create: *const c_void,
ds_map_add_double: *const c_void,
ds_map_add_string: *const c_void,
) {
register_event_perform_async(event_perform_async as FnAddr);
register_ds_map_create(ds_map_create as FnAddr);
register_ds_map_add_double(ds_map_add_double as FnAddr);
register_ds_map_add_string(ds_map_add_string as FnAddr);
}
pub unsafe fn new() -> Self {
let map_id = (*FN_DS_MAP_CREATE)(0);
DSMap { map_id }
}
pub fn new_existing(map_id: c_int) -> Self {
DSMap { map_id }
}
pub unsafe fn add_double(&mut self, key: impl ToString, value: GMLDouble) -> bool {
let key_cstr = CString::new(
key.to_string()
).unwrap();
(*FN_DS_MAP_ADD_DOUBLE)(
self.map_id,
key_cstr.as_ptr(),
value,
)
}
pub unsafe fn add_string(&mut self, key: impl ToString, value: impl ToString) -> bool {
let key_cstr = CString::new(
key.to_string()
).unwrap();
let value_cstr = CString::new(
value.to_string()
).unwrap();
(*FN_DS_MAP_ADD_STRING)(
self.map_id,
key_cstr.as_ptr(),
value_cstr.as_ptr(),
)
}
pub unsafe fn add_raw(&mut self, key: impl ToString, value: *const u8) -> bool {
let key_cstr = CString::new(
key.to_string()
).unwrap();
(*FN_DS_MAP_ADD_STRING)(
self.map_id,
key_cstr.as_ptr(),
value as *const _,
)
}
pub unsafe fn dispatch(self, event: EventType) {
(*FN_EVENT_PERFORM_ASYNC)(self.map_id, event as c_int);
}
}