lundi 23 décembre 2019

Design pattern to avoud circular references

I want to build an emulator in rust and currently try to find a good design pattern for the following problem: My emulator right now aims to consists of two structs: The CPU and the RAM. Since multiple other components will follow, I dont want the CPU to reference the RAM directly. Instead, there is a Bus struct that will tie everything together:

struct CPU;

impl CPU {
    pub fn clock() {
        // read data from RAM, do stuff..
        unimplemented!();
    }
}

struct RAM;

impl RAM {
    pub fn read_byte(addr: u16) -> u8 { unimplemented!() }
}

struct Bus {
    pub cpu: CPU,
    pub ram: RAM,
}

impl Bus {
    fn clock() {
        self.cpu.clock();
    }
}

Now for the CPU to read some memory from the RAM, it needs to get a reference to the Bus. However, this would lead to a circular reference because the Bus already holds the CPU. Now imagine another component added: the GPU, which also wants to access features of the Bus. Now both (CPU and GPU) will require a mutable reference to the Bus which is also not possible because we can only have one.

I can't think of a good design pattern to resolve this in rust. In C++ I would instantiate the CPU, store it in the Bus, and then set a pointer to the Bus in the CPU. But in Rust, this does not work. What's a good design pattern to implement this in Rust?

Aucun commentaire:

Enregistrer un commentaire