Documentation
use crate::apu::Apu;
use crate::cpu::Cpu;
use crate::mapper::Mapper;
use crate::ppu::Ppu;

#[derive(Clone)]
pub struct Bus {
    pub apu: *mut Apu,
    pub cpu: *mut Cpu,
    pub ppu: *mut Ppu,
    pub mapper: *mut dyn Mapper,
}

impl Bus {
    pub fn new(apu: &mut Apu, cpu: &mut Cpu, ppu: &mut Ppu, mapper: *mut dyn Mapper) -> Self {
        Bus {
            apu: apu as *mut Apu,
            cpu: cpu as *mut Cpu,
            ppu: ppu as *mut Ppu,
            mapper,
        }
    }

    pub fn apu_mut(&mut self) -> &mut Apu {
        unsafe { &mut (*self.apu) }
    }

    pub fn cpu_mut(&mut self) -> &mut Cpu {
        unsafe { &mut (*self.cpu) }
    }

    pub fn ppu(&self) -> &Ppu {
        unsafe { &(*self.ppu) }
    }

    pub fn ppu_mut(&mut self) -> &mut Ppu {
        unsafe { &mut (*self.ppu) }
    }

    pub fn mapper(&self) -> &dyn Mapper {
        unsafe { &(*self.mapper) }
    }

    pub fn mapper_mut(&mut self) -> &mut dyn Mapper {
        unsafe { &mut (*self.mapper) }
    }
}