value_trait/
object.rs

1#[cfg(feature = "halfbrown")]
2use halfbrown::HashMap as Halfbrown;
3#[cfg(feature = "hashbrown")]
4use hashbrown::HashMap as Hashbrown;
5use std::collections::HashMap;
6use std::hash::Hash;
7use std::{borrow::Borrow, hash::BuildHasher};
8
9/// A trait for the minimal common functionality of a vale object
10pub trait Object {
11    /// The key in the objects
12    type Key: ?Sized;
13    /// The values in the object
14    type Element;
15
16    /// Gets a ref to a value based on a key, returns `None` if the
17    /// current Value isn't an Object or doesn't contain the key
18    /// it was asked for.
19    #[must_use]
20    fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
21    where
22        Self::Key: Borrow<Q>,
23        Q: ?Sized + Hash + Eq + Ord;
24
25    /// Iterates over the key value paris
26    #[must_use]
27    fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_>;
28
29    /// Iterates over the keys
30    #[must_use]
31    fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_>;
32
33    /// Iterates over the values
34    #[must_use]
35    fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_>;
36
37    /// Number of key/value pairs
38    #[must_use]
39    fn len(&self) -> usize;
40
41    /// Returns if the array is empty
42    #[must_use]
43    fn is_empty(&self) -> bool {
44        self.len() == 0
45    }
46}
47
48/// A mutable value Object
49pub trait ObjectMut {
50    /// The key in the objects
51    type Key: ?Sized;
52    /// The values in the object
53    type Element;
54
55    /// Gets the value of a key as a mutable reference.
56    #[must_use]
57    fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
58    where
59        Self::Key: Borrow<Q>,
60        Q: ?Sized + Hash + Eq + Ord;
61
62    /// Inserts a value
63    #[must_use]
64    fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
65    where
66        Self::Key: From<K> + Hash + Eq,
67        V: Into<Self::Element>;
68
69    /// Removes a value from the object
70    #[must_use]
71    fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
72    where
73        Self::Key: Borrow<Q>,
74        Q: ?Sized + Hash + Eq + Ord;
75}
76
77#[cfg(feature = "halfbrown")]
78impl<MapK, MapE, S> Object for Halfbrown<MapK, MapE, S>
79where
80    MapK: Hash + Eq,
81    S: BuildHasher + Default,
82{
83    type Key = MapK;
84    type Element = MapE;
85
86    #[inline]
87    fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
88    where
89        Self::Key: Borrow<Q>,
90        Q: ?Sized + Hash + Eq + Ord,
91    {
92        Halfbrown::get(self, k)
93    }
94
95    #[inline]
96    fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
97        Box::new(Halfbrown::iter(self))
98    }
99
100    #[inline]
101    fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
102        Box::new(Halfbrown::keys(self))
103    }
104
105    #[inline]
106    fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
107        Box::new(Halfbrown::values(self))
108    }
109
110    #[inline]
111    fn len(&self) -> usize {
112        Halfbrown::len(self)
113    }
114}
115
116#[cfg(feature = "halfbrown")]
117impl<MapK, MapE, S> ObjectMut for Halfbrown<MapK, MapE, S>
118where
119    MapK: Hash + Eq,
120    S: BuildHasher + Default,
121{
122    type Key = MapK;
123    type Element = MapE;
124
125    #[inline]
126    fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
127    where
128        Self::Key: Borrow<Q>,
129        Q: ?Sized + Hash + Eq + Ord,
130    {
131        Halfbrown::get_mut(self, k)
132    }
133
134    #[inline]
135    fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
136    where
137        K: Into<Self::Key>,
138        V: Into<Self::Element>,
139        Self::Key: Hash + Eq,
140    {
141        Halfbrown::insert(self, k.into(), v.into())
142    }
143
144    #[inline]
145    fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
146    where
147        Self::Key: Borrow<Q>,
148        Q: ?Sized + Hash + Eq + Ord,
149    {
150        Halfbrown::remove(self, k)
151    }
152}
153
154impl<MapK, MapE, S: BuildHasher> Object for HashMap<MapK, MapE, S>
155where
156    MapK: Hash + Eq,
157{
158    type Key = MapK;
159    type Element = MapE;
160
161    #[inline]
162    fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
163    where
164        Self::Key: Borrow<Q>,
165        Q: ?Sized + Hash + Eq + Ord,
166    {
167        HashMap::get(self, k)
168    }
169
170    #[inline]
171    fn iter(&self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + '_> {
172        Box::new(HashMap::iter(self))
173    }
174
175    #[inline]
176    fn keys(&self) -> Box<dyn Iterator<Item = &Self::Key> + '_> {
177        Box::new(HashMap::keys(self))
178    }
179
180    #[inline]
181    fn values(&self) -> Box<dyn Iterator<Item = &Self::Element> + '_> {
182        Box::new(HashMap::values(self))
183    }
184
185    #[inline]
186    fn len(&self) -> usize {
187        HashMap::len(self)
188    }
189}
190
191impl<MapK, MapE, S: BuildHasher> ObjectMut for HashMap<MapK, MapE, S>
192where
193    MapK: Hash + Eq,
194{
195    type Key = MapK;
196    type Element = MapE;
197
198    #[inline]
199    fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
200    where
201        Self::Key: Borrow<Q>,
202        Q: ?Sized + Hash + Eq + Ord,
203    {
204        HashMap::get_mut(self, k)
205    }
206
207    #[inline]
208    fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
209    where
210        K: Into<Self::Key>,
211        V: Into<Self::Element>,
212        Self::Key: Hash + Eq,
213    {
214        HashMap::insert(self, k.into(), v.into())
215    }
216
217    #[inline]
218    fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
219    where
220        Self::Key: Borrow<Q>,
221        Q: ?Sized + Hash + Eq + Ord,
222    {
223        HashMap::remove(self, k)
224    }
225}
226
227#[cfg(feature = "hashbrown")]
228impl<MapK, MapE, S: BuildHasher> Object for Hashbrown<MapK, MapE, S>
229where
230    MapK: Hash + Eq,
231{
232    type Key = MapK;
233    type Element = MapE;
234
235    #[inline]
236    fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
237    where
238        Self::Key: Borrow<Q>,
239        Q: ?Sized + Hash + Eq + Ord,
240    {
241        Hashbrown::get(self, k)
242    }
243
244    #[inline]
245    fn iter<'i>(&'i self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + 'i> {
246        Box::new(Hashbrown::iter(self))
247    }
248
249    #[inline]
250    fn keys<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Key> + 'i> {
251        Box::new(Hashbrown::keys(self))
252    }
253
254    #[inline]
255    fn values<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Element> + 'i> {
256        Box::new(Hashbrown::values(self))
257    }
258
259    #[inline]
260    fn len(&self) -> usize {
261        Hashbrown::len(self)
262    }
263}
264#[cfg(feature = "hashbrown")]
265impl<MapK, MapE, S: BuildHasher> ObjectMut for Hashbrown<MapK, MapE, S>
266where
267    MapK: Hash + Eq,
268{
269    type Key = MapK;
270    type Element = MapE;
271
272    #[inline]
273    fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut Self::Element>
274    where
275        Self::Key: Borrow<Q>,
276        Q: ?Sized + Hash + Eq + Ord,
277    {
278        Hashbrown::get_mut(self, k)
279    }
280
281    #[inline]
282    fn insert<K, V>(&mut self, k: K, v: V) -> Option<Self::Element>
283    where
284        K: Into<Self::Key>,
285        V: Into<Self::Element>,
286        Self::Key: Hash + Eq,
287    {
288        Hashbrown::insert(self, k.into(), v.into())
289    }
290
291    #[inline]
292    fn remove<Q>(&mut self, k: &Q) -> Option<Self::Element>
293    where
294        Self::Key: Borrow<Q>,
295        Q: ?Sized + Hash + Eq + Ord,
296    {
297        Hashbrown::remove(self, k)
298    }
299}
300
301#[cfg(feature = "c-abi")]
302impl<MapK, MapE, S: ::std::hash::BuildHasher> Object
303    for abi_stable::std_types::RHashMap<MapK, MapE, S>
304where
305    MapK: Hash + Eq,
306{
307    type Key = MapK;
308    type Element = MapE;
309
310    #[inline]
311    fn get<Q>(&self, k: &Q) -> Option<&Self::Element>
312    where
313        Self::Key: Borrow<Q>,
314        Q: ?Sized + Hash + Eq + Ord,
315    {
316        abi_stable::std_types::RHashMap::get(self, k)
317    }
318
319    #[inline]
320    fn iter<'i>(&'i self) -> Box<dyn Iterator<Item = (&Self::Key, &Self::Element)> + 'i> {
321        Box::new(abi_stable::std_types::RHashMap::iter(self).map(Into::into))
322    }
323
324    #[inline]
325    fn keys<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Key> + 'i> {
326        Box::new(abi_stable::std_types::RHashMap::keys(self))
327    }
328
329    #[inline]
330    fn values<'i>(&'i self) -> Box<dyn Iterator<Item = &Self::Element> + 'i> {
331        Box::new(abi_stable::std_types::RHashMap::values(self))
332    }
333
334    #[inline]
335    fn len(&self) -> usize {
336        abi_stable::std_types::RHashMap::len(self)
337    }
338}
339
340#[cfg(feature = "c-abi")]
341impl<MapK, MapE, S: ::std::hash::BuildHasher> ObjectMut
342    for abi_stable::std_types::RHashMap<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        abi_stable::std_types::RHashMap::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        abi_stable::std_types::RHashMap::insert(self, k.into(), v.into()).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        abi_stable::std_types::RHashMap::remove(self, k).into()
375    }
376}