json_api/value/collections/
set.rs

1//! A hash set implemented as a `Map` where the value is `()`.
2
3use std::fmt::{self, Debug, Formatter};
4use std::hash::Hash;
5use std::iter::FromIterator;
6use std::marker::PhantomData;
7use std::ops::RangeFull;
8use std::str::FromStr;
9
10use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor};
11use serde::ser::{Serialize, SerializeSeq, Serializer};
12
13use error::Error;
14use sealed::Sealed;
15use value::{Key, Stringify};
16use value::collections::Equivalent;
17use value::collections::map::{self, Keys, Map};
18
19/// A hash set implemented as a `Map` where the value is `()`.
20#[derive(Clone, Eq, PartialEq)]
21pub struct Set<T: Eq + Hash = Key> {
22    inner: Map<T, ()>,
23}
24
25impl<T: Eq + Hash> Set<T> {
26    /// Creates an empty `Set`.
27    ///
28    /// # Example
29    ///
30    /// ```
31    /// # extern crate json_api;
32    /// #
33    /// # fn main() {
34    /// use json_api::value::{Key, Set};
35    /// let mut set = Set::<Key>::new();
36    /// # }
37    /// ```
38    pub fn new() -> Self {
39        Default::default()
40    }
41
42    /// Creates a new empty `Set`, with specified capacity.
43    ///
44    /// # Example
45    ///
46    /// ```
47    /// # extern crate json_api;
48    /// #
49    /// # use json_api::Error;
50    /// # use json_api::value::Set;
51    /// #
52    /// # fn example() -> Result<(), Error> {
53    /// let mut set = Set::with_capacity(2);
54    ///
55    /// set.insert("x");
56    /// set.insert("y");
57    ///
58    /// // The next insert will likely require reallocation...
59    /// set.insert("z");
60    /// #
61    /// # Ok(())
62    /// # }
63    /// #
64    /// # fn main() {
65    /// #     example().unwrap();
66    /// # }
67    /// ```
68    pub fn with_capacity(capacity: usize) -> Self {
69        let inner = Map::with_capacity(capacity);
70        Set { inner }
71    }
72
73    /// Returns the number of elements the set can hold without reallocating.
74    ///
75    /// # Example
76    ///
77    /// ```
78    /// # extern crate json_api;
79    /// #
80    /// # use json_api::value::{Key, Set};
81    /// #
82    /// # fn main() {
83    /// let set = Set::<Key>::with_capacity(2);
84    /// assert!(set.capacity() >= 2);
85    /// # }
86    /// ```
87    pub fn capacity(&self) -> usize {
88        self.inner.capacity()
89    }
90
91    /// Clears the set, removing all elements. Keeps the allocated memory for
92    /// reuse.
93    ///
94    /// # Example
95    ///
96    /// ```
97    /// # extern crate json_api;
98    /// #
99    /// # use json_api::value::Set;
100    /// #
101    /// # fn main() {
102    /// let mut set = Set::new();
103    ///
104    /// set.insert("x");
105    /// set.clear();
106    /// assert!(set.is_empty());
107    /// # }
108    /// ```
109    pub fn clear(&mut self) {
110        self.inner.clear();
111    }
112
113    /// Returns true if the set contains the specified value.
114    ///
115    /// # Example
116    ///
117    /// ```
118    /// # extern crate json_api;
119    /// #
120    /// # use json_api::value::Set;
121    /// #
122    /// # fn main() {
123    /// let mut set = Set::new();
124    ///
125    /// set.insert(1);
126    /// assert!(set.contains(&1));
127    /// assert!(!set.contains(&2));
128    /// # }
129    /// ```
130    pub fn contains<Q: ?Sized>(&self, key: &Q) -> bool
131    where
132        Q: Equivalent<T> + Hash,
133    {
134        self.inner.contains_key(key)
135    }
136
137    /// Clears the set, returning all elements in an iterator. Keeps the
138    /// allocated memory for reuse.
139    ///
140    /// # Example
141    ///
142    /// ```
143    /// # extern crate json_api;
144    /// #
145    /// # use json_api::value::Set;
146    /// #
147    /// # fn main() {
148    /// let mut set = Set::new();
149    ///
150    /// set.insert(1);
151    /// set.insert(2);
152    ///
153    /// for item in set.drain(..) {
154    ///     assert!(item == 1 || item == 2);
155    /// }
156    ///
157    /// assert!(set.is_empty());
158    /// # }
159    /// ```
160    pub fn drain(&mut self, range: RangeFull) -> Drain<T> {
161        let iter = self.inner.drain(range);
162        Drain { iter }
163    }
164
165    /// Adds a value to the set.
166    ///
167    /// If the set did not have this value present, `true` is returned.
168    ///
169    /// If the set did have this value present, `false` is returned.
170    ///
171    /// # Example
172    ///
173    /// ```
174    /// # extern crate json_api;
175    /// #
176    /// # use json_api::value::Set;
177    /// #
178    /// # fn main() {
179    /// let mut set = Set::new();
180    ///
181    /// assert_eq!(set.insert(1), true);
182    /// assert_eq!(set.insert(1), false);
183    /// assert_eq!(set.len(), 1);
184    /// # }
185    /// ```
186    pub fn insert(&mut self, key: T) -> bool {
187        self.inner.insert(key, ()).is_none()
188    }
189
190    /// Returns true if the set does not contain any elements.
191    ///
192    /// # Example
193    ///
194    /// ```
195    /// # extern crate json_api;
196    /// #
197    /// # use json_api::value::Set;
198    /// #
199    /// # fn main() {
200    /// let mut set = Set::new();
201    /// assert!(set.is_empty());
202    ///
203    /// set.insert("x");
204    /// assert!(!set.is_empty());
205    /// # }
206    /// ```
207    pub fn is_empty(&self) -> bool {
208        self.len() == 0
209    }
210
211    /// Return an iterator visiting all the elements of the set in the order in
212    /// which they were inserted.
213    ///
214    /// # Example
215    ///
216    /// ```
217    /// # extern crate json_api;
218    /// #
219    /// # use json_api::value::Set;
220    /// #
221    /// # fn main() {
222    /// let mut set = Set::new();
223    ///
224    /// set.insert("a");
225    /// set.insert("b");
226    /// set.insert("c");
227    ///
228    /// let mut iter = set.iter();
229    ///
230    /// assert_eq!(iter.next(), Some(&"a"));
231    /// assert_eq!(iter.next(), Some(&"b"));
232    /// assert_eq!(iter.next(), Some(&"c"));
233    /// assert_eq!(iter.next(), None);
234    /// # }
235    /// ```
236    pub fn iter(&self) -> Iter<T> {
237        let iter = self.inner.keys();
238        Iter { iter }
239    }
240
241    /// Return the number of elements in the set.
242    ///
243    /// # Example
244    ///
245    /// ```
246    /// # extern crate json_api;
247    /// #
248    /// # use json_api::value::Set;
249    /// #
250    /// # fn main() {
251    /// let mut set = Set::new();
252    /// assert_eq!(set.len(), 0);
253    ///
254    /// set.insert("x");
255    /// assert_eq!(set.len(), 1);
256    /// # }
257    /// ```
258    pub fn len(&self) -> usize {
259        self.inner.len()
260    }
261
262    /// Removes a value from the set. Returns `true` if the value was present
263    /// in the set.
264    ///
265    /// # Example
266    ///
267    /// ```
268    /// # extern crate json_api;
269    /// #
270    /// # use json_api::value::Set;
271    /// #
272    /// # fn main() {
273    /// let mut set = Set::new();
274    ///
275    /// set.insert("x");
276    ///
277    /// assert!(set.remove("x"));
278    /// assert!(!set.remove("x"));
279    /// assert_eq!(set.len(), 0);
280    /// # }
281    /// ```
282    pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> bool
283    where
284        Q: Equivalent<T> + Hash,
285    {
286        self.inner.remove(key).is_some()
287    }
288
289    /// Reserves capacity for at least additional more elements to be inserted
290    /// in the `Set`. The collection may reserve more space to avoid frequent
291    /// reallocations.
292    ///
293    /// # Note
294    ///
295    /// This method has yet to be fully implemented in the [`ordermap`] crate.
296    ///
297    /// # Example
298    ///
299    /// ```
300    /// # extern crate json_api;
301    /// #
302    /// # use json_api::value::Set;
303    /// #
304    /// # fn main() {
305    /// let mut set = Set::<String>::new();
306    /// set.reserve(10);
307    /// # }
308    /// ```
309    ///
310    /// [`ordermap`]: https://docs.rs/ordermap
311    pub fn reserve(&mut self, additional: usize) {
312        self.inner.reserve(additional)
313    }
314}
315
316impl<T: Debug + Eq + Hash> Debug for Set<T> {
317    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
318        f.debug_set().entries(self).finish()
319    }
320}
321
322impl<T: Eq + Hash> Default for Set<T> {
323    fn default() -> Self {
324        let inner = Default::default();
325        Set { inner }
326    }
327}
328
329impl<T: Eq + Hash> Extend<T> for Set<T> {
330    fn extend<I>(&mut self, iter: I)
331    where
332        I: IntoIterator<Item = T>,
333    {
334        let iter = iter.into_iter().map(|key| (key, ()));
335        self.inner.extend(iter);
336    }
337}
338
339impl<T: Eq + Hash> FromIterator<T> for Set<T> {
340    fn from_iter<I>(iter: I) -> Self
341    where
342        I: IntoIterator<Item = T>,
343    {
344        let inner = iter.into_iter().map(|key| (key, ())).collect();
345        Set { inner }
346    }
347}
348
349impl<T, E> FromStr for Set<T>
350where
351    T: Eq + FromStr<Err = E> + Hash,
352    E: Into<Error>,
353{
354    type Err = Error;
355
356    fn from_str(value: &str) -> Result<Self, Self::Err> {
357        let iter = value.split(',');
358        let mut set = match iter.size_hint() {
359            (_, Some(size)) => Set::with_capacity(size),
360            (_, None) => Set::new(),
361        };
362
363        for item in iter {
364            set.insert(item.parse().map_err(Into::into)?);
365        }
366
367        Ok(set)
368    }
369}
370
371impl<T: Eq + Hash> IntoIterator for Set<T> {
372    type Item = T;
373    type IntoIter = IntoIter<Self::Item>;
374
375    fn into_iter(self) -> Self::IntoIter {
376        let iter = self.inner.into_iter();
377        IntoIter { iter }
378    }
379}
380
381impl<'a, T: Eq + Hash> IntoIterator for &'a Set<T> {
382    type Item = &'a T;
383    type IntoIter = Iter<'a, T>;
384
385    fn into_iter(self) -> Self::IntoIter {
386        self.iter()
387    }
388}
389
390impl<'de, T> Deserialize<'de> for Set<T>
391where
392    T: Deserialize<'de> + Eq + Hash + 'de,
393{
394    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
395    where
396        D: Deserializer<'de>,
397    {
398        struct SetVisitor<'de, T>
399        where
400            T: Deserialize<'de> + Eq + Hash + 'de,
401        {
402            data: PhantomData<&'de T>,
403        }
404
405        impl<'de, T> SetVisitor<'de, T>
406        where
407            T: Deserialize<'de> + Eq + Hash + 'de,
408        {
409            fn new() -> Self {
410                SetVisitor { data: PhantomData }
411            }
412        }
413
414        impl<'de, T> Visitor<'de> for SetVisitor<'de, T>
415        where
416            T: Deserialize<'de> + Eq + Hash + 'de,
417        {
418            type Value = Set<T>;
419
420            fn expecting(&self, f: &mut Formatter) -> fmt::Result {
421                f.write_str("a sequence of json api member names")
422            }
423
424            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
425            where
426                A: SeqAccess<'de>,
427            {
428                let mut set = match seq.size_hint() {
429                    Some(size) => Set::with_capacity(size),
430                    None => Set::new(),
431                };
432
433                while let Some(value) = seq.next_element()? {
434                    set.insert(value);
435                }
436
437                Ok(set)
438            }
439        }
440
441        deserializer.deserialize_seq(SetVisitor::new())
442    }
443}
444
445impl<T: Eq + Hash + Serialize> Serialize for Set<T> {
446    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
447    where
448        S: Serializer,
449    {
450        let mut state = serializer.serialize_seq(Some(self.len()))?;
451
452        for value in self {
453            state.serialize_element(value)?;
454        }
455
456        state.end()
457    }
458}
459
460impl<T: Eq + Hash + Sealed> Sealed for Set<T> {}
461
462impl<T: Eq + Hash + Stringify> Stringify for Set<T> {
463    fn to_bytes(&self) -> Vec<u8> {
464        let mut bytes = Vec::new();
465
466        for value in self {
467            if !bytes.is_empty() {
468                bytes.push(b',');
469            }
470
471            bytes.append(&mut value.to_bytes());
472        }
473
474        bytes
475    }
476}
477
478/// A draining iterator over the items of a `Set`.
479pub struct Drain<'a, T: 'a> {
480    iter: map::Drain<'a, T, ()>,
481}
482
483impl<'a, T> Iterator for Drain<'a, T> {
484    type Item = T;
485
486    fn next(&mut self) -> Option<Self::Item> {
487        self.iter.next().map(|(key, _)| key)
488    }
489
490    fn size_hint(&self) -> (usize, Option<usize>) {
491        self.iter.size_hint()
492    }
493}
494
495/// An iterator over the items of a `Set`.
496pub struct Iter<'a, T: 'a> {
497    iter: Keys<'a, T, ()>,
498}
499
500impl<'a, T> Iterator for Iter<'a, T> {
501    type Item = &'a T;
502
503    fn next(&mut self) -> Option<Self::Item> {
504        self.iter.next()
505    }
506
507    fn count(self) -> usize {
508        self.iter.len()
509    }
510
511    fn last(mut self) -> Option<Self::Item> {
512        self.next_back()
513    }
514
515    fn nth(&mut self, n: usize) -> Option<Self::Item> {
516        self.iter.nth(n)
517    }
518
519    fn size_hint(&self) -> (usize, Option<usize>) {
520        self.iter.size_hint()
521    }
522}
523
524impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
525    fn next_back(&mut self) -> Option<Self::Item> {
526        self.iter.next_back()
527    }
528}
529
530impl<'a, T> ExactSizeIterator for Iter<'a, T> {
531    fn len(&self) -> usize {
532        self.iter.len()
533    }
534}
535
536/// An owning iterator over the items of a `Set`.
537pub struct IntoIter<T> {
538    iter: map::IntoIter<T, ()>,
539}
540
541impl<T> Iterator for IntoIter<T> {
542    type Item = T;
543
544    fn next(&mut self) -> Option<Self::Item> {
545        self.iter.next().map(|(key, _)| key)
546    }
547
548    fn count(self) -> usize {
549        self.iter.len()
550    }
551
552    fn last(mut self) -> Option<Self::Item> {
553        self.next_back()
554    }
555
556    fn nth(&mut self, n: usize) -> Option<Self::Item> {
557        self.iter.nth(n).map(|(key, _)| key)
558    }
559
560    fn size_hint(&self) -> (usize, Option<usize>) {
561        self.iter.size_hint()
562    }
563}
564
565impl<T> DoubleEndedIterator for IntoIter<T> {
566    fn next_back(&mut self) -> Option<Self::Item> {
567        self.iter.next_back().map(|(key, _)| key)
568    }
569}
570
571impl<T> ExactSizeIterator for IntoIter<T> {
572    fn len(&self) -> usize {
573        self.iter.len()
574    }
575}