Skip to content

Commit 51a17cc

Browse files
committed
---
yaml --- r: 85329 b: refs/heads/dist-snap c: 11b3d76 h: refs/heads/master i: 85327: 29450e3 v: v3
1 parent 6e8b1f4 commit 51a17cc

File tree

13 files changed

+536
-470
lines changed

13 files changed

+536
-470
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ refs/heads/try: 0983ebe5310d4eb6d289f636f7ed0536c08bbc0e
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
9-
refs/heads/dist-snap: f02cc6bf0a276115a31354b1c1530e6fe9eb4d58
9+
refs/heads/dist-snap: 11b3d76fb6ae627aea1b2a3a3de2807c21f9e720
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1212
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/src/libstd/cell.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
#[missing_doc];
1414

1515
use cast::transmute_mut;
16-
use unstable::finally::Finally;
1716
use prelude::*;
1817

1918
/*
@@ -66,17 +65,18 @@ impl<T> Cell<T> {
6665

6766
/// Calls a closure with a reference to the value.
6867
pub fn with_ref<R>(&self, op: &fn(v: &T) -> R) -> R {
69-
do self.with_mut_ref |ptr| { op(ptr) }
68+
let v = self.take();
69+
let r = op(&v);
70+
self.put_back(v);
71+
r
7072
}
7173

7274
/// Calls a closure with a mutable reference to the value.
7375
pub fn with_mut_ref<R>(&self, op: &fn(v: &mut T) -> R) -> R {
74-
let mut v = Some(self.take());
75-
do (|| {
76-
op(v.get_mut_ref())
77-
}).finally {
78-
self.put_back(v.take_unwrap());
79-
}
76+
let mut v = self.take();
77+
let r = op(&mut v);
78+
self.put_back(v);
79+
r
8080
}
8181
}
8282

branches/dist-snap/src/libstd/rand.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,26 @@ pub trait RngUtil {
461461
* ~~~
462462
*/
463463
fn shuffle_mut<T>(&mut self, values: &mut [T]);
464+
465+
/**
466+
* Sample up to `n` values from an iterator.
467+
*
468+
* # Example
469+
*
470+
* ~~~ {.rust}
471+
*
472+
* use std::rand;
473+
* use std::rand::RngUtil;
474+
*
475+
* fn main() {
476+
* let mut rng = rand::rng();
477+
* let vals = range(1, 100).to_owned_vec();
478+
* let sample = rng.sample(vals.iter(), 5);
479+
* printfln!(sample);
480+
* }
481+
* ~~~
482+
*/
483+
fn sample<A, T: Iterator<A>>(&mut self, iter: T, n: uint) -> ~[A];
464484
}
465485

466486
/// Extension methods for random number generators
@@ -607,6 +627,23 @@ impl<R: Rng> RngUtil for R {
607627
values.swap(i, self.gen_uint_range(0u, i + 1u));
608628
}
609629
}
630+
631+
/// Randomly sample up to `n` elements from an iterator
632+
fn sample<A, T: Iterator<A>>(&mut self, iter: T, n: uint) -> ~[A] {
633+
let mut reservoir : ~[A] = vec::with_capacity(n);
634+
for (i, elem) in iter.enumerate() {
635+
if i < n {
636+
reservoir.push(elem);
637+
loop
638+
}
639+
640+
let k = self.gen_uint_range(0, i + 1);
641+
if k < reservoir.len() {
642+
reservoir[k] = elem
643+
}
644+
}
645+
reservoir
646+
}
610647
}
611648

612649
/// Create a random number generator with a default algorithm and seed.
@@ -914,6 +951,7 @@ pub fn random<T: Rand>() -> T {
914951

915952
#[cfg(test)]
916953
mod test {
954+
use iterator::{Iterator, range};
917955
use option::{Option, Some};
918956
use super::*;
919957

@@ -1130,6 +1168,24 @@ mod test {
11301168
}
11311169
}
11321170
}
1171+
1172+
#[test]
1173+
fn test_sample() {
1174+
let MIN_VAL = 1;
1175+
let MAX_VAL = 100;
1176+
1177+
let mut r = rng();
1178+
let vals = range(MIN_VAL, MAX_VAL).to_owned_vec();
1179+
let small_sample = r.sample(vals.iter(), 5);
1180+
let large_sample = r.sample(vals.iter(), vals.len() + 5);
1181+
1182+
assert_eq!(small_sample.len(), 5);
1183+
assert_eq!(large_sample.len(), vals.len());
1184+
1185+
assert!(small_sample.iter().all(|e| {
1186+
**e >= MIN_VAL && **e <= MAX_VAL
1187+
}));
1188+
}
11331189
}
11341190

11351191
#[cfg(test)]

branches/dist-snap/src/libstd/rt/comm.rs

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ use kinds::Send;
1818
use rt;
1919
use rt::sched::Scheduler;
2020
use rt::local::Local;
21-
use rt::select::{SelectInner, SelectPortInner};
22-
use select::{Select, SelectPort};
21+
use rt::select::{Select, SelectPort};
2322
use unstable::atomics::{AtomicUint, AtomicOption, Acquire, Relaxed, SeqCst};
2423
use unstable::sync::UnsafeAtomicRcBox;
2524
use util::Void;
@@ -114,9 +113,7 @@ impl<T> ChanOne<T> {
114113
// 'do_resched' configures whether the scheduler immediately switches to
115114
// the receiving task, or leaves the sending task still running.
116115
fn try_send_inner(self, val: T, do_resched: bool) -> bool {
117-
if do_resched {
118-
rtassert!(!rt::in_sched_context());
119-
}
116+
rtassert!(!rt::in_sched_context());
120117

121118
let mut this = self;
122119
let mut recvr_active = true;
@@ -218,7 +215,7 @@ impl<T> PortOne<T> {
218215
}
219216
}
220217

221-
impl<T> SelectInner for PortOne<T> {
218+
impl<T> Select for PortOne<T> {
222219
#[inline] #[cfg(not(test))]
223220
fn optimistic_check(&mut self) -> bool {
224221
unsafe { (*self.packet()).state.load(Acquire) == STATE_ONE }
@@ -321,9 +318,7 @@ impl<T> SelectInner for PortOne<T> {
321318
}
322319
}
323320

324-
impl<T> Select for PortOne<T> { }
325-
326-
impl<T> SelectPortInner<T> for PortOne<T> {
321+
impl<T> SelectPort<T> for PortOne<T> {
327322
fn recv_ready(self) -> Option<T> {
328323
let mut this = self;
329324
let packet = this.packet();
@@ -354,8 +349,6 @@ impl<T> SelectPortInner<T> for PortOne<T> {
354349
}
355350
}
356351

357-
impl<T> SelectPort<T> for PortOne<T> { }
358-
359352
impl<T> Peekable<T> for PortOne<T> {
360353
fn peek(&self) -> bool {
361354
unsafe {
@@ -520,7 +513,7 @@ impl<T> Peekable<T> for Port<T> {
520513
// of them, but a &Port<T> should also be selectable so you can select2 on it
521514
// alongside a PortOne<U> without passing the port by value in recv_ready.
522515

523-
impl<'self, T> SelectInner for &'self Port<T> {
516+
impl<'self, T> Select for &'self Port<T> {
524517
#[inline]
525518
fn optimistic_check(&mut self) -> bool {
526519
do self.next.with_mut_ref |pone| { pone.optimistic_check() }
@@ -538,9 +531,7 @@ impl<'self, T> SelectInner for &'self Port<T> {
538531
}
539532
}
540533

541-
impl<'self, T> Select for &'self Port<T> { }
542-
543-
impl<T> SelectInner for Port<T> {
534+
impl<T> Select for Port<T> {
544535
#[inline]
545536
fn optimistic_check(&mut self) -> bool {
546537
(&*self).optimistic_check()
@@ -557,9 +548,7 @@ impl<T> SelectInner for Port<T> {
557548
}
558549
}
559550

560-
impl<T> Select for Port<T> { }
561-
562-
impl<'self, T> SelectPortInner<T> for &'self Port<T> {
551+
impl<'self, T> SelectPort<T> for &'self Port<T> {
563552
fn recv_ready(self) -> Option<T> {
564553
match self.next.take().recv_ready() {
565554
Some(StreamPayload { val, next }) => {
@@ -571,8 +560,6 @@ impl<'self, T> SelectPortInner<T> for &'self Port<T> {
571560
}
572561
}
573562

574-
impl<'self, T> SelectPort<T> for &'self Port<T> { }
575-
576563
pub struct SharedChan<T> {
577564
// Just like Chan, but a shared AtomicOption instead of Cell
578565
priv next: UnsafeAtomicRcBox<AtomicOption<StreamChanOne<T>>>

branches/dist-snap/src/libstd/rt/kill.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,8 @@ impl Death {
488488
rtassert!(self.unkillable == 0);
489489
self.unkillable = 1;
490490

491-
// NB. See corresponding comment at the callsite in task.rs.
492-
// FIXME(#8192): Doesn't work with "let _ = ..."
491+
// FIXME(#7544): See corresponding fixme at the callsite in task.rs.
492+
// NB(#8192): Doesn't work with "let _ = ..."
493493
{ use util; util::ignore(group); }
494494

495495
// Step 1. Decide if we need to collect child failures synchronously.

branches/dist-snap/src/libstd/rt/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ pub mod tube;
142142
/// Simple reimplementation of core::comm
143143
pub mod comm;
144144

145-
mod select;
145+
/// Routines for select()ing on pipes.
146+
pub mod select;
146147

147148
// FIXME #5248 shouldn't be pub
148149
/// The runtime needs to be able to put a pointer into thread-local storage.

0 commit comments

Comments
 (0)