1#[cfg(feature = "halfbrown")]
2use halfbrown::HashMap as Halfbrown;
3#[cfg(feature = "hashbrown")]
4use hashbrown::HashMap as Hashbrown;
5#[cfg(feature = "indexmap")]
6use indexmap::IndexMap;
7use std::collections::HashMap;
8use std::hash::Hash;
9use std::{borrow::Borrow, hash::BuildHasher};
10
11pub trait Object {
13 type Key: ?Sized;
15 type Element;
17
18 #[must_use]
22 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
23 where
24 Self::Key: Borrow<Q>,
25 Q: ?Sized + Hash + Eq + Ord;
26
27 #[must_use]
29 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_>;
30
31 #[must_use]
33 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_>;
34
35 #[must_use]
37 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_>;
38
39 #[must_use]
41 fn len(&self) -> usize;
42
43 #[must_use]
45 fn is_empty(&self) -> bool {
46 self.len() == 0
47 }
48}
49
50pub trait ObjectMut {
52 type Key: ?Sized;
54 type Element;
56
57 #[must_use]
59 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
60 where
61 Self::Key: Borrow<Q>,
62 Q: ?Sized + Hash + Eq + Ord;
63
64 #[must_use]
66 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
67 where
68 Self::Key: From<K> + Hash + Eq,
69 V: Into<Self::Element>;
70
71 #[must_use]
73 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
74 where
75 Self::Key: Borrow<Q>,
76 Q: ?Sized + Hash + Eq + Ord;
77}
78
79#[cfg(feature = "halfbrown")]
80impl<MapK, MapE, S> Object for Halfbrown<MapK, MapE, S>
81where
82 MapK: Hash + Eq,
83 S: BuildHasher + Default,
84{
85 type Key = MapK;
86 type Element = MapE;
87
88 #[inline]
89 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
90 where
91 Self::Key: Borrow<Q>,
92 Q: ?Sized + Hash + Eq + Ord,
93 {
94 Halfbrown::get(self, k)
95 }
96
97 #[inline]
98 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
99 Box::new(Halfbrown::iter(self))
100 }
101
102 #[inline]
103 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
104 Box::new(Halfbrown::keys(self))
105 }
106
107 #[inline]
108 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
109 Box::new(Halfbrown::values(self))
110 }
111
112 #[inline]
113 fn len(&self) -> usize {
114 Halfbrown::len(self)
115 }
116}
117
118#[cfg(feature = "halfbrown")]
119impl<MapK, MapE, S> ObjectMut for Halfbrown<MapK, MapE, S>
120where
121 MapK: Hash + Eq,
122 S: BuildHasher + Default,
123{
124 type Key = MapK;
125 type Element = MapE;
126
127 #[inline]
128 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
129 where
130 Self::Key: Borrow<Q>,
131 Q: ?Sized + Hash + Eq + Ord,
132 {
133 Halfbrown::get_mut(self, k)
134 }
135
136 #[inline]
137 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
138 where
139 K: Into<Self::Key>,
140 V: Into<Self::Element>,
141 Self::Key: Hash + Eq,
142 {
143 Halfbrown::insert(self, k.into(), v.into())
144 }
145
146 #[inline]
147 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
148 where
149 Self::Key: Borrow<Q>,
150 Q: ?Sized + Hash + Eq + Ord,
151 {
152 Halfbrown::remove(self, k)
153 }
154}
155
156#[cfg(feature = "indexmap")]
157impl<MapK, MapE, S: BuildHasher> Object for IndexMap<MapK, MapE, S>
158where
159 MapK: Hash + Eq,
160{
161 type Key = MapK;
162 type Element = MapE;
163
164 #[inline]
165 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
166 where
167 Self::Key: Borrow<Q>,
168 Q: ?Sized + Hash + Eq + Ord,
169 {
170 IndexMap::get(self, k)
171 }
172
173 #[inline]
174 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
175 Box::new(IndexMap::iter(self))
176 }
177
178 #[inline]
179 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
180 Box::new(IndexMap::keys(self))
181 }
182
183 #[inline]
184 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
185 Box::new(IndexMap::values(self))
186 }
187
188 #[inline]
189 fn len(&self) -> usize {
190 IndexMap::len(self)
191 }
192}
193
194#[cfg(feature = "indexmap")]
195impl<MapK, MapE, S: BuildHasher> ObjectMut for IndexMap<MapK, MapE, S>
196where
197 MapK: Hash + Eq,
198{
199 type Key = MapK;
200 type Element = MapE;
201
202 #[inline]
203 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
204 where
205 Self::Key: Borrow<Q>,
206 Q: ?Sized + Hash + Eq + Ord,
207 {
208 IndexMap::get_mut(self, k)
209 }
210
211 #[inline]
212 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
213 where
214 K: Into<Self::Key>,
215 V: Into<Self::Element>,
216 Self::Key: Hash + Eq,
217 {
218 IndexMap::insert(self, k.into(), v.into())
219 }
220
221 #[inline]
222 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
223 where
224 Self::Key: Borrow<Q>,
225 Q: ?Sized + Hash + Eq + Ord,
226 {
227 IndexMap::shift_remove(self, k)
228 }
229}
230
231impl<MapK, MapE, S: BuildHasher> Object for HashMap<MapK, MapE, S>
232where
233 MapK: Hash + Eq,
234{
235 type Key = MapK;
236 type Element = MapE;
237
238 #[inline]
239 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
240 where
241 Self::Key: Borrow<Q>,
242 Q: ?Sized + Hash + Eq + Ord,
243 {
244 HashMap::get(self, k)
245 }
246
247 #[inline]
248 fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
249 Box::new(HashMap::iter(self))
250 }
251
252 #[inline]
253 fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
254 Box::new(HashMap::keys(self))
255 }
256
257 #[inline]
258 fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
259 Box::new(HashMap::values(self))
260 }
261
262 #[inline]
263 fn len(&self) -> usize {
264 HashMap::len(self)
265 }
266}
267
268impl<MapK, MapE, S: BuildHasher> ObjectMut for HashMap<MapK, MapE, S>
269where
270 MapK: Hash + Eq,
271{
272 type Key = MapK;
273 type Element = MapE;
274
275 #[inline]
276 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
277 where
278 Self::Key: Borrow<Q>,
279 Q: ?Sized + Hash + Eq + Ord,
280 {
281 HashMap::get_mut(self, k)
282 }
283
284 #[inline]
285 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
286 where
287 K: Into<Self::Key>,
288 V: Into<Self::Element>,
289 Self::Key: Hash + Eq,
290 {
291 HashMap::insert(self, k.into(), v.into())
292 }
293
294 #[inline]
295 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
296 where
297 Self::Key: Borrow<Q>,
298 Q: ?Sized + Hash + Eq + Ord,
299 {
300 HashMap::remove(self, k)
301 }
302}
303
304#[cfg(feature = "hashbrown")]
305impl<MapK, MapE, S: BuildHasher> Object for Hashbrown<MapK, MapE, S>
306where
307 MapK: Hash + Eq,
308{
309 type Key = MapK;
310 type Element = MapE;
311
312 #[inline]
313 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
314 where
315 Self::Key: Borrow<Q>,
316 Q: ?Sized + Hash + Eq + Ord,
317 {
318 Hashbrown::get(self, k)
319 }
320
321 #[inline]
322 fn iter<'i>(&'i self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + 'i> {
323 Box::new(Hashbrown::iter(self))
324 }
325
326 #[inline]
327 fn keys<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Key> + 'i> {
328 Box::new(Hashbrown::keys(self))
329 }
330
331 #[inline]
332 fn values<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Element> + 'i> {
333 Box::new(Hashbrown::values(self))
334 }
335
336 #[inline]
337 fn len(&self) -> usize {
338 Hashbrown::len(self)
339 }
340}
341#[cfg(feature = "hashbrown")]
342impl<MapK, MapE, S: BuildHasher> ObjectMut for Hashbrown<MapK, MapE, S>
343where
344 MapK: Hash + Eq,
345{
346 type Key = MapK;
347 type Element = MapE;
348
349 #[inline]
350 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
351 where
352 Self::Key: Borrow<Q>,
353 Q: ?Sized + Hash + Eq + Ord,
354 {
355 Hashbrown::get_mut(self, k)
356 }
357
358 #[inline]
359 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
360 where
361 K: Into<Self::Key>,
362 V: Into<Self::Element>,
363 Self::Key: Hash + Eq,
364 {
365 Hashbrown::insert(self, k.into(), v.into())
366 }
367
368 #[inline]
369 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
370 where
371 Self::Key: Borrow<Q>,
372 Q: ?Sized + Hash + Eq + Ord,
373 {
374 Hashbrown::remove(self, k)
375 }
376}
377
378#[cfg(feature = "c-abi")]
379impl<MapK, MapE, S: ::std::hash::BuildHasher> Object
380 for abi_stable::std_types::RHashMap<MapK, MapE, S>
381where
382 MapK: Hash + Eq,
383{
384 type Key = MapK;
385 type Element = MapE;
386
387 #[inline]
388 fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
389 where
390 Self::Key: Borrow<Q>,
391 Q: ?Sized + Hash + Eq + Ord,
392 {
393 abi_stable::std_types::RHashMap::get(self, k)
394 }
395
396 #[inline]
397 fn iter<'i>(&'i self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + 'i> {
398 Box::new(abi_stable::std_types::RHashMap::iter(self).map(Into::into))
399 }
400
401 #[inline]
402 fn keys<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Key> + 'i> {
403 Box::new(abi_stable::std_types::RHashMap::keys(self))
404 }
405
406 #[inline]
407 fn values<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Element> + 'i> {
408 Box::new(abi_stable::std_types::RHashMap::values(self))
409 }
410
411 #[inline]
412 fn len(&self) -> usize {
413 abi_stable::std_types::RHashMap::len(self)
414 }
415}
416
417#[cfg(feature = "c-abi")]
418impl<MapK, MapE, S: ::std::hash::BuildHasher> ObjectMut
419 for abi_stable::std_types::RHashMap<MapK, MapE, S>
420where
421 MapK: Hash + Eq,
422{
423 type Key = MapK;
424 type Element = MapE;
425
426 #[inline]
427 fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
428 where
429 Self::Key: Borrow<Q>,
430 Q: ?Sized + Hash + Eq + Ord,
431 {
432 abi_stable::std_types::RHashMap::get_mut(self, k)
433 }
434
435 #[inline]
436 fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
437 where
438 K: Into<Self::Key>,
439 V: Into<Self::Element>,
440 Self::Key: Hash + Eq,
441 {
442 abi_stable::std_types::RHashMap::insert(self, k.into(), v.into()).into()
443 }
444
445 #[inline]
446 fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
447 where
448 Self::Key: Borrow<Q>,
449 Q: ?Sized + Hash + Eq + Ord,
450 {
451 abi_stable::std_types::RHashMap::remove(self, k).into()
452 }
453}