1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
use std::rc::Rc; use super::{Instance, Link, Memory, Platform}; pub struct Effect<P> where P: Platform + ?Sized, { instance: Rc<Instance<P>>, closure: Box<dyn FnOnce(&EffectLink<P>)>, } impl<P> Effect<P> where P: Platform + ?Sized, { pub fn new<F>(instance: &Rc<Instance<P>>, closure: F) -> Effect<P> where F: FnOnce(&EffectLink<P>) + 'static, { Effect { instance: instance.clone(), closure: Box::new(closure), } } pub fn instance(&self) -> &Rc<Instance<P>> { &self.instance } pub fn invoke(self, link: &EffectLink<P>) { (self.closure)(link) } } pub struct LayoutEffect<P> where P: Platform + ?Sized, { instance: Rc<Instance<P>>, closure: Box<dyn FnOnce(&EffectLink<P>, &mut P::CommandBuffer)>, } impl<P> LayoutEffect<P> where P: Platform + ?Sized, { pub fn new<F>(instance: &Rc<Instance<P>>, closure: F) -> LayoutEffect<P> where F: FnOnce(&EffectLink<P>, &mut P::CommandBuffer) + 'static, { LayoutEffect { instance: instance.clone(), closure: Box::new(closure), } } pub fn instance(&self) -> &Rc<Instance<P>> { &self.instance } pub fn invoke(self, link: &EffectLink<P>, buffer: &mut P::CommandBuffer) { (self.closure)(link, buffer) } } pub struct EffectLink<'a, P> where P: Platform + ?Sized, { instance: &'a Rc<Instance<P>>, memory: &'a Memory, } impl<'a, P> EffectLink<'a, P> where P: Platform + ?Sized, { pub fn new(instance: &'a Rc<Instance<P>>, memory: &'a Memory) -> EffectLink<'a, P> { EffectLink { instance, memory } } } impl<'a, P> Link for EffectLink<'a, P> where P: Platform + ?Sized, { type Platform = P; fn instance(&self) -> &Rc<Instance<P>> { self.instance } fn memory(&self) -> &Memory { self.memory } }