value_trait/
object.rs

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
11/// A trait for the minimal common functionality of a vale object
12pub trait Object {
13    /// The key in the objects
14    type Key: ?Sized;
15    /// The values in the object
16    type Element;
17
18    /// Gets a ref to a value based on a key, returns `None` if the
19    /// current Value isn't an Object or doesn't contain the key
20    /// it was asked for.
21    #[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    /// Iterates over the key value paris
28    #[must_use]
29    fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_>;
30
31    /// Iterates over the keys
32    #[must_use]
33    fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_>;
34
35    /// Iterates over the values
36    #[must_use]
37    fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_>;
38
39    /// Number of key/value pairs
40    #[must_use]
41    fn len(&self) -> usize;
42
43    /// Returns if the array is empty
44    #[must_use]
45    fn is_empty(&self) -> bool {
46        self.len() == 0
47    }
48}
49
50/// A mutable value Object
51pub trait ObjectMut {
52    /// The key in the objects
53    type Key: ?Sized;
54    /// The values in the object
55    type Element;
56
57    /// Gets the value of a key as a mutable reference.
58    #[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    /// Inserts a value
65    #[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    /// Removes a value from the object
72    #[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}