Name Description Size
lib.rs [`Equivalent`] and [`Comparable`] are traits for key comparison in maps. These may be used in the implementation of maps where the lookup type `Q` may be different than the stored key type `K`. * `Q: Equivalent<K>` checks for equality, similar to the `HashMap<K, V>` constraint `K: Borrow<Q>, Q: Eq`. * `Q: Comparable<K>` checks the ordering, similar to the `BTreeMap<K, V>` constraint `K: Borrow<Q>, Q: Ord`. These traits are not used by the maps in the standard library, but they may add more flexibility in third-party map implementations, especially in situations where a strict `K: Borrow<Q>` relationship is not available. # Examples ``` use equivalent::*; use std::cmp::Ordering; pub struct Pair<A, B>(pub A, pub B); impl<'a, A: ?Sized, B: ?Sized, C, D> Equivalent<(C, D)> for Pair<&'a A, &'a B> where A: Equivalent<C>, B: Equivalent<D>, { fn equivalent(&self, key: &(C, D)) -> bool { self.0.equivalent(&key.0) && self.1.equivalent(&key.1) } } impl<'a, A: ?Sized, B: ?Sized, C, D> Comparable<(C, D)> for Pair<&'a A, &'a B> where A: Comparable<C>, B: Comparable<D>, { fn compare(&self, key: &(C, D)) -> Ordering { match self.0.compare(&key.0) { Ordering::Equal => self.1.compare(&key.1), not_equal => not_equal, } } } fn main() { let key = (String::from("foo"), String::from("bar")); let q1 = Pair("foo", "bar"); let q2 = Pair("boo", "bar"); let q3 = Pair("foo", "baz"); assert!(q1.equivalent(&key)); assert!(!q2.equivalent(&key)); assert!(!q3.equivalent(&key)); assert_eq!(q1.compare(&key), Ordering::Equal); assert_eq!(q2.compare(&key), Ordering::Less); assert_eq!(q3.compare(&key), Ordering::Greater); } ``` 3404