Fix fallout of DSTifying PartialEq, PartialOrd, Eq, Ord

This commit is contained in:
Jorge Aparicio 2014-10-29 20:21:37 -05:00
parent 2896278313
commit 1e5f311d16
9 changed files with 172 additions and 0 deletions

View file

@ -532,10 +532,17 @@ impl<'a> PartialOrd for MaybeOwned<'a> {
}
impl<'a> Ord for MaybeOwned<'a> {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
#[inline]
fn cmp(&self, other: &MaybeOwned) -> Ordering {
self.as_slice().cmp(&other.as_slice())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
#[inline]
fn cmp(&self, other: &MaybeOwned) -> Ordering {
self.as_slice().cmp(other.as_slice())
}
}
impl<'a, S: Str> Equiv<S> for MaybeOwned<'a> {

View file

@ -506,10 +506,17 @@ impl<T: PartialEq> PartialEq for Vec<T> {
#[unstable = "waiting on PartialOrd stability"]
impl<T: PartialOrd> PartialOrd for Vec<T> {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
#[inline]
fn partial_cmp(&self, other: &Vec<T>) -> Option<Ordering> {
self.as_slice().partial_cmp(&other.as_slice())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
#[inline]
fn partial_cmp(&self, other: &Vec<T>) -> Option<Ordering> {
self.as_slice().partial_cmp(other.as_slice())
}
}
#[unstable = "waiting on Eq stability"]
@ -523,10 +530,17 @@ impl<T: PartialEq, V: AsSlice<T>> Equiv<V> for Vec<T> {
#[unstable = "waiting on Ord stability"]
impl<T: Ord> Ord for Vec<T> {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
#[inline]
fn cmp(&self, other: &Vec<T>) -> Ordering {
self.as_slice().cmp(&other.as_slice())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
#[inline]
fn cmp(&self, other: &Vec<T>) -> Ordering {
self.as_slice().cmp(other.as_slice())
}
}
// FIXME: #13996: need a way to mark the return value as `noalias`

View file

@ -76,15 +76,27 @@ impl<'a, T: PartialEq> PartialEq for MaybeOwnedVector<'a, T> {
impl<'a, T: Eq> Eq for MaybeOwnedVector<'a, T> {}
impl<'a, T: PartialOrd> PartialOrd for MaybeOwnedVector<'a, T> {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
fn partial_cmp(&self, other: &MaybeOwnedVector<T>) -> Option<Ordering> {
self.as_slice().partial_cmp(&other.as_slice())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
fn partial_cmp(&self, other: &MaybeOwnedVector<T>) -> Option<Ordering> {
self.as_slice().partial_cmp(other.as_slice())
}
}
impl<'a, T: Ord> Ord for MaybeOwnedVector<'a, T> {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
fn cmp(&self, other: &MaybeOwnedVector<T>) -> Ordering {
self.as_slice().cmp(&other.as_slice())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
fn cmp(&self, other: &MaybeOwnedVector<T>) -> Ordering {
self.as_slice().cmp(other.as_slice())
}
}
impl<'a, T: PartialEq, V: AsSlice<T>> Equiv<V> for MaybeOwnedVector<'a, T> {

View file

@ -1020,6 +1020,8 @@ fn is_valid_cap(c: char) -> bool {
|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
}
// NOTE(stage0): remove function after a snapshot
#[cfg(stage0)]
fn find_class(classes: NamedClasses, name: &str) -> Option<Vec<(char, char)>> {
match classes.binary_search(|&(s, _)| s.cmp(&name)) {
slice::Found(i) => Some(classes[i].val1().to_vec()),
@ -1027,6 +1029,14 @@ fn find_class(classes: NamedClasses, name: &str) -> Option<Vec<(char, char)>> {
}
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
fn find_class(classes: NamedClasses, name: &str) -> Option<Vec<(char, char)>> {
match classes.binary_search(|&(s, _)| s.cmp(name)) {
slice::Found(i) => Some(classes[i].val1().to_vec()),
slice::NotFound(_) => None,
}
}
type Class = &'static [(char, char)];
type NamedClasses = &'static [(&'static str, &'static Class)];

View file

@ -182,6 +182,8 @@ Available lint options:
");
// NOTE(stage0): remove function after a snapshot
#[cfg(stage0)]
fn sort_lints(lints: Vec<(&'static Lint, bool)>) -> Vec<&'static Lint> {
let mut lints: Vec<_> = lints.into_iter().map(|(x, _)| x).collect();
lints.sort_by(|x: &&Lint, y: &&Lint| {
@ -194,6 +196,21 @@ Available lint options:
lints
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
fn sort_lints(lints: Vec<(&'static Lint, bool)>) -> Vec<&'static Lint> {
let mut lints: Vec<_> = lints.into_iter().map(|(x, _)| x).collect();
lints.sort_by(|x: &&Lint, y: &&Lint| {
match x.default_level.cmp(&y.default_level) {
// The sort doesn't case-fold but it's doubtful we care.
Equal => x.name.cmp(y.name),
r => r,
}
});
lints
}
// NOTE(stage0): remove function after a snapshot
#[cfg(stage0)]
fn sort_lint_groups(lints: Vec<(&'static str, Vec<lint::LintId>, bool)>)
-> Vec<(&'static str, Vec<lint::LintId>)> {
let mut lints: Vec<_> = lints.into_iter().map(|(x, y, _)| (x, y)).collect();
@ -204,6 +221,17 @@ Available lint options:
lints
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
fn sort_lint_groups(lints: Vec<(&'static str, Vec<lint::LintId>, bool)>)
-> Vec<(&'static str, Vec<lint::LintId>)> {
let mut lints: Vec<_> = lints.into_iter().map(|(x, y, _)| (x, y)).collect();
lints.sort_by(|&(x, _): &(&'static str, Vec<lint::LintId>),
&(y, _): &(&'static str, Vec<lint::LintId>)| {
x.cmp(y)
});
lints
}
let (plugin, builtin) = lint_store.get_lints().partitioned(|&(_, p)| p);
let plugin = sort_lints(plugin);
let builtin = sort_lints(builtin);

View file

@ -121,10 +121,17 @@ impl PartialEq for CString {
}
impl PartialOrd for CString {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
#[inline]
fn partial_cmp(&self, other: &CString) -> Option<Ordering> {
self.as_bytes().partial_cmp(&other.as_bytes())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
#[inline]
fn partial_cmp(&self, other: &CString) -> Option<Ordering> {
self.as_bytes().partial_cmp(other.as_bytes())
}
}
impl Eq for CString {}

View file

@ -890,6 +890,8 @@ impl Json {
/// If the Json value is an Object, returns the value associated with the provided key.
/// Otherwise, returns None.
// NOTE(stage0): remove function after a snapshot
#[cfg(stage0)]
pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
match self {
&Object(ref map) => map.find_with(|s| key.cmp(&s.as_slice())),
@ -897,6 +899,16 @@ impl Json {
}
}
/// If the Json value is an Object, returns the value associated with the provided key.
/// Otherwise, returns None.
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
match self {
&Object(ref map) => map.find_with(|s| key.cmp(s.as_slice())),
_ => None
}
}
/// Attempts to get a nested Json Object for each key in `keys`.
/// If any key is found not to exist, find_path will return None.
/// Otherwise, it will return the Json value associated with the final key.
@ -914,6 +926,8 @@ impl Json {
/// If the Json value is an Object, performs a depth-first search until
/// a value associated with the provided key is found. If no value is found
/// or the Json value is not an Object, returns None.
// NOTE(stage0): remove function after a snapshot
#[cfg(stage0)]
pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
match self {
&Object(ref map) => {
@ -934,6 +948,30 @@ impl Json {
}
}
/// If the Json value is an Object, performs a depth-first search until
/// a value associated with the provided key is found. If no value is found
/// or the Json value is not an Object, returns None.
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
match self {
&Object(ref map) => {
match map.find_with(|s| key.cmp(s.as_slice())) {
Some(json_value) => Some(json_value),
None => {
for (_, v) in map.iter() {
match v.search(key) {
x if x.is_some() => return x,
_ => ()
}
}
None
}
}
},
_ => None
}
}
/// Returns true if the Json value is an Object. Returns false otherwise.
pub fn is_object<'a>(&'a self) -> bool {
self.as_object().is_some()

View file

@ -97,9 +97,15 @@ pub struct RcStr {
impl Eq for RcStr {}
impl Ord for RcStr {
// NOTE(stage0): remove method after a snapshot
#[cfg(stage0)]
fn cmp(&self, other: &RcStr) -> Ordering {
self.as_slice().cmp(&other.as_slice())
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
fn cmp(&self, other: &RcStr) -> Ordering {
self.as_slice().cmp(other.as_slice())
}
}
impl Str for RcStr {

View file

@ -973,6 +973,8 @@ fn get_concurrency() -> uint {
}
}
// NOTE(stage0): remove function after a snapshot
#[cfg(stage0)]
pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescAndFn> {
let mut filtered = tests;
@ -1020,6 +1022,54 @@ pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescA
}
}
#[cfg(not(stage0))] // NOTE(stage0): remove cfg after a snapshot
pub fn filter_tests(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> Vec<TestDescAndFn> {
let mut filtered = tests;
// Remove tests that don't match the test filter
filtered = match opts.filter {
None => filtered,
Some(ref re) => {
filtered.into_iter()
.filter(|test| re.is_match(test.desc.name.as_slice())).collect()
}
};
// Maybe pull out the ignored test and unignore them
filtered = if !opts.run_ignored {
filtered
} else {
fn filter(test: TestDescAndFn) -> Option<TestDescAndFn> {
if test.desc.ignore {
let TestDescAndFn {desc, testfn} = test;
Some(TestDescAndFn {
desc: TestDesc {ignore: false, ..desc},
testfn: testfn
})
} else {
None
}
};
filtered.into_iter().filter_map(|x| filter(x)).collect()
};
// Sort the tests alphabetically
filtered.sort_by(|t1, t2| t1.desc.name.as_slice().cmp(t2.desc.name.as_slice()));
// Shard the remaining tests, if sharding requested.
match opts.test_shard {
None => filtered,
Some((a,b)) => {
filtered.into_iter().enumerate()
// note: using a - 1 so that the valid shards, for example, are
// 1.2 and 2.2 instead of 0.2 and 1.2
.filter(|&(i,_)| i % b == (a - 1))
.map(|(_,t)| t)
.collect()
}
}
}
pub fn run_test(opts: &TestOpts,
force_ignore: bool,
test: TestDescAndFn,