Closed kunerd closed 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(); }
proposal: