pub trait Coroutine: Sized
{
type StartArguments: Sized;
type ResumeArguments: Sized;
type Yields: Sized;
type Complete: Sized;
fn coroutine<'yielder>(start_arguments: Self::StartArguments, yielder: Yielder<'yielder, Self::ResumeArguments, Self::Yields, Self::Complete>) -> Self::Complete;
#[inline(always)]
fn start_coroutine<GTACSA: GlobalThreadAndCoroutineSwitchableAllocator, CoroutineLocalAllocatorConstructor: Fn(RcMemorySource<ArenaMemorySource<MemoryMapSource>>, NonZeroUsize) -> Result<GTACSA::CoroutineLocalAllocator, AllocErr>>(coroutine_memory_source: &CoroutineMemorySource<GTACSA, CoroutineLocalAllocatorConstructor>, start_arguments: Self::StartArguments) -> Result<StartOutcome<GTACSA, Self>, AllocErr>
{
let coroutine_memory = coroutine_memory_source.allocate_coroutine_memory()?;
Ok(CoroutineInstance::new(coroutine_memory).start(start_arguments))
}
#[doc(hidden)]
#[inline(never)]
extern "C" fn context_entry_point_function_pointer(transfer: Transfer) -> !
{
let mut type_safe_transfer = TypeSafeTransfer::<ParentInstructingChild<Self::ResumeArguments>, ChildOutcome<Self::Yields, Self::Complete>>::wrap(transfer);
let start_child_arguments: Self::StartArguments = type_safe_transfer.start_child_arguments();
let result =
{
let yielder = Yielder::new(&mut type_safe_transfer);
catch_unwind(AssertUnwindSafe(|| Self::coroutine(start_child_arguments, yielder)))
};
type_safe_transfer.resume_drop_safe(ChildOutcome::Complete(result));
unsafe { unreachable() }
}
}