Skip to content

Commit ca064c8

Browse files
Generic container: new Map private trait
Note: `BTreeMap::remove<Q>` and `BTreeMap::remove<Q>` both accept a more general `Q` rather than just `Self::Key`. If ever needed, `Map<Q>` would be possible (with the same bound on `Q` than `Self::Key`: `Ord` or `Eq + Hash`).
1 parent 6a69bd9 commit ca064c8

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/generic_containers.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//! **Private** generalizations of containers:
2+
//! - `Map`: `BTreeMap` and `HashMap` (any hasher).
3+
4+
#![cfg(feature = "use_alloc")]
5+
6+
use alloc::collections::BTreeMap;
7+
#[cfg(feature = "use_std")]
8+
use core::hash::{BuildHasher, Hash};
9+
#[cfg(feature = "use_std")]
10+
use std::collections::HashMap;
11+
12+
pub trait Map {
13+
type Key;
14+
type Value;
15+
fn insert(&mut self, key: Self::Key, value: Self::Value) -> Option<Self::Value>;
16+
fn remove(&mut self, key: &Self::Key) -> Option<Self::Value>;
17+
fn entry_or_default(&mut self, key: Self::Key) -> &mut Self::Value
18+
where
19+
Self::Value: Default;
20+
}
21+
22+
impl<K, V> Map for BTreeMap<K, V>
23+
where
24+
K: Ord,
25+
{
26+
type Key = K;
27+
type Value = V;
28+
fn insert(&mut self, key: K, value: V) -> Option<V> {
29+
self.insert(key, value)
30+
}
31+
fn remove(&mut self, key: &K) -> Option<V> {
32+
self.remove(key)
33+
}
34+
fn entry_or_default(&mut self, key: K) -> &mut V
35+
where
36+
V: Default,
37+
{
38+
self.entry(key).or_default()
39+
}
40+
}
41+
42+
#[cfg(feature = "use_std")]
43+
impl<K, V, S> Map for HashMap<K, V, S>
44+
where
45+
K: Eq + Hash,
46+
S: BuildHasher,
47+
{
48+
type Key = K;
49+
type Value = V;
50+
fn insert(&mut self, key: K, value: V) -> Option<V> {
51+
self.insert(key, value)
52+
}
53+
fn remove(&mut self, key: &K) -> Option<V> {
54+
self.remove(key)
55+
}
56+
fn entry_or_default(&mut self, key: K) -> &mut V
57+
where
58+
V: Default,
59+
{
60+
self.entry(key).or_default()
61+
}
62+
}

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ mod extrema_set;
186186
mod flatten_ok;
187187
mod format;
188188
#[cfg(feature = "use_alloc")]
189+
mod generic_containers;
190+
#[cfg(feature = "use_alloc")]
189191
mod group_map;
190192
#[cfg(feature = "use_alloc")]
191193
mod groupbylazy;

0 commit comments

Comments
 (0)