From f9b6cd17f62c78419e2c81f7fa00f3f7ff3b982f Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Sun, 25 Sep 2016 11:02:17 +0100 Subject: [PATCH] Allow Generator to have !Send inputs and outputs close #55 --- src/generator.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/generator.rs b/src/generator.rs index e1ada62..06f11d4 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -80,7 +80,7 @@ pub enum State { /// println!("{:?}", nat.next()); // prints Some(2) /// ``` #[derive(Debug)] -pub struct Generator<'a, Input: Send + 'a, Output: Send + 'a, Stack: stack::Stack> { +pub struct Generator<'a, Input: 'a, Output: 'a, Stack: stack::Stack> { state: State, stack: Stack, stack_id: debug::StackId, @@ -92,7 +92,7 @@ unsafe impl<'a, Input, Output, Stack> Send for Generator<'a, Input, Output, Stac where Input: Send + 'a, Output: Send + 'a, Stack: stack::Stack + Send {} impl<'a, Input, Output, Stack> Generator<'a, Input, Output, Stack> - where Input: Send + 'a, Output: Send + 'a, Stack: stack::Stack { + where Input: 'a, Output: 'a, Stack: stack::Stack { /// Creates a new generator. /// /// See also the [contract](../trait.GuardedStack.html) that needs to be fulfilled by `stack`. @@ -112,8 +112,7 @@ impl<'a, Input, Output, Stack> Generator<'a, Input, Output, Stack> pub unsafe fn unsafe_new(stack: Stack, f: F) -> Generator<'a, Input, Output, Stack> where F: FnOnce(&Yielder, Input) + Send + 'a { unsafe extern "C" fn generator_wrapper(env: usize, stack_ptr: StackPointer) -> ! - where Input: Send, Output: Send, Stack: stack::Stack, - F: FnOnce(&Yielder, Input) { + where Stack: stack::Stack, F: FnOnce(&Yielder, Input) { // Retrieve our environment from the callee and return control to it. let f = ptr::read(env as *const F); let (data, stack_ptr) = arch::swap(0, stack_ptr, None); @@ -189,13 +188,12 @@ impl<'a, Input, Output, Stack> Generator<'a, Input, Output, Stack> /// Yielder is an interface provided to every generator through which it /// returns a value. #[derive(Debug)] -pub struct Yielder { +pub struct Yielder { stack_ptr: Cell, phantom: PhantomData<(*const Input, *mut Output)> } -impl Yielder - where Input: Send, Output: Send { +impl Yielder { fn new(stack_ptr: StackPointer) -> Yielder { Yielder { stack_ptr: Cell::new(stack_ptr), @@ -222,7 +220,7 @@ impl Yielder } impl<'a, Output, Stack> Iterator for Generator<'a, (), Output, Stack> - where Output: Send + 'a, Stack: stack::Stack { + where Output: 'a, Stack: stack::Stack { type Item = Output; fn next(&mut self) -> Option { self.resume(()) }