use core::ffi::c_void;
use polyplug_utils::GuestContractId;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct GuestContractInstance {
pub data: *mut c_void,
pub contract_id: GuestContractId,
}
unsafe impl Send for GuestContractInstance {}
unsafe impl Sync for GuestContractInstance {}
impl GuestContractInstance {
pub fn null() -> Self {
Self {
data: core::ptr::null_mut(),
contract_id: GuestContractId::from_u64(0),
}
}
pub fn is_null(&self) -> bool {
self.data.is_null()
}
}
#[cfg(test)]
mod tests {
use super::GuestContractInstance;
use core::mem::{align_of, offset_of, size_of};
#[test]
fn layout_guest_contract_instance() {
assert_eq!(size_of::<GuestContractInstance>(), 16);
assert_eq!(align_of::<GuestContractInstance>(), 8);
assert_eq!(offset_of!(GuestContractInstance, data), 0);
assert_eq!(offset_of!(GuestContractInstance, contract_id), 8);
}
#[test]
fn null_instance() {
let instance = GuestContractInstance::null();
assert!(instance.is_null());
}
#[test]
fn guest_contract_instance_repr_c() {
assert_eq!(size_of::<GuestContractInstance>(), 16);
assert_eq!(align_of::<GuestContractInstance>(), 8);
}
}