Skip to content

Instantly share code, notes, and snippets.

@mitsuhiko
Created September 15, 2017 10:04
Show Gist options
  • Save mitsuhiko/cde06234006c8610f6196bf264b42d35 to your computer and use it in GitHub Desktop.
Save mitsuhiko/cde06234006c8610f6196bf264b42d35 to your computer and use it in GitHub Desktop.
pub struct DedupMap<K, V> {
map: HashMap<K, V>,
}
impl<K, V> DedupMap<K, V>
where K: Eq + Hash,
V: From<usize> + ToOwned<Owned=V> + Clone,
{
pub fn new() -> DedupMap<K, V> {
DedupMap {
map: HashMap::new(),
}
}
pub fn get_id<L>(&mut self, k: L) -> V
where L: Hash + Eq + AsRef<K> + ToOwned<Owned=K>,
K: Borrow<L>,
{
let key = k.as_ref();
if let Some(idx) = self.map.get(key.borrow()) {
return idx.to_owned();
}
let idx = V::from(self.map.len());
self.map.insert(k.to_owned(), idx.clone());
idx
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment