@@ -3,6 +3,7 @@ use rustler_sys::c_char;
3
3
use crate :: codegen_runtime:: { NifReturnable , NifReturned } ;
4
4
use crate :: wrapper:: ErlNifTaskFlags ;
5
5
use crate :: Env ;
6
+ use std:: { ffi:: CStr , marker:: PhantomData } ;
6
7
7
8
pub enum SchedulerFlags {
8
9
Normal = ErlNifTaskFlags :: ERL_NIF_NORMAL_JOB as isize ,
@@ -42,12 +43,13 @@ pub fn consume_timeslice(env: Env, percent: i32) -> bool {
42
43
/// ## Example:
43
44
/// ```rust,ignore
44
45
/// #[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 > {
46
47
/// let result = result.unwrap_or(1);
47
48
/// if input == 0 {
48
49
/// Schedule::Result(result)
49
50
/// } 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)
51
53
/// }
52
54
/// }
53
55
/// ```
@@ -56,13 +58,34 @@ pub enum Schedule<N: crate::Nif, T, A = (), B = (), C = (), D = (), E = (), F =
56
58
Result ( T ) ,
57
59
/// Single- and multiple-argument variants that should reflect the scheduled
58
60
/// 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 , ) }
66
89
}
67
90
68
91
unsafe impl < N , T , A , B , C , D , E , F , G > NifReturnable for Schedule < N , T , A , B , C , D , E , F , G >
82
105
macro_rules! branch {
83
106
( $( $arg: tt) ,* ) => (
84
107
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( ) ,
86
109
flags: SchedulerFlags :: from( N :: FLAGS as isize ) ,
87
110
fun: N :: RAW_FUNC ,
88
111
args: vec![ $( $arg. encode( env) . as_c_arg( ) ) ,* ] ,
0 commit comments