From d9cdddeb5f80b11763b6f95fd7eecdef705ed12d Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 5 Jun 2012 17:26:52 -0700 Subject: [PATCH] stdlib: Introduce ord and eq interfaces. Make std::sort::quick_sort3 use them. i=#2348 --- src/libcore/cmp.rs | 10 ++++++++++ src/libcore/core.rc | 2 ++ src/libcore/int-template.rs | 14 ++++++++++++++ src/libcore/uint-template.rs | 14 ++++++++++++++ src/libstd/sort.rs | 13 ++++--------- 5 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 src/libcore/cmp.rs diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs new file mode 100644 index 000000000000..aea97cf1649f --- /dev/null +++ b/src/libcore/cmp.rs @@ -0,0 +1,10 @@ +#[doc="Interfaces used for comparison."] + +iface ord { + fn lt(&&other: self) -> bool; +} + +iface eq { + fn eq(&&other: self) -> bool; +} + diff --git a/src/libcore/core.rc b/src/libcore/core.rc index 6b4c7ad7d3ca..efcd424024a1 100644 --- a/src/libcore/core.rc +++ b/src/libcore/core.rc @@ -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; diff --git a/src/libcore/int-template.rs b/src/libcore/int-template.rs index 156724cb0617..4011ac1a18a7 100644 --- a/src/libcore/int-template.rs +++ b/src/libcore/int-template.rs @@ -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(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] diff --git a/src/libcore/uint-template.rs b/src/libcore/uint-template.rs index a63d01e6e8e0..7126fb3d007d 100644 --- a/src/libcore/uint-template.rs +++ b/src/libcore/uint-template.rs @@ -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 diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs index 7e16578fd9c8..76c71d7ed2aa 100644 --- a/src/libstd/sort.rs +++ b/src/libstd/sort.rs @@ -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(compare_func_lt: le, compare_func_eq: le, qsort3::(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(compare_func_lt: le, compare_func_eq: le, - arr: [mut T]) { +fn quick_sort3(arr: [mut T]) { if len::(arr) == 0u { ret; } - qsort3::(compare_func_lt, compare_func_eq, arr, 0, + qsort3::({ |x, y| x.lt(y) }, { |x, y| x.eq(y) }, arr, 0, (len::(arr) as int) - 1); } @@ -163,11 +162,7 @@ fn quick_sort3(compare_func_lt: le, compare_func_eq: le, mod test_qsort3 { fn check_sort(v1: [mut int], v2: [mut int]) { let len = vec::len::(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::(f1, f2, v1); + quick_sort3::(v1); let mut i = 0u; while i < len { log(debug, v2[i]);