Last active
November 21, 2018 02:50
-
-
Save 0e4ef622/112fb94fcb5dee60c0481fdb6b098995 to your computer and use it in GitHub Desktop.
why have i done this
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
macro_rules! gen_execute_macro { | |
($(($($idl:tt $it:tt $in:tt),*), ($($odl:tt $ot:tt $on:tt),*),)*) => { | |
macro_rules! execute_2 { | |
$( | |
($oname:ident, ($($idl$it:ty),*), ($($odl$ot:ty),*)) => { | |
fn execute(&self, in_var: Self::InType) -> Self::OutType { | |
let mut res = Self::OutType::default(); | |
let kmut = (*KERNEL).clone(); | |
let mut k = kmut.lock(); | |
unsafe { | |
$oname(&mut *k, | |
$(&mut res.$on),*, | |
$(in_var.$in),*); | |
futhark_context_sync(&mut *k); | |
} | |
res | |
} | |
}; | |
)* | |
} | |
}; | |
($(($($idl:tt $it:tt $in:tt),*), $odl:tt $ot:tt,)*) => { | |
macro_rules! execute_l { | |
$( | |
($oname:ident, ($($idl$it:ty),*), $otype:ty) => { | |
fn execute(&self, in_var: Self::InType) -> Self::OutType { | |
let mut res = Self::OutType::default(); | |
let kmut = (*KERNEL).clone(); | |
let mut k = kmut.lock(); | |
unsafe { | |
$oname(&mut *k, | |
&mut res, | |
$(in_var.$in),*); | |
futhark_context_sync(&mut *k); | |
} | |
res | |
} | |
}; | |
)* | |
} | |
}; | |
($($idl:tt $it:tt, ($($odl:tt $ot:tt $on:tt),*),)*) => { | |
macro_rules! execute_r { | |
$( | |
($oname:ident, $itype:ty, ($($odl$ot:ty),*)) => { | |
fn execute(&self, in_var: Self::InType) -> Self::OutType { | |
let mut res = Self::OutType::default(); | |
let kmut = (*KERNEL).clone(); | |
let mut k = kmut.lock(); | |
unsafe { | |
$oname(&mut *k, | |
$(&mut res.$on),*, | |
in_var); | |
futhark_context_sync(&mut *k); | |
} | |
res | |
} | |
}; | |
)* | |
} | |
}; | |
} | |
macro_rules! execute_n { | |
($oname:ident, $itype:ty, $otype:ty) => { | |
fn execute(&self, in_var: Self::InType) -> Self::OutType { | |
let mut res = Self::OutType::default(); | |
let kmut = (*KERNEL).clone(); | |
let mut k = kmut.lock(); | |
unsafe { | |
$oname(&mut *k, | |
&mut res, | |
in_var); | |
futhark_context_sync(&mut *k); | |
} | |
res | |
} | |
}; | |
} | |
gen_execute_macro! { | |
($a 0, $z 1), ($b 0, $c 1), | |
($a 0, $z 1), ($b 0, $c 1, $d 2), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2), ($b 0, $c 1), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3, $w 4), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $f 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $g 4), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
($a 0, $z 1, $y 2, $x 3, $w 4, $v 5, $u 6, $t 7, $s 8, $r 9), ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
} | |
gen_execute_macro! { | |
$a, ($b 0, $c 1), | |
$a, ($b 0, $c 1, $d 2), | |
$a, ($b 0, $c 1, $d 2, $e 3), | |
$a, ($b 0, $c 1, $d 2, $e 3, $f 4), | |
$a, ($b 0, $c 1, $d 2, $e 3, $g 4), | |
$a, ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), | |
$a, ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), | |
$a, ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), | |
$a, ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), | |
$a, ($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), | |
} | |
gen_execute_macro! { | |
($b 0, $c 1), $a, | |
($b 0, $c 1, $d 2), $a, | |
($b 0, $c 1, $d 2, $e 3), $a, | |
($b 0, $c 1, $d 2, $e 3, $f 4), $a, | |
($b 0, $c 1, $d 2, $e 3, $g 4), $a, | |
($b 0, $c 1, $d 2, $e 3, $g 4, $h 5), $a, | |
($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6), $a, | |
($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7), $a, | |
($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8), $a, | |
($b 0, $c 1, $d 2, $e 3, $g 4, $h 5, $i 6, $j 7, $k 8, $l 9), $a, | |
} | |
macro_rules! execute { | |
($oname: ident, ($($itype:ty),*), ($($otype:ty),*)) => ( | |
execute_2!($oname, ($($itype),*), ($($otype),*)); | |
); | |
($oname: ident, ($($itype:ty),*), $otype:ty) => ( | |
execute_l!($oname, ($($itype),*), $otype); | |
); | |
($oname: ident, $itype:ty, ($($otype:ty),*)) => ( | |
execute_r!($oname, $itype, ($($otype),*)); | |
); | |
($oname: ident, $itype:ty, $otype:ty) => ( | |
execute_n!($oname, $itype, $otype); | |
); | |
} | |
macro_rules! futhark_entry { | |
(@itype $itype:ty, $_:ty) => ($itype); | |
(@otype $_:ty, $otype:ty) => ($otype); | |
($fname:ident, $oname:ident, $($types:tt)*) => { | |
pub struct $fname; | |
impl FutharkFunction for $fname { | |
type InType = futhark_entry!(@itype $($types)*); | |
type OutType = futhark_entry!(@otype $($types)*); | |
execute!($oname, $($types)*); | |
} | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment