stdlib: Introduce ord and eq interfaces. Make std::sort::quick_sort3 use them. i=#2348

This commit is contained in:
Patrick Walton 2012-06-05 17:26:52 -07:00
parent 49c6dac47a
commit d9cdddeb5f
5 changed files with 44 additions and 9 deletions

10
src/libcore/cmp.rs Normal file
View File

@ -0,0 +1,10 @@
#[doc="Interfaces used for comparison."]
iface ord {
fn lt(&&other: self) -> bool;
}
iface eq {
fn eq(&&other: self) -> bool;
}

View File

@ -44,6 +44,7 @@ export extfmt;
export tuple;
export to_str;
export dvec, dvec_iter;
export cmp;
// NDM seems to be necessary for resolve to work
export option_iter;
@ -152,6 +153,7 @@ mod tuple;
// Ubiquitous-utility-type modules
mod cmp;
mod either;
mod iter;
mod logging;

View File

@ -1,4 +1,5 @@
import T = inst::T;
import cmp::{eq, ord};
export min_value, max_value;
export min, max;
@ -10,6 +11,7 @@ export range;
export compl;
export abs;
export parse_buf, from_str, to_str, to_str_bytes, str;
export ord, eq;
const min_value: T = -1 as T << (inst::bits - 1 as T);
const max_value: T = min_value - 1 as T;
@ -108,6 +110,18 @@ fn to_str_bytes<U>(n: T, radix: uint, f: fn([u8]/&) -> U) -> U {
#[doc = "Convert to a string"]
fn str(i: T) -> str { ret to_str(i, 10u); }
impl ord of ord for T {
fn lt(&&other: T) -> bool {
ret self < other;
}
}
impl eq of eq for T {
fn eq(&&other: T) -> bool {
ret self == other;
}
}
// FIXME: Has alignment issues on windows and 32-bit linux
#[test]

View File

@ -1,4 +1,5 @@
import T = inst::T;
import cmp::{eq, ord};
export min_value, max_value;
export min, max;
@ -10,6 +11,7 @@ export range;
export compl;
export to_str, to_str_bytes;
export from_str, from_str_radix, str, parse_buf;
export ord, eq;
const min_value: T = 0 as T;
const max_value: T = 0 as T - 1 as T;
@ -49,6 +51,18 @@ pure fn compl(i: T) -> T {
max_value ^ i
}
impl ord of ord for T {
fn lt(&&other: T) -> bool {
ret self < other;
}
}
impl eq of eq for T {
fn eq(&&other: T) -> bool {
ret self == other;
}
}
#[doc = "
Parse a buffer of bytes

View File

@ -1,5 +1,6 @@
#[doc = "Sorting methods"];
import vec::len;
import int::{eq, ord};
export le;
export merge_sort;
@ -141,7 +142,6 @@ fn qsort3<T: copy>(compare_func_lt: le<T>, compare_func_eq: le<T>,
qsort3::<T>(compare_func_lt, compare_func_eq, arr, i, right);
}
// FIXME: This should take lt and eq types (#2348)
#[doc = "
Fancy quicksort. Sorts a mut vector in place.
@ -152,10 +152,9 @@ According to these slides this is the algorithm of choice for
This is an unstable sort.
"]
fn quick_sort3<T: copy>(compare_func_lt: le<T>, compare_func_eq: le<T>,
arr: [mut T]) {
fn quick_sort3<T: copy ord eq>(arr: [mut T]) {
if len::<T>(arr) == 0u { ret; }
qsort3::<T>(compare_func_lt, compare_func_eq, arr, 0,
qsort3::<T>({ |x, y| x.lt(y) }, { |x, y| x.eq(y) }, arr, 0,
(len::<T>(arr) as int) - 1);
}
@ -163,11 +162,7 @@ fn quick_sort3<T: copy>(compare_func_lt: le<T>, compare_func_eq: le<T>,
mod test_qsort3 {
fn check_sort(v1: [mut int], v2: [mut int]) {
let len = vec::len::<int>(v1);
fn lt(&&a: int, &&b: int) -> bool { ret a < b; }
fn equal(&&a: int, &&b: int) -> bool { ret a == b; }
let f1 = lt;
let f2 = equal;
quick_sort3::<int>(f1, f2, v1);
quick_sort3::<int>(v1);
let mut i = 0u;
while i < len {
log(debug, v2[i]);