#[macro_export]
macro_rules! debug_println {
($($arg:tt)*) => {
if std::env::var("SPARSEIR_DEBUG").is_ok() {
eprintln!("[SPARSEIR DEBUG] {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! debug_eprintln {
($($arg:tt)*) => {
if std::env::var("SPARSEIR_DEBUG").is_ok() {
eprintln!("[SPARSEIR DEBUG ERROR] {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! impl_opaque_type_common {
($type_name:ident) => {
paste::paste! {
#[unsafe(no_mangle)]
pub extern "C" fn [<spir_ $type_name _release>](obj: *mut [<spir_ $type_name>]) {
if obj.is_null() {
return;
}
unsafe {
let _ = Box::from_raw(obj);
}
}
#[unsafe(no_mangle)]
pub extern "C" fn [<spir_ $type_name _clone>](
src: *const [<spir_ $type_name>]
) -> *mut [<spir_ $type_name>] {
if src.is_null() {
return std::ptr::null_mut();
}
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| unsafe {
let src_ref = &*src;
let cloned = (*src_ref).clone();
Box::into_raw(Box::new(cloned))
}));
result.unwrap_or(std::ptr::null_mut())
}
#[unsafe(no_mangle)]
pub extern "C" fn [<spir_ $type_name _is_assigned>](
obj: *const [<spir_ $type_name>]
) -> i32 {
if obj.is_null() { 0 } else { 1 }
}
#[unsafe(no_mangle)]
pub extern "C" fn [<_spir_ $type_name _get_raw_ptr>](
obj: *const [<spir_ $type_name>]
) -> *const std::ffi::c_void {
if obj.is_null() {
return std::ptr::null();
}
obj as *const std::ffi::c_void
}
}
};
}