#[derive(Copy, Clone)]
pub struct Closure<'a, T : Copy> {
method: &'a dyn Fn(T),
arg: T,
}
impl <'a, T: Copy> Closure<'a, T> {
pub fn bind(method: &'a dyn Fn(T), arg: T) -> Self {
return Closure {
method: method,
arg: arg,
};
}
pub fn invoke(&self) {
(self.method)(self.arg);
}
}
#[cfg(test)]
mod test_closure {
use super::*;
use crate::system::vector::*;
use crate::system::boxed::*;
#[test]
fn test() {
let mut list = Vector::new();
list.push(Closure::bind(&invoke, ("hello", 42)));
list.push(Closure::bind(&invoke, ("world!", 32)));
for closure in list.into_iter() {
closure.invoke();
}
assert_eq!(true, true);
}
#[test]
fn test2() {
let mut list = Vector::new();
fn convert<T: Copy>(closure: Closure<T>) -> *const u32 {
let ptr = &closure as *const Closure<T>;
return ptr as *const u32; }
list.push(Box::new(Closure::bind(&invoke, ("hello", 42))));
list.push(Box::new(Closure::bind(&invoke2, ("worldz", 12, "you are great"))));
for closure in list.into_iter() {
let func = Box::from_raw::<Closure::<(&str, i32, &str)>>(closure);
func.invoke();
}
}
fn invoke2(message: (&str, i32, &str)) {
std::println!("[invoke2] {} {} {}", message.0, message.1, message.2);
}
fn invoke(message: (&str, i32)) {
std::println!("[invoke] {} {}", message.0, message.1);
}
}