From a8b082c42357d3be98d375b92e673a11e2621237 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 12 May 2021 22:45:26 +0100 Subject: [PATCH 1/3] Disable miri test for lookup_consistency This is really very slow under emulation. Signed-off-by: Ian Jackson --- src/unicode/map.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/unicode/map.rs b/src/unicode/map.rs index e43e0b7..01d93ec 100644 --- a/src/unicode/map.rs +++ b/src/unicode/map.rs @@ -488,6 +488,7 @@ pub fn lookup(orig: char) -> Fold { } #[test] +#[cfg(not(miri))] fn lookup_consistency() { fn lookup_naive(orig: char) -> Fold { let single_char = match orig as u32 { @@ -1993,3 +1994,6 @@ fn lookup_consistency() { } } } + + + From cd5b2d03e37c51e79dfa8f8dfeab19413bbdb6c6 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 12 May 2021 22:22:15 +0100 Subject: [PATCH 2/3] Experimental sketch of a UniCaseNoOpt which allows Borrow This seems to work. At least it passes the one test I wrote. --- src/lib.rs | 1 + src/noopt.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/noopt.rs diff --git a/src/lib.rs b/src/lib.rs index 0c02b5e..e7a57e9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -74,6 +74,7 @@ use self::unicode::Unicode; mod ascii; mod unicode; +mod noopt; /// Case Insensitive wrapper of strings. #[derive(Clone, Copy)] diff --git a/src/noopt.rs b/src/noopt.rs new file mode 100644 index 0000000..6c34517 --- /dev/null +++ b/src/noopt.rs @@ -0,0 +1,54 @@ +use core::hash::Hash; +use core::borrow::Borrow; +use crate::*; + +#[derive(Clone, Copy, Debug)] +#[repr(transparent)] +/// Unicode case-insensitive wrapper without optimisation +pub struct UniCaseNoOpt(S); + +impl UniCaseNoOpt { + pub fn new(s: S) -> Self { UniCaseNoOpt(s) } +} +impl UniCaseNoOpt { + pub fn from_ref<'s>(s: &'s S) -> &'s UniCaseNoOpt { + let x: &'s S = s; + let y: &'s UniCaseNoOpt = unsafe { core::mem::transmute(x) }; + y + } +} +impl From for UniCaseNoOpt { + fn from(s: S) -> UniCaseNoOpt { UniCaseNoOpt(s) } +} + +impl PartialEq for UniCaseNoOpt +{ + fn eq(&self, other: &Self) -> bool { + Unicode(&self.0) == + Unicode(&other.0) + } +} +impl Eq for UniCaseNoOpt { } + +impl Hash for UniCaseNoOpt +where S: AsRef, for <'u> UniCase<&'u S>: Hash +{ + fn hash(&self, hasher: &mut H) { + Unicode(&self.0).hash(hasher) + } +} + +impl> Borrow> for UniCase { + fn borrow(&self) -> &UniCaseNoOpt { + UniCaseNoOpt::from_ref(self.as_ref()) + } +} + +#[test] +fn hashset() { + use std::collections::HashSet; + + let mut hm: HashSet> = Default::default(); + hm.insert(UniCase::new("ascii".to_string())); + assert!(hm.contains(UniCaseNoOpt::from_ref("Ascii"))); +} From 26ebad5fa52146dca360a54d368340e266f3b4cf Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 12 May 2021 23:09:38 +0100 Subject: [PATCH 3/3] Make this noopt module available for more thorough testing. Signed-off-by: Ian Jackson --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index e7a57e9..885ff85 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -74,7 +74,7 @@ use self::unicode::Unicode; mod ascii; mod unicode; -mod noopt; +pub mod noopt; /// Case Insensitive wrapper of strings. #[derive(Clone, Copy)]