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}