@@ -3,6 +3,7 @@ use rustler_sys::c_char;
33use crate :: codegen_runtime:: { NifReturnable , NifReturned } ;
44use crate :: wrapper:: ErlNifTaskFlags ;
55use crate :: Env ;
6+ use std:: { ffi:: CStr , marker:: PhantomData } ;
67
78pub enum SchedulerFlags {
89 Normal = ErlNifTaskFlags :: ERL_NIF_NORMAL_JOB as isize ,
@@ -42,12 +43,13 @@ pub fn consume_timeslice(env: Env, percent: i32) -> bool {
4243/// ## Example:
4344/// ```rust,ignore
4445/// #[nif]
45- /// fn factorial(input: u32, result: Option<u32>) -> Schedule<factorial, u32, u32> {
46+ /// fn factorial(input: u32, result: Option<u32>) -> Schedule<factorial, u32, u32, u32 > {
4647/// let result = result.unwrap_or(1);
4748/// if input == 0 {
4849/// Schedule::Result(result)
4950/// } else {
50- /// Schedule::Next2(factorial, input - 1, result * input)
51+ /// // alternatively `Schedule::Next2(std::marker::PhantomData, input - 1, result * input)`
52+ /// Schedule::next2(input - 1, result * input)
5153/// }
5254/// }
5355/// ```
@@ -56,13 +58,34 @@ pub enum Schedule<N: crate::Nif, T, A = (), B = (), C = (), D = (), E = (), F =
5658 Result ( T ) ,
5759 /// Single- and multiple-argument variants that should reflect the scheduled
5860 /// NIF's function signature.
59- Next ( N , A ) ,
60- Next2 ( N , A , B ) ,
61- Next3 ( N , A , B , C ) ,
62- Next4 ( N , A , B , C , D ) ,
63- Next5 ( N , A , B , C , D , E ) ,
64- Next6 ( N , A , B , C , D , E , F ) ,
65- Next7 ( N , A , B , C , D , E , F , G ) ,
61+ Next ( PhantomData < N > , A ) ,
62+ Next2 ( PhantomData < N > , A , B ) ,
63+ Next3 ( PhantomData < N > , A , B , C ) ,
64+ Next4 ( PhantomData < N > , A , B , C , D ) ,
65+ Next5 ( PhantomData < N > , A , B , C , D , E ) ,
66+ Next6 ( PhantomData < N > , A , B , C , D , E , F ) ,
67+ Next7 ( PhantomData < N > , A , B , C , D , E , F , G ) ,
68+ }
69+
70+ macro_rules! impl_func {
71+ ( $variant: ident $func_name: ident( $( $arg: ident : $ty: ty, ) * ) ) => {
72+ /// Shorthand for creating a [`Schedule`] variant.
73+ ///
74+ /// [`Schedule`]: crate::schedule::Schedule
75+ pub fn $func_name( $( $arg: $ty) ,* ) -> Self {
76+ Self :: $variant( PhantomData , $( $arg) ,* )
77+ }
78+ } ;
79+ }
80+
81+ impl < N : crate :: Nif , T , A , B , C , D , E , F , G > Schedule < N , T , A , B , C , D , E , F , G > {
82+ impl_func ! { Next next( a: A , ) }
83+ impl_func ! { Next2 next2( a: A , b: B , ) }
84+ impl_func ! { Next3 next3( a: A , b: B , c: C , ) }
85+ impl_func ! { Next4 next4( a: A , b: B , c: C , d: D , ) }
86+ impl_func ! { Next5 next5( a: A , b: B , c: C , d: D , e: E , ) }
87+ impl_func ! { Next6 next6( a: A , b: B , c: C , d: D , e: E , f: F , ) }
88+ impl_func ! { Next7 next7( a: A , b: B , c: C , d: D , e: E , f: F , g: G , ) }
6689}
6790
6891unsafe impl < N , T , A , B , C , D , E , F , G > NifReturnable for Schedule < N , T , A , B , C , D , E , F , G >
82105 macro_rules! branch {
83106 ( $( $arg: tt) ,* ) => (
84107 NifReturned :: Reschedule {
85- fun_name: std :: ffi :: CStr :: from_ptr( N :: NAME as * const c_char) . into( ) ,
108+ fun_name: CStr :: from_ptr( N :: NAME as * const c_char) . into( ) ,
86109 flags: SchedulerFlags :: from( N :: FLAGS as isize ) ,
87110 fun: N :: RAW_FUNC ,
88111 args: vec![ $( $arg. encode( env) . as_c_arg( ) ) ,* ] ,
0 commit comments