Skip to content

Commit 1b1e4ca

Browse files
committed
std::vec: add a sugary .sort() method for plain Ord sorting.
This moves the custom sorting to `.sort_by`.
1 parent 48fedcb commit 1b1e4ca

File tree

16 files changed

+91
-27
lines changed

16 files changed

+91
-27
lines changed

src/libextra/glob.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ impl Iterator<Path> for GlobIterator {
148148
fn list_dir_sorted(path: &Path) -> ~[Path] {
149149
match io::result(|| fs::readdir(path)) {
150150
Ok(mut children) => {
151-
children.sort(|p1, p2| p2.filename() <= p1.filename());
151+
children.sort_by(|p1, p2| p2.filename() <= p1.filename());
152152
children
153153
}
154154
Err(..) => ~[]

src/libextra/priority_queue.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,11 @@ mod tests {
231231
fn test_top_and_pop() {
232232
let data = ~[2u, 4, 6, 2, 1, 8, 10, 3, 5, 7, 0, 9, 1];
233233
let mut sorted = data.clone();
234+
<<<<<<< HEAD
234235
sorted.sort(|x, y| x.le(y));
236+
=======
237+
sorted.sort();
238+
>>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
235239
let mut heap = PriorityQueue::from_vec(data);
236240
while !heap.is_empty() {
237241
assert_eq!(heap.top(), sorted.last());
@@ -314,8 +318,8 @@ mod tests {
314318
fn check_to_vec(mut data: ~[int]) {
315319
let heap = PriorityQueue::from_vec(data.clone());
316320
let mut v = heap.clone().to_vec();
317-
v.sort(|x, y| x.le(y));
318-
data.sort(|x, y| x.le(y));
321+
v.sort();
322+
data.sort();
319323

320324
assert_eq!(v, data);
321325
assert_eq!(heap.to_sorted_vec(), data);

src/libextra/stats.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,13 @@ impl<'a> Stats for &'a [f64] {
239239

240240
fn percentile(self, pct: f64) -> f64 {
241241
let mut tmp = self.to_owned();
242-
tmp.sort(|a,b| a <= b);
242+
tmp.sort();
243243
percentile_of_sorted(tmp, pct)
244244
}
245245

246246
fn quartiles(self) -> (f64,f64,f64) {
247247
let mut tmp = self.to_owned();
248-
tmp.sort(|a,b| a <= b);
248+
tmp.sort();
249249
let a = percentile_of_sorted(tmp, 25.0);
250250
let b = percentile_of_sorted(tmp, 50.0);
251251
let c = percentile_of_sorted(tmp, 75.0);
@@ -290,7 +290,7 @@ fn percentile_of_sorted(sorted_samples: &[f64],
290290
/// See: http://en.wikipedia.org/wiki/Winsorising
291291
pub fn winsorize(samples: &mut [f64], pct: f64) {
292292
let mut tmp = samples.to_owned();
293-
tmp.sort(|a,b| a <= b);
293+
tmp.sort();
294294
let lo = percentile_of_sorted(tmp, pct);
295295
let hi = percentile_of_sorted(tmp, 100.0-pct);
296296
for samp in samples.mut_iter() {

src/libextra/test.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ use std::to_str::ToStr;
3737
use std::f64;
3838
use std::os;
3939

40-
4140
// The name of a test. By convention this follows the rules for rust
4241
// paths; i.e. it should be a series of identifiers separated by double
4342
// colons. This way if some test runner wants to arrange the tests
@@ -487,7 +486,7 @@ impl<T: Writer> ConsoleTestState<T> {
487486
for f in self.failures.iter() {
488487
failures.push(f.name.to_str());
489488
}
490-
failures.sort(|a,b| a <= b);
489+
failures.sort();
491490
for name in failures.iter() {
492491
self.write_plain(format!(" {}\n", name.to_str()));
493492
}
@@ -841,7 +840,7 @@ pub fn filter_tests(
841840
fn lteq(t1: &TestDescAndFn, t2: &TestDescAndFn) -> bool {
842841
t1.desc.name.to_str() <= t2.desc.name.to_str()
843842
}
844-
filtered.sort(lteq);
843+
filtered.sort_by(lteq);
845844

846845
// Shard the remaining tests, if sharding requested.
847846
match opts.test_shard {

src/librustc/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ Available lint options:
162162
let mut lint_dict = lint_dict.move_iter()
163163
.map(|(k, v)| (v, k))
164164
.collect::<~[(lint::LintSpec, &'static str)]>();
165-
lint_dict.sort(|a,b| a <= b);
165+
lint_dict.sort();
166166

167167
let mut max_key = 0;
168168
for &(_, name) in lint_dict.iter() {

src/librustc/metadata/cstore.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ pub fn get_dep_hashes(cstore: &CStore) -> ~[@str] {
191191
});
192192
}
193193

194-
result.sort(|a, b| (a.name, a.vers, a.hash) <= (b.name, b.vers, b.hash));
194+
result.sort();
195195

196196
debug!("sorted:");
197197
for x in result.iter() {

src/librustc/metadata/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ fn encode_crate_deps(ecx: &EncodeContext,
15311531
});
15321532

15331533
// Sort by cnum
1534-
deps.sort(|kv1, kv2| kv1.cnum <= kv2.cnum);
1534+
deps.sort_by(|kv1, kv2| kv1.cnum <= kv2.cnum);
15351535

15361536
// Sanity-check the crate numbers
15371537
let mut expected_cnum = 1;

src/librustc/middle/check_match.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ fn missing_ctor(cx: &MatchCheckCtxt,
464464

465465
// Sort them by length such that for patterns of the same length,
466466
// those with a destructured slice come first.
467-
vec_pat_lens.sort(|&(len1, slice1), &(len2, slice2)| {
467+
vec_pat_lens.sort_by(|&(len1, slice1), &(len2, slice2)| {
468468
if len1 == len2 {
469469
slice1 > slice2
470470
} else {

src/librustc/middle/trans/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3163,7 +3163,7 @@ pub fn trans_crate(sess: session::Session,
31633163
println!("n_closures: {}", ccx.stats.n_closures);
31643164
println("fn stats:");
31653165

3166-
ccx.stats.fn_stats.sort(|&(_, _, insns_a), &(_, _, insns_b)| insns_a >= insns_b);
3166+
ccx.stats.fn_stats.sort_by(|&(_, _, insns_a), &(_, _, insns_b)| insns_a >= insns_b);
31673167

31683168
for tuple in ccx.stats.fn_stats.iter() {
31693169
match *tuple {

src/librustdoc/html/render.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,7 @@ fn item_module(w: &mut Writer, cx: &Context,
935935
}
936936

937937
debug!("{:?}", indices);
938-
indices.sort(|&i1, &i2| le(&items[i1], &items[i2], i1, i2));
938+
indices.sort_by(|&i1, &i2| le(&items[i1], &items[i2], i1, i2));
939939

940940
debug!("{:?}", indices);
941941
let mut curty = "";

src/libstd/prelude.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ pub use tuple::{Tuple1, Tuple2, Tuple3, Tuple4};
7979
pub use tuple::{Tuple5, Tuple6, Tuple7, Tuple8};
8080
pub use tuple::{Tuple9, Tuple10, Tuple11, Tuple12};
8181
pub use vec::{ImmutableEqVector, ImmutableTotalOrdVector, ImmutableCopyableVector};
82-
pub use vec::{OwnedVector, OwnedCopyableVector,OwnedEqVector, MutableVector};
82+
pub use vec::{OwnedVector, OwnedCopyableVector,OwnedEqVector, MutableVector, MutableOrdVector};
8383
pub use vec::{Vector, VectorVector, CopyableVector, ImmutableVector};
8484

8585
// Reexported runtime types

src/libstd/vec.rs

+63-6
Original file line numberDiff line numberDiff line change
@@ -2181,7 +2181,7 @@ pub trait MutableVector<'a, T> {
21812181
/// v.sort(|a, b| *b <= *a);
21822182
/// assert_eq!(v, [5, 4, 3, 2, 1]);
21832183
/// ```
2184-
fn sort(self, less_eq: |&T, &T| -> bool);
2184+
fn sort_by(self, less_eq: |&T, &T| -> bool);
21852185

21862186
/**
21872187
* Consumes `src` and moves as many elements as it can into `self`
@@ -2328,7 +2328,11 @@ impl<'a,T> MutableVector<'a, T> for &'a mut [T] {
23282328
}
23292329

23302330
#[inline]
2331+
<<<<<<< HEAD
23312332
fn sort(self, less_eq: |&T, &T| -> bool) {
2333+
=======
2334+
fn sort_by<Sort: SortComparator<T>>(self, less_eq: Sort) {
2335+
>>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
23322336
merge_sort(self, less_eq)
23332337
}
23342338

@@ -2385,6 +2389,32 @@ impl<'a, T:Clone> MutableCloneableVector<T> for &'a mut [T] {
23852389
}
23862390
}
23872391

2392+
/// Methods for mutable vectors with orderable elements, such as
2393+
/// in-place sorting.
2394+
pub trait MutableOrdVector<T> {
2395+
/// Sort the vector, in place.
2396+
///
2397+
/// This is equivalent to `self.sort_by(std::vec::SortForward)`.
2398+
///
2399+
/// # Example
2400+
///
2401+
/// ```rust
2402+
/// use std::vec;
2403+
///
2404+
/// let mut v = [-5, 4, 1, -3, 2];
2405+
///
2406+
/// v.sort();
2407+
/// assert_eq!(v, [-5, -3, 1, 2, 4]);
2408+
/// ```
2409+
fn sort(self);
2410+
}
2411+
impl<'a, T: Ord> MutableOrdVector<T> for &'a mut [T] {
2412+
#[inline]
2413+
fn sort(self) {
2414+
self.sort_by(SortForward)
2415+
}
2416+
}
2417+
23882418
/**
23892419
* Constructs a vector from an unsafe pointer to a buffer
23902420
*
@@ -3474,16 +3504,39 @@ mod tests {
34743504
let mut v = task_rng().gen_vec::<uint>(len);
34753505
v.sort(|a,b| a <= b);
34763506
3507+
<<<<<<< HEAD
34773508
assert!(v.windows(2).all(|w| w[0] <= w[1]));
3509+
=======
3510+
let mut v1 = v.clone();
3511+
let mut v2 = v.clone();
3512+
v.sort();
3513+
assert!(v.windows(2).all(|w| w[0] <= w[1]));
3514+
3515+
v1.sort_by(vec::SortForward);
3516+
assert!(v1.windows(2).all(|w| w[0] <= w[1]));
3517+
3518+
v1.sort_by(vec::SortReverse);
3519+
assert!(v1.windows(2).all(|w| w[0] >= w[1]));
3520+
3521+
v2.sort_by(|a: &uint, b: &uint| a <= b);
3522+
assert!(v2.windows(2).all(|w| w[0] <= w[1]));
3523+
>>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
34783524
}
34793525
}
34803526
34813527
// shouldn't fail/crash
34823528
let mut v: [uint, .. 0] = [];
3529+
<<<<<<< HEAD
34833530
v.sort(|a,b| a <= b);
34843531
34853532
let mut v = [0xDEADBEEF];
34863533
v.sort(|a,b| a <= b);
3534+
=======
3535+
v.sort_by(SortForward);
3536+
3537+
let mut v = [0xDEADBEEF];
3538+
v.sort_by(SortForward);
3539+
>>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
34873540
assert_eq!(v, [0xDEADBEEF]);
34883541
}
34893542
@@ -3506,7 +3559,11 @@ mod tests {
35063559
35073560
// only sort on the first element, so an unstable sort
35083561
// may mix up the counts.
3562+
<<<<<<< HEAD
35093563
v.sort(|&(a,_), &(b,_)| a <= b);
3564+
=======
3565+
v.sort_by(|&(a,_): &(uint, uint), &(b,_): &(uint, uint)| a <= b);
3566+
>>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
35103567
35113568
// this comparison includes the count (the second item
35123569
// of the tuple), so elements with equal first items
@@ -4341,7 +4398,7 @@ mod bench {
43414398
use extra::test::BenchHarness;
43424399
use iter::range;
43434400
use vec;
4344-
use vec::VectorVector;
4401+
use vec::{VectorVector, MutableOrdVector};
43454402
use option::*;
43464403
use ptr;
43474404
use rand::{weak_rng, task_rng, Rng};
@@ -4551,7 +4608,7 @@ mod bench {
45514608
let mut rng = weak_rng();
45524609
bh.iter(|| {
45534610
let mut v: ~[f64] = rng.gen_vec(5);
4554-
v.sort(|a,b| *a <= *b);
4611+
v.sort();
45554612
});
45564613
bh.bytes = 5 * mem::size_of::<f64>() as u64;
45574614
}
@@ -4561,7 +4618,7 @@ mod bench {
45614618
let mut rng = weak_rng();
45624619
bh.iter(|| {
45634620
let mut v: ~[f64] = rng.gen_vec(100);
4564-
v.sort(|a,b| *a <= *b);
4621+
v.sort();
45654622
});
45664623
bh.bytes = 100 * mem::size_of::<f64>() as u64;
45674624
}
@@ -4571,7 +4628,7 @@ mod bench {
45714628
let mut rng = weak_rng();
45724629
bh.iter(|| {
45734630
let mut v: ~[f64] = rng.gen_vec(10000);
4574-
v.sort(|a,b| *a <= *b);
4631+
v.sort();
45754632
});
45764633
bh.bytes = 10000 * mem::size_of::<f64>() as u64;
45774634
}
@@ -4580,7 +4637,7 @@ mod bench {
45804637
fn sort_sorted(bh: &mut BenchHarness) {
45814638
let mut v = vec::from_fn(10000, |i| i);
45824639
bh.iter(|| {
4583-
v.sort(|a,b| *a <= *b);
4640+
v.sort();
45844641
});
45854642
bh.bytes = (v.len() * mem::size_of_val(&v[0])) as u64;
45864643
}

src/libsyntax/attr.rs

+4
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,11 @@ pub fn sort_meta_items(items: &[@MetaItem]) -> ~[@MetaItem] {
203203
.map(|&mi| (mi.name(), mi))
204204
.collect::<~[(@str, @MetaItem)]>();
205205

206+
<<<<<<< HEAD
206207
v.sort(|&(a, _), &(b, _)| a <= b);
208+
=======
209+
v.sort_by(|&(a, _): &(@str, @MetaItem), &(b, _): &(@str, @MetaItem)| a <= b);
210+
>>>>>>> 9ceda35... std::vec: add a sugary .sort() method for plain Ord sorting.
207211

208212
// There doesn't seem to be a more optimal way to do this
209213
v.move_iter().map(|(_, m)| {

src/test/bench/shootout-k-nucleotide-pipes.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ fn sort_and_fmt(mm: &HashMap<~[u8], uint>, total: uint) -> ~str {
5454

5555
// sort by key, then by value
5656
fn sortKV<TT:Clone + Ord, UU:Clone + Ord>(mut orig: ~[(TT,UU)]) -> ~[(TT,UU)] {
57-
orig.sort(le_by_key);
58-
orig.sort(le_by_val);
57+
orig.sort_by(le_by_key);
58+
orig.sort_by(le_by_val);
5959
origin
6060
}
6161

src/test/bench/shootout-k-nucleotide.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ fn print_frequencies(frequencies: &Table, frame: i32) {
266266
for frequencies.each |entry| {
267267
vector.push((entry.code, entry.count));
268268
}
269-
vector.sort(|a,b| a <= b);
269+
vector.sort();
270270

271271
let mut total_count = 0;
272272
for vector.each |&(_, count)| {

src/test/run-pass/vector-sort-failure-safe.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub fn main() {
4848
// work out the total number of comparisons required to sort
4949
// this array...
5050
let mut count = 0;
51-
main.clone().sort(|a, b| { count += 1; a <= b });
51+
main.clone().sort_by(|a, b| { count += 1; a <= b });
5252

5353
// ... and then fail on each and every single one.
5454
for fail_countdown in range(0, count) {
@@ -63,7 +63,7 @@ pub fn main() {
6363
std::task::try(proc() {
6464
let mut v = v;
6565
let mut fail_countdown = fail_countdown;
66-
v.sort(|a, b| {
66+
v.sort_by(|a, b| {
6767
if fail_countdown == 0 {
6868
fail!()
6969
}

0 commit comments

Comments
 (0)