use std::rc::Rc; use std::cell::{RefCell, RefMut}; use crate::error::Error; use crate::system::System; use crate::memory::{Addressable}; pub type Clock = u64; pub trait Steppable { fn step(&mut self, system: &System) -> Result; fn on_error(&mut self, _system: &System) { } } pub trait Interruptable { fn interrupt_state_change(&mut self, state: bool, priority: u8, number: u8) -> Result<(), Error>; } pub trait AddressableDevice: Addressable + Steppable { } pub trait InterruptableDevice: Interruptable + Steppable { } impl AddressableDevice for T { } impl InterruptableDevice for T { } pub type AddressableDeviceBox = Rc>>; pub type InterruptableDeviceBox = Rc>>; pub type AddressableDeviceRefMut<'a> = RefMut<'a, Box>; pub fn wrap_addressable(value: T) -> AddressableDeviceBox { Rc::new(RefCell::new(Box::new(value))) } pub fn wrap_interruptable(value: T) -> InterruptableDeviceBox { Rc::new(RefCell::new(Box::new(value))) } pub enum Device { Addressable(AddressableDeviceBox), Interruptable(InterruptableDeviceBox), }