@@ -104,98 +104,64 @@ pub fn stream<T:Owned>() -> (Port<T>, Chan<T>) {
104
104
(Port_(Port_ { endp: Some(s) }), Chan_(Chan_{ endp: Some(c) }))
105
105
}
106
106
107
- // Add an inherent method so that imports of GenericChan are not
108
- // required.
109
- #[cfg(stage1)]
110
- #[cfg(stage2)]
111
- pub impl<T: Owned> Chan<T> {
112
- fn send(&self, x: T) { chan_send(self, x) }
113
- fn try_send(&self, x: T) -> bool { chan_try_send(self, x) }
114
- }
115
-
116
107
impl<T: Owned> GenericChan<T> for Chan<T> {
117
- fn send(&self, x: T) { chan_send(self, x) }
118
- }
119
-
120
- #[inline(always)]
121
- fn chan_send<T:Owned>(self: &Chan<T>, x: T) {
122
- let mut endp = None;
123
- endp <-> self.endp;
124
- self.endp = Some(
125
- streamp::client::data(unwrap(endp), x))
108
+ fn send(&self, x: T) {
109
+ let mut endp = None;
110
+ endp <-> self.endp;
111
+ self.endp = Some(
112
+ streamp::client::data(unwrap(endp), x))
113
+ }
126
114
}
127
115
128
116
impl<T: Owned> GenericSmartChan<T> for Chan<T> {
129
- fn try_send(&self, x: T) -> bool {
130
- chan_try_send(self, x)
131
- }
132
- }
133
117
134
- #[inline(always)]
135
- fn chan_try_send<T:Owned>(self: &Chan<T>, x: T) -> bool {
136
- let mut endp = None;
137
- endp <-> self.endp;
138
- match streamp::client::try_data(unwrap(endp), x) {
139
- Some(next) => {
140
- self.endp = Some(next);
141
- true
118
+ fn try_send(&self, x: T) -> bool {
119
+ let mut endp = None;
120
+ endp <-> self.endp;
121
+ match streamp::client::try_data(unwrap(endp), x) {
122
+ Some(next) => {
123
+ self.endp = Some(next);
124
+ true
125
+ }
126
+ None => false
142
127
}
143
- None => false
144
128
}
145
129
}
146
130
147
- // Use an inherent impl so that imports are not required:
148
- #[cfg(stage1)]
149
- #[cfg(stage2)]
150
- pub impl<T: Owned> Port<T> {
151
- fn recv(&self) -> T { port_recv(self) }
152
- fn try_recv(&self) -> Option<T> { port_try_recv(self) }
153
- pure fn peek(&self) -> bool { port_peek(self) }
154
- }
155
-
156
131
impl<T: Owned> GenericPort<T> for Port<T> {
157
- // These two calls will prefer the inherent versions above:
158
- fn recv(&self) -> T { port_recv(self) }
159
- fn try_recv(&self) -> Option<T> { port_try_recv(self) }
160
- }
161
-
162
- #[inline(always)]
163
- fn port_recv<T:Owned>(self: &Port<T>) -> T {
164
- let mut endp = None;
165
- endp <-> self.endp;
166
- let streamp::data(x, endp) = recv(unwrap(endp));
167
- self.endp = Some(endp);
168
- x
169
- }
170
-
171
- #[inline(always)]
172
- fn port_try_recv<T:Owned>(self: &Port<T>) -> Option<T> {
173
- let mut endp = None;
174
- endp <-> self.endp;
175
- match try_recv(unwrap(endp)) {
176
- Some(streamp::data(x, endp)) => {
132
+ fn recv(&self) -> T {
133
+ let mut endp = None;
134
+ endp <-> self.endp;
135
+ let streamp::data(x, endp) = recv(unwrap(endp));
136
+ self.endp = Some(endp);
137
+ x
138
+ }
139
+
140
+ fn try_recv(&self) -> Option<T> {
141
+ let mut endp = None;
142
+ endp <-> self.endp;
143
+ match try_recv(unwrap(endp)) {
144
+ Some(streamp::data(x, endp)) => {
177
145
self.endp = Some(endp);
178
146
Some(x)
147
+ }
148
+ None => None
179
149
}
180
- None => None
181
150
}
182
151
}
183
152
184
153
impl<T: Owned> Peekable<T> for Port<T> {
185
- pure fn peek(&self) -> bool { port_peek(self) }
186
- }
187
-
188
- #[inline(always)]
189
- pure fn port_peek<T:Owned>(self: &Port<T>) -> bool {
190
- unsafe {
191
- let mut endp = None;
192
- endp <-> self.endp;
193
- let peek = match &endp {
194
- &Some(ref endp) => peek(endp),
195
- &None => fail!(~" peeking empty stream")
196
- };
197
- self.endp <-> endp;
198
- peek
154
+ pure fn peek(&self) -> bool {
155
+ unsafe {
156
+ let mut endp = None;
157
+ endp <-> self.endp;
158
+ let peek = match &endp {
159
+ &Some(ref endp) => peek(endp),
160
+ &None => fail!(~" peeking empty stream")
161
+ };
162
+ self.endp <-> endp;
163
+ peek
164
+ }
199
165
}
200
166
}
201
167
@@ -221,16 +187,8 @@ pub fn PortSet<T: Owned>() -> PortSet<T>{
221
187
}
222
188
}
223
189
224
- // Use an inherent impl so that imports are not required:
225
- #[cfg(stage1)]
226
- #[cfg(stage2)]
227
- pub impl<T:Owned> PortSet<T> {
228
- fn recv(&self) -> T { port_set_recv(self) }
229
- fn try_recv(&self) -> Option<T> { port_set_try_recv(self) }
230
- pure fn peek(&self) -> bool { port_set_peek(self) }
231
- }
232
-
233
190
pub impl<T: Owned> PortSet<T> {
191
+
234
192
fn add(&self, port: Port<T>) {
235
193
self.ports.push(port)
236
194
}
@@ -242,89 +200,69 @@ pub impl<T: Owned> PortSet<T> {
242
200
}
243
201
}
244
202
245
- impl<T:Owned> GenericPort<T> for PortSet<T> {
246
- fn try_recv(&self) -> Option<T> { port_set_try_recv(self) }
247
- fn recv(&self) -> T { port_set_recv(self) }
248
- }
249
-
250
- #[inline(always)]
251
- fn port_set_recv<T:Owned>(self: &PortSet<T>) -> T {
252
- port_set_try_recv(self).expect(" port_set: endpoints closed")
253
- }
254
-
255
- #[inline(always)]
256
- fn port_set_try_recv<T:Owned>(self: &PortSet<T>) -> Option<T> {
257
- let mut result = None;
258
- // we have to swap the ports array so we aren't borrowing
259
- // aliasable mutable memory.
260
- let mut ports = ~[];
261
- ports <-> self.ports;
262
- while result.is_none() && ports.len() > 0 {
263
- let i = wait_many(ports);
264
- match ports[i].try_recv() {
265
- Some(m) => {
266
- result = Some(m);
267
- }
268
- None => {
269
- // Remove this port.
270
- let _ = ports.swap_remove(i);
203
+ impl<T: Owned> GenericPort<T> for PortSet<T> {
204
+
205
+ fn try_recv(&self) -> Option<T> {
206
+ let mut result = None;
207
+ // we have to swap the ports array so we aren't borrowing
208
+ // aliasable mutable memory.
209
+ let mut ports = ~[];
210
+ ports <-> self.ports;
211
+ while result.is_none() && ports.len() > 0 {
212
+ let i = wait_many(ports);
213
+ match ports[i].try_recv() {
214
+ Some(m) => {
215
+ result = Some(m);
216
+ }
217
+ None => {
218
+ // Remove this port.
219
+ let _ = ports.swap_remove(i);
220
+ }
271
221
}
272
222
}
223
+ ports <-> self.ports;
224
+ result
225
+ }
226
+
227
+ fn recv(&self) -> T {
228
+ self.try_recv().expect(" port_set: endpoints closed")
273
229
}
274
- ports <-> self.ports;
275
- result
276
- }
277
230
278
- impl<T: Owned> Peekable<T> for PortSet<T> {
279
- pure fn peek(&self) -> bool { port_set_peek(self) }
280
231
}
281
232
282
- #[inline(always)]
283
- pure fn port_set_peek<T:Owned>(self: &PortSet<T>) -> bool {
284
- // It'd be nice to use self.port.each, but that version isn't
285
- // pure.
286
- for vec::each(self.ports) |p| {
287
- if p.peek() { return true }
233
+ impl<T: Owned> Peekable<T> for PortSet<T> {
234
+ pure fn peek(&self) -> bool {
235
+ // It'd be nice to use self.port.each, but that version isn't
236
+ // pure.
237
+ for vec::each(self.ports) |p| {
238
+ if p.peek() { return true }
239
+ }
240
+ false
288
241
}
289
- false
290
242
}
291
243
292
-
293
244
/// A channel that can be shared between many senders.
294
245
pub type SharedChan<T> = unstable::Exclusive<Chan<T>>;
295
246
296
- #[cfg(stage1)]
297
- #[cfg(stage2)]
298
- pub impl<T: Owned> SharedChan<T> {
299
- fn send(&self, x: T) { shared_chan_send(self, x) }
300
- fn try_send(&self, x: T) -> bool { shared_chan_try_send(self, x) }
301
- }
302
-
303
247
impl<T: Owned> GenericChan<T> for SharedChan<T> {
304
- fn send(&self, x: T) { shared_chan_send(self, x) }
305
- }
306
-
307
- #[inline(always)]
308
- fn shared_chan_send<T:Owned>(self: &SharedChan<T>, x: T) {
309
- let mut xx = Some(x);
310
- do self.with_imm |chan| {
311
- let mut x = None;
312
- x <-> xx;
313
- chan.send(option::unwrap(x))
248
+ fn send(&self, x: T) {
249
+ let mut xx = Some(x);
250
+ do self.with_imm |chan| {
251
+ let mut x = None;
252
+ x <-> xx;
253
+ chan.send(option::unwrap(x))
254
+ }
314
255
}
315
256
}
316
257
317
258
impl<T: Owned> GenericSmartChan<T> for SharedChan<T> {
318
- fn try_send(&self, x: T) -> bool { shared_chan_try_send(self, x) }
319
- }
320
-
321
- #[inline(always)]
322
- fn shared_chan_try_send<T:Owned>(self: &SharedChan<T>, x: T) -> bool {
323
- let mut xx = Some(x);
324
- do self.with_imm |chan| {
325
- let mut x = None;
326
- x <-> xx;
327
- chan.try_send(option::unwrap(x))
259
+ fn try_send(&self, x: T) -> bool {
260
+ let mut xx = Some(x);
261
+ do self.with_imm |chan| {
262
+ let mut x = None;
263
+ x <-> xx;
264
+ chan.try_send(option::unwrap(x))
265
+ }
328
266
}
329
267
}
330
268
0 commit comments