You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.2 KiB

//! Container for `GHOST_SystemHandle`
use super::*;
use handle::*;
use std::{
ptr::NonNull,
ops::Drop,
};
/// Represents the active GHOST system.
///
/// This is global state, and only one can exist at once time.
/// # Usage
/// Create with the `create()` function. When the instance is dropped, the system is attempted to be disposed of.
/// This is not an associated function, to specify that creating the system is a global event, not an associated one.
///
/// # Panics
/// On debug builds a failed dispose on drop will panic. You can call `try_drop()` to attempt the dispose manually.
#[derive(Debug)]
pub struct System(NonNull<Handle<handle::System>>);
impl System
{
pub(crate) unsafe fn new_unchecked(from: *mut Handle<handle::System>) -> Self
{
Self(NonNull::new_unchecked(from))
}
/// Specifies whether debug messages are to be enabled for the specific system handle.
pub fn debug_messages(&mut self, enable: bool)
{
unsafe {
api::GHOST_SystemInitDebug(self.as_raw(), enable as libc::c_int);
}
}
/// Try to dispose the system now, returning the result.
pub fn try_drop(self) -> error::GhostResult
{
let res = unsafe {
api::GHOST_DisposeSystem(self.0.as_ptr())
};
std::mem::forget(self);
res.into()
}
#[inline] pub fn inner_handle(&mut self) -> GHOST_SystemHandle
{
self.0.as_ptr()
}
}
impl handle::AsHandle<handle::System> for System
{
#[inline] fn as_handle(&mut self) -> &mut Handle<handle::System> {
unsafe{self.0.as_mut()}
}
#[inline] fn as_raw(&mut self) -> *mut Handle<handle::System> {
self.inner_handle()
}
}
impl Drop for System
{
fn drop(&mut self)
{
unsafe {
let ptr = self.0.as_ptr();
debug!(api::GHOST_DisposeSystem(ptr).into_result().expect("Failed to dispose system");
{let _ = api::GHOST_DisposeSystem(ptr);});
}
}
}
/// Create the one and only system.
///
/// You must not call `create()` again as long as the system lives. After dropping the system it may or may not be safe to call this again.
pub fn create() -> error::GhostResult<System>
{
unsafe {
let ptr = from_null!(api::GHOST_CreateSystem());
Ok(System::new_unchecked(ptr))
}
}