#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Domain(NonNull<__itt_domain>);
impl<'a> From<&'a str> for Domain
{
#[inline(always)]
fn from(name: &'a str) -> Self
{
Self::new(name)
}
}
impl Domain
{
#[cfg(unix)]
#[inline(always)]
pub fn new(name: &str) -> Self
{
let name = CString::new(name).unwrap();
let inner = unsafe { __itt_domain_create(name.as_ptr()) };
assert!(!inner.is_null());
Domain(unsafe { NonNull::new_unchecked(inner)})
}
#[cfg(windows)]
#[inline(always)]
pub fn new(name: &str) -> Result<Self, ()>
{
let name = CString::new(name).unwrap();
let inner = unsafe { __itt_domain_createA(name.as_ptr()) };
if inner.is_null()
{
Err(())
}
else
{
Ok(Domain(unsafe { NonNull::new_unchecked(inner)}))
}
}
#[inline(always)]
pub fn begin_task<'a, 'b, 's>(&'a self, name: &'s StringHandle, parent: Option<IdentifierInstance<'b>>) -> Task<'a>
{
Task::begin(self, name, parent)
}
#[inline(always)]
pub fn begin_frame<'a>(&'a self) -> Frame<'a>
{
Frame::begin(Left(self))
}
#[inline(always)]
pub fn is_enabled(&self) -> bool
{
(unsafe { read_volatile(&self.0.as_ref().flags) }) == 1
}
#[inline(always)]
pub fn is_disabled(&self) -> bool
{
(unsafe { read_volatile(&self.0.as_ref().flags) }) == 0
}
#[inline(always)]
pub fn disable(&mut self)
{
unsafe { write_volatile(&mut self.0.as_mut().flags, 0) }
}
#[inline(always)]
pub fn enable(&mut self)
{
unsafe { write_volatile(&mut self.0.as_mut().flags, 1) }
}
#[inline(always)]
fn constant_pointer(&self) -> *const __itt_domain
{
self.0.as_ptr() as *const _
}
}