bijection.rs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //! This module contains the [Bijection] type.
  2. use super::HashMapWithDefault;
  3. use log::error;
  4. use std::{borrow::Borrow, hash::Hash};
  5. pub struct Bijection<K, V> {
  6. k2v: HashMapWithDefault<K, V>,
  7. v2k: HashMapWithDefault<V, K>,
  8. }
  9. impl<K, V> Bijection<K, V> {
  10. pub fn new(default_key: K, default_value: V) -> Self {
  11. let k2v = HashMapWithDefault::new(default_value);
  12. let v2k = HashMapWithDefault::new(default_key);
  13. Self { k2v, v2k }
  14. }
  15. pub fn k2v(&self) -> &HashMapWithDefault<K, V> {
  16. &self.k2v
  17. }
  18. pub fn v2k(&self) -> &HashMapWithDefault<V, K> {
  19. &self.v2k
  20. }
  21. }
  22. impl<K: Clone + Hash + Eq, V: Clone + Hash + Eq> Bijection<K, V> {
  23. pub fn insert(&mut self, key: K, value: V) -> Option<(K, V)> {
  24. let key_clone = key.clone();
  25. let value_clone = value.clone();
  26. let old_value = self.k2v.get_mut().insert(key, value);
  27. let old_key = self.v2k.get_mut().insert(value_clone, key_clone);
  28. match (old_key, old_value) {
  29. (Some(old_key), Some(old_value)) => Some((old_key, old_value)),
  30. (None, None) => None,
  31. _ => {
  32. error!("logic error: unmatched key-value pair encountered in bijection insert");
  33. None
  34. }
  35. }
  36. }
  37. }
  38. impl<K: Hash + Eq, V> Bijection<K, V> {
  39. pub fn value<Q: ?Sized + Hash + Eq>(&self, key: &Q) -> &V
  40. where
  41. K: Borrow<Q>,
  42. {
  43. self.k2v.get(key)
  44. }
  45. }
  46. impl<K, V: Hash + Eq> Bijection<K, V> {
  47. pub fn key<R: ?Sized + Hash + Eq>(&self, value: &R) -> &K
  48. where
  49. V: Borrow<R>,
  50. {
  51. self.v2k.get(value)
  52. }
  53. }