diff --git a/src/lib.rs b/src/lib.rs index 0c02b5e..885ff85 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -74,6 +74,7 @@ use self::unicode::Unicode; mod ascii; mod unicode; +pub 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"))); +} 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() { } } } + + +