diff --git a/src/libcore/comm.rs b/src/libcore/comm.rs index f8b046e5b8c..b4d5a4f240d 100644 --- a/src/libcore/comm.rs +++ b/src/libcore/comm.rs @@ -73,11 +73,64 @@ pub fn select2i(a: &A, b: &B) -> // Streams - Make pipes a little easier in general. -proto! streamp ( +/*proto! streamp ( Open:send { data(T) -> Open } -) +)*/ + +#[allow(non_camel_case_types)] +pub mod streamp { + priv use core::kinds::Owned; + + pub fn init() -> (client::Open, server::Open) { + pub use core::pipes::HasBuffer; + ::core::pipes::entangle() + } + + #[allow(non_camel_case_types)] + pub enum Open { pub data(T, server::Open), } + + #[allow(non_camel_case_types)] + pub mod client { + priv use core::kinds::Owned; + + #[allow(non_camel_case_types)] + pub fn try_data(pipe: Open, x_0: T) -> + ::core::option::Option> { + { + use super::data; + let (c, s) = ::core::pipes::entangle(); + let message = data(x_0, s); + if ::core::pipes::send(pipe, message) { + ::core::pipes::rt::make_some(c) + } else { ::core::pipes::rt::make_none() } + } + } + + #[allow(non_camel_case_types)] + pub fn data(pipe: Open, x_0: T) -> Open { + { + use super::data; + let (c, s) = ::core::pipes::entangle(); + let message = data(x_0, s); + ::core::pipes::send(pipe, message); + c + } + } + + #[allow(non_camel_case_types)] + pub type Open = ::core::pipes::SendPacket>; + } + + #[allow(non_camel_case_types)] + pub mod server { + priv use core::kinds::Owned; + + #[allow(non_camel_case_types)] + pub type Open = ::core::pipes::RecvPacket>; + } +} #[doc(hidden)] struct Chan_ { @@ -364,11 +417,82 @@ impl { send(T) -> ! } -) +)*/ + +#[allow(non_camel_case_types)] +pub mod oneshot { + priv use core::kinds::Owned; + + pub fn init() -> (client::Oneshot, server::Oneshot) { + pub use core::pipes::HasBuffer; + + let buffer = + ~::core::pipes::Buffer{ + header: ::core::pipes::BufferHeader(), + data: __Buffer{ + Oneshot: ::core::pipes::mk_packet::>() + }, + }; + do ::core::pipes::entangle_buffer(buffer) |buffer, data| { + { + data.Oneshot.set_buffer(buffer); + ::ptr::addr_of(&(data.Oneshot)) + } + } + } + #[allow(non_camel_case_types)] + pub enum Oneshot { pub send(T), } + #[allow(non_camel_case_types)] + pub struct __Buffer { + Oneshot: ::core::pipes::Packet>, + } + + #[allow(non_camel_case_types)] + pub mod client { + + priv use core::kinds::Owned; + + #[allow(non_camel_case_types)] + pub fn try_send(pipe: Oneshot, x_0: T) -> + ::core::option::Option<()> { + { + use super::send; + let message = send(x_0); + if ::core::pipes::send(pipe, message) { + ::core::pipes::rt::make_some(()) + } else { ::core::pipes::rt::make_none() } + } + } + + #[allow(non_camel_case_types)] + pub fn send(pipe: Oneshot, x_0: T) { + { + use super::send; + let message = send(x_0); + ::core::pipes::send(pipe, message); + } + } + + #[allow(non_camel_case_types)] + pub type Oneshot = + ::core::pipes::SendPacketBuffered, + super::__Buffer>; + } + + #[allow(non_camel_case_types)] + pub mod server { + priv use core::kinds::Owned; + + #[allow(non_camel_case_types)] + pub type Oneshot = + ::core::pipes::RecvPacketBuffered, + super::__Buffer>; + } +} /// The send end of a oneshot pipe. pub type ChanOne = oneshot::client::Oneshot;