4 // XFAIL'd because this is going to be revamped, and it's not compatible as
5 // written with the new mutability rules.
7 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
8 // file at the top-level directory of this distribution and at
9 // http://rust-lang.org/COPYRIGHT.
11 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
12 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
13 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
14 // option. This file may not be copied, modified, or distributed
15 // except according to those terms.
17 // Examples from Eric's internship final presentation.
19 // Code is easier to write in emacs, and it's good to be sure all the
20 // code samples compile (or not) as they should.
22 use double_buffer::client::*;
23 use double_buffer::give_buffer;
24 use std::comm::Selectable;
26 macro_rules! select_if (
31 $($message:path$(($($x: ident),+))dont_type_this*
32 -> $next:ident $e:expr),+
35 $($messages:path$(($($xs: ident),+))dont_type_this*
36 -> $nexts:ident $es:expr),+
40 match std::pipes::try_recv($port) {
41 $(Some($message($($($x,)+)* next)) => {
52 $($messages$(($($xs),+))dont_type_this*
70 $($message:path$(($($x: ident),+))dont_type_this*
71 -> $next:ident $e:expr),+
74 let index = std::comm::selecti([$(($port).header()),+]);
75 select_if!(index, 0, $( $port => [
76 $($message$(($($x),+))dont_type_this* -> $next $e),+
81 // Types and protocols
87 impl Drop for Buffer {
91 proto! double_buffer (
93 request -> wait_buffer
97 give_buffer(::Buffer) -> release
101 release(::Buffer) -> acquire
106 fn render(_buffer: &Buffer) {
110 fn draw_frame(+channel: double_buffer::client::acquire) {
111 let channel = request(channel);
114 give_buffer(buffer) -> channel {
116 release(channel, buffer)
122 fn draw_two_frames(+channel: double_buffer::client::acquire) {
123 let channel = request(channel);
124 let channel = select! (
126 give_buffer(buffer) -> channel {
128 release(channel, buffer)
132 let channel = request(channel);
135 give_buffer(buffer) -> channel {
137 release(channel, buffer)
144 fn draw_two_frames_bad1(+channel: double_buffer::client::acquire) {
145 let channel = request(channel);
148 give_buffer(buffer) -> channel {
153 let channel = request(channel);
156 give_buffer(buffer) -> channel {
158 release(channel, buffer)
165 fn draw_two_frames_bad2(+channel: double_buffer::client::acquire) {
166 let channel = request(channel);
169 give_buffer(buffer) -> channel {
171 release(channel, buffer);
173 release(channel, buffer);