diff --git a/examples/vec_deque.rs b/examples/vec_deque.rs index fe0d0bfdeb10e3d0b9e29faf29ec2e40598277c1..5ac3c948624d9d4aec165af8f794e9cfe2269f43 100644 --- a/examples/vec_deque.rs +++ b/examples/vec_deque.rs @@ -1,64 +1,193 @@ +#![feature(nll)] + +use std::boxed::Box; use std::collections::vec_deque::VecDeque; +use std::ops::Deref; use std::rc::Rc; use std::sync::{Arc, Mutex}; -trait Dispatch { - fn dispatch(&mut self); -} - -struct MsgQ { - data: VecDeque<i32>, -} - -impl MsgQ { - fn new() -> Self { - MsgQ { - data: VecDeque::new(), - } - } -} - -impl Dispatch for MsgQ { - fn dispatch(&mut self) { - let data = self.data.pop_front().unwrap(); - println!("dispatched value {}", data); - } +// trait Dispatch<R> { +// fn dispatch(&mut self) -> R; +// } + +// struct MsgQ<R> +// where +// R: Dispatch<R>, +// { +// data: VecDeque<R>, +// } + +// impl MsgQ<T, R> +// where +// T: Dispatch<R>, +// { +// fn new() -> Self { +// MsgQ { +// data: VecDeque::new(), +// } +// } +// } + +// impl<T, R> Dispatch<R> for MsgQ<T, R> +// where +// T: Dispatch<R>, +// { +// fn dispatch(&mut self) { +// let data = self.data.pop_front().unwrap(); +// // println!("dispatched value {}", data); +// } +// } + +struct Callback<O, P, R> { + o: Option<Arc<Mutex<O>>>, + f: fn(&O, P) -> R, } +// impl<O, P, R> Deref for Callback<O, P, R> { +// type Target = R; +// fn deref(&self, p: P) -> &R { +// &self.f(self.o.lock().unwrap(), p) +// } +// } // interface for object A struct A { data: i32, - cb: (Option<Arc<Mutex<A>>>, fn(&A) -> ()), + cb: Callback<A, (), ()>, } impl A { - fn new(data: i32, cb: (Option<Arc<Mutex<A>>>, fn(&A) -> ())) -> Self { + fn new(data: i32, cb: Callback<A, (), ()>) -> Self { A { data, cb } } - fn print(&self) { + fn print(&self, _: ()) { println!("data {}", self.data); } fn update(&mut self, v: i32) { self.data = v; - //let o = self.cb.0.unwrap(); - self.cb.1(&*self.cb.0.as_ref().unwrap().lock().unwrap()); + + // self.cb.1( + // &*self.cb.0.as_ref().unwrap().lock().unwrap(), + // (), + // ); } } -fn main() { - let mut q = MsgQ::new(); +trait Dispatch { + fn dispatch(&mut self); +} + +// struct MsgQ<'a, T>(VecDeque<&'a Mutex<T>>) +// where +// T: 'a + Dispatch; + +// impl<'a, T> Dispatch for MsgQ<'a, T> +// where +// T: 'a + Dispatch, +// { +// fn dispatch(&mut self) {} +// } + +// impl<'a, T> Dispatch for &'a Vec<Mutex<T>> { +// fn dispatch(&mut self) {} +// } - let mut a1 = Arc::new(Mutex::new(A::new(1, (None, A::print)))); - let mut a2 = Arc::new(Mutex::new(A::new(2, (None, A::print)))); +struct MsgQ<'a>(VecDeque<&'a Dispatch>); - a1 = Arc::new(Mutex::new(A::new(1, (Some(a2), A::print)))); - a2 = Arc::new(Mutex::new(A::new(2, (Some(a1), A::print)))); +// impl<'a, T> Dispatch for MsgQ<'a, T> { +// fn dispatch(&mut self) {} +// } +struct Msg<T>(Mutex<T>, Box<FnMut(T) -> ()>); + +impl<T> Dispatch for Msg<T> { + fn dispatch(&mut self) {} +} + +impl<T> Dispatch for Mutex<T> { + fn dispatch(&mut self) {} +} + +fn main() { + // let mut q = MsgQ::new(); + + let mut a1 = Arc::new(Mutex::new(A::new( + 1, + Callback { + o: None, + f: A::print, + }, + ))); + + let mut a2 = Arc::new(Mutex::new(A::new( + 2, + Callback { + o: None, + f: A::print, + }, + ))); + + a1 = Arc::new(Mutex::new(A::new( + 1, + Callback { + o: Some(a2.clone()), + f: A::print, + }, + ))); + + a2 = Arc::new(Mutex::new(A::new( + 2, + Callback { + o: Some(a1.clone()), + f: A::print, + }, + ))); + + let m = Mutex::new(0); + let m2 = Mutex::new(0.0); + + let mut q = MsgQ { + 0: VecDeque::new(), + }; + q.0.push_back(&m); + q.0.push_back(&m2); + + let c1 = |o| println!("hello {}", o); + let msg = Msg { + 0: m, + 1: Box::new(c1), + }; + + q.0.dispatch(); + + //q.0.push_back(&(m, c1)); + + //q.0.push_back(&a1); + + // // define closure + // let c1 = |o| A::update(o, 32); + // let c2 = |o| A::print(o, ()); + + // // execute closure + // { + // c1(&mut a1.lock().unwrap()); + // c2(&mut a1.lock().unwrap()); + // } + + //c() + + // // definition phase + // let mut a1 = Arc::new(Mutex::new(A::new(1, (None, A::print)))); + // let mut a2 = Arc::new(Mutex::new(A::new(2, (None, A::print)))); + + // // instantiation phase + // a1 = Arc::new(Mutex::new(A::new(1, (Some(a2), A::print)))); + // a2 = Arc::new(Mutex::new(A::new(2, (Some(a1), A::print)))); + + // //a1.print(); + // a2.lock().unwrap().update(17); - //a1.print(); - a2.lock().unwrap().update(17); // a3.print(); // let f = A::update;