1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
18 fn print_complements() {
19 let all = [Blue, Red, Yellow];
20 for aa in all.iter() {
21 for bb in all.iter() {
22 println!("{} + {} -> {}", show_color(*aa), show_color(*bb),
23 show_color(transform(*aa, *bb)));
28 enum color { Red, Yellow, Blue }
35 fn show_color(cc: color) -> ~str {
43 fn show_color_list(set: Vec<color>) -> ~str {
45 for col in set.iter() {
47 out.push_str(show_color(*col));
52 fn show_digit(nn: uint) -> ~str {
64 _ => {fail!("expected digits from 0 to 9...")}
68 fn show_number(nn: uint) -> ~str {
73 if num == 0 { out = show_digit(0) };
78 out = show_digit(dig) + " " + out;
84 fn transform(aa: color, bb: color) -> color {
86 (Red, Red ) => { Red }
87 (Red, Yellow) => { Blue }
88 (Red, Blue ) => { Yellow }
89 (Yellow, Red ) => { Blue }
90 (Yellow, Yellow) => { Yellow }
91 (Yellow, Blue ) => { Red }
92 (Blue, Red ) => { Yellow }
93 (Blue, Yellow) => { Red }
94 (Blue, Blue ) => { Blue }
101 from_rendezvous: Receiver<Option<CreatureInfo>>,
102 to_rendezvous: Sender<CreatureInfo>,
103 to_rendezvous_log: Sender<~str>
105 let mut color = color;
106 let mut creatures_met = 0;
107 let mut evil_clones_met = 0;
111 to_rendezvous.send(CreatureInfo {name: name, color: color});
112 let resp = from_rendezvous.recv();
114 // log and change, or print and quit
116 option::Some(other_creature) => {
117 color = transform(color, other_creature.color);
119 // track some statistics
121 if other_creature.name == name {
122 evil_clones_met += 1;
126 // log creatures met and evil clones of self
127 let report = format!("{} {}",
128 creatures_met, show_number(evil_clones_met));
129 to_rendezvous_log.send(report);
136 fn rendezvous(nn: uint, set: Vec<color>) {
138 // these ports will allow us to hear from the creatures
139 let (to_rendezvous, from_creatures) = channel::<CreatureInfo>();
140 let (to_rendezvous_log, from_creatures_log) = channel::<~str>();
142 // these channels will be passed to the creatures so they can talk to us
144 // these channels will allow us to talk to each creature by 'name'/index
145 let mut to_creature: Vec<Sender<Option<CreatureInfo>>> =
146 set.iter().enumerate().map(|(ii, col)| {
147 // create each creature as a listener with a port, and
148 // give us a channel to talk to each
151 let to_rendezvous = to_rendezvous.clone();
152 let to_rendezvous_log = to_rendezvous_log.clone();
153 let (to_creature, from_rendezvous) = channel();
158 to_rendezvous.clone(),
159 to_rendezvous_log.clone());
164 let mut creatures_met = 0;
166 // set up meetings...
167 for _ in range(0, nn) {
168 let mut fst_creature: CreatureInfo = from_creatures.recv();
169 let mut snd_creature: CreatureInfo = from_creatures.recv();
173 to_creature.get_mut(fst_creature.name).send(Some(snd_creature));
174 to_creature.get_mut(snd_creature.name).send(Some(fst_creature));
177 // tell each creature to stop
178 for to_one in to_creature.iter() {
182 // save each creature's meeting stats
183 let mut report = Vec::new();
184 for _to_one in to_creature.iter() {
185 report.push(from_creatures_log.recv());
188 // print each color in the set
189 println!("{}", show_color_list(set));
191 // print each creature's stats
192 for rep in report.iter() {
193 println!("{}", *rep);
196 // print the total number of creatures met
197 println!("{}", show_number(creatures_met));
201 let args = os::args();
202 let args = if os::getenv("RUST_BENCH").is_some() {
204 } else if args.len() <= 1u {
207 args.move_iter().collect()
210 let nn = from_str::<uint>(*args.get(1)).unwrap();
215 rendezvous(nn, vec!(Blue, Red, Yellow));
219 vec!(Blue, Red, Yellow, Red, Yellow, Blue, Red, Yellow, Red, Blue));