kunerd / clerk

Hardware independent HD44780 LCD library written in Rust
MIT License
13 stars 1 forks source link

Use type state to distinguish between DDRAM and CGRAM operations #19

Closed kunerd closed 6 years ago

kunerd commented 6 years ago

proposal:

use std::marker::PhantomData;

struct DDRAM;

struct CGRAM;

struct Display<RT> {
    _ram_type: PhantomData<RT>
}

impl Display<DDRAM> {
    fn write(&self, c: u8) {
        println!("write to ddram: {}", c);
    }

    fn read(&self) {
        println!("read from ddram");
    }

    fn seek(&self ) {
        println!("seek ddram");
    }

    fn seek_cgram(self) -> Display<CGRAM> {
        let cgram_display = Display {
            _ram_type: PhantomData::<CGRAM>
        };

        cgram_display.seek();

        cgram_display
    }
}

impl Display<CGRAM> {
    fn write(&self, c: u32) -> u8 {
        println!("write to cgram: {}", c);

        0
    }

    fn read(&self) {
        println!("read cgram");
    }

    fn seek(&self ) {
        println!("seek cgram");
    }

    fn seek_ddram(self) -> Display<DDRAM> {
        let ddram_display = Display {
            _ram_type: PhantomData::<DDRAM>
        };

        ddram_display.seek();

        ddram_display
    }
}

fn main() {
    let d = Display {
        _ram_type: PhantomData::<DDRAM>
    };

    d.write(0);
    d.read();

    let d = d.seek_cgram();

    let c = d.write(0);
    println!("{}", c);
    d.read();
}