Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- trait WorkspaceLog {
- fn get(&self) -> usize;
- }
- struct TheLog<'a>(&'a FilesystemOverlay);
- impl<'a> WorkspaceLog for TheLog<'a> {
- fn get(&self) -> usize {
- (self.0).0
- }
- }
- trait WorkspaceController<'a> {
- type Log: WorkspaceLog;
- fn get_log(&'a self) -> Self::Log;
- }
- struct FilesystemOverlay(usize);
- struct FSWorkspaceController<'a>(&'a mut FilesystemOverlay);
- impl<'a> WorkspaceController<'a> for FSWorkspaceController<'a> {
- type Log = TheLog<'a>;
- fn get_log(&'a self) -> Self::Log {
- TheLog(&*self.0)
- }
- }
- trait AsWorkspaceController<'a> {
- type Controller: WorkspaceController<'a>;
- fn get_controller(self) -> Self::Controller;
- }
- impl<'a> AsWorkspaceController<'a> for &'a mut FilesystemOverlay {
- type Controller = FSWorkspaceController<'a>;
- fn get_controller(self) -> FSWorkspaceController<'a> {
- FSWorkspaceController(self)
- }
- }
- fn init1(control_dir: &mut FilesystemOverlay) -> usize {
- let controller = control_dir.get_controller();
- let log = controller.get_log();
- log.get()
- }
- fn init2<'a, O>(control_dir: O) -> usize
- where O: AsWorkspaceController<'a> {
- let controller = control_dir.get_controller();
- let log = controller.get_log();
- log.get()
- }
- fn main() {
- let mut control_dir = FilesystemOverlay(5);
- dbg!(init1(&mut control_dir));
- dbg!(init2(&mut control_dir));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement