use std::marker::PhantomData;
#[derive(Debug)]
#[repr(C)]
pub struct Node<Id> {
pub prev_count: usize,
prev_size: usize,
pub(crate) prev: *mut Id,
pub next_count: usize,
next_size: usize,
pub(crate) next: *mut Id,
}
#[repr(C)]
pub struct IndexList {
pub(crate) index: usize,
pub(crate) next: *mut Self,
}
#[derive(Debug)]
#[repr(C)]
pub struct NodeArray {
pub(crate) count: usize,
size: usize,
pub(crate) nodes: *mut Node<usize>,
pub(crate) reusable: *mut IndexList,
}
#[derive(Debug)]
#[repr(C)]
pub struct Net {
pub(crate) transitions: NodeArray,
pub(crate) places: NodeArray,
pub(crate) initial_token_counts: *mut usize,
}
#[repr(C)]
pub struct TransitionView<'a> {
pub count: usize,
pub(crate) transitions: *mut IndexList,
phantom: PhantomData<&'a mut IndexList>,
}
#[repr(C)]
pub struct TransitionList {
pub count: usize,
pub(crate) transitions: *mut IndexList,
}
#[repr(C)]
pub struct FireChanges {
pub added: TransitionList,
pub removed: TransitionList,
}
#[repr(C)]
struct FireInfo {
count: usize,
transitions: *mut IndexList,
}
#[repr(C)]
struct FireState {
active: FireInfo,
added: FireInfo,
removed: FireInfo,
}
#[repr(C)]
pub struct CountArray {
size: usize,
pub(crate) counts: *mut usize,
}
#[repr(C)]
pub struct State {
pub(crate) tokens: CountArray,
pub(crate) calls: CountArray,
fire: FireState,
unfire: FireState,
}