From 672bfa5773913ce99524703e943729e3e50953b8 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Tue, 7 Aug 2012 10:14:35 -0700 Subject: [PATCH] Working on a macro for selecting from many pipes. --- src/test/run-pass/pipe-select-macro.rs | 112 +++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/test/run-pass/pipe-select-macro.rs diff --git a/src/test/run-pass/pipe-select-macro.rs b/src/test/run-pass/pipe-select-macro.rs new file mode 100644 index 000000000000..0a50e9ef8991 --- /dev/null +++ b/src/test/run-pass/pipe-select-macro.rs @@ -0,0 +1,112 @@ +// xfail-test + +// Protocols +proto! foo { + foo:recv { + do_foo -> foo + } +} + +proto! bar { + bar:recv { + do_bar(int) -> barbar, + do_baz(bool) -> bazbar, + } + + barbar:send { + rebarbar -> bar, + } + + bazbar:send { + rebazbar -> bar + } +} + + +// select! +macro_rules! select_if { + { + $index:expr, + $count:expr, + $port:path => [ + $($message:path$(($($x: ident),+))dont_type_this* + -> $next:ident $e:expr),+ + ], + $( $ports:path => [ + $($messages:path$(($($xs: ident),+))dont_type_this* + -> $nexts:ident $es:expr),+ + ], )* + } => { + log_syntax!{select_if1}; + if $index == $count { + alt move pipes::try_recv($port) { + $(some($message($($($x,)+)* next)) => { + // FIXME (#2329) we really want move out of enum here. + let $next = unsafe { let x <- *ptr::addr_of(next); x }; + $e + })+ + _ => fail + } + } else { + select_if!{ + $index, + $count + 1, + $( $ports => [ + $($messages$(($($xs),+))dont_type_this* + -> $nexts $es),+ + ], )* + } + } + }; + + { + $index:expr, + $count:expr, + } => { + log_syntax!{select_if2}; + fail + } +} + +macro_rules! select { + { + $( $port:path => { + $($message:path$(($($x: ident),+))dont_type_this* + -> $next:ident $e:expr),+ + } )+ + } => { + let index = pipes::selecti([$(($port).header()),+]/_); + log_syntax!{select}; + log_syntax!{ + select_if!{index, 0, $( $port => [ + $($message$(($($x),+))dont_type_this* -> $next $e),+ + ], )+} + }; + select_if!{index, 0, $( $port => [ + $($message$(($($x),+))dont_type_this* -> $next $e),+ + ], )+} + } +} + +// Code +fn test(+foo: foo::client::foo, +bar: bar::client::bar) { + select! { + foo => { + foo::do_foo -> _next { + } + } + + bar => { + bar::do_bar(x) -> _next { + //debug!("%?", x) + }, + + do_baz(b) -> _next { + //if b { debug!("true") } else { debug!("false") } + } + } + } +} + +fn main() { +}