token_read/impls/
collections.rs1use std::{
2 collections::{BTreeSet, BinaryHeap, HashSet, LinkedList, VecDeque},
3 hash::Hash,
4 str::FromStr,
5};
6
7use crate::FromTokens;
8
9macro_rules! impl_collect {
10 ($ty:ident, $bound:tt $(+ $others:tt )*) => {
11 impl<T> FromTokens for $ty<T>
12 where
13 T: $bound $(+ $others)*,
14 {
15 type Error = T::Err;
16
17 fn from_tokens<'a, I>(tokens: I) -> Result<Self, Self::Error>
18 where
19 I: Iterator<Item = &'a str>,
20 {
21 tokens.map(|v| v.parse()).collect()
22 }
23 }
24 };
25}
26
27impl_collect!(Vec, FromStr);
28impl_collect!(LinkedList, FromStr);
29impl_collect!(VecDeque, FromStr);
30impl_collect!(BTreeSet, FromStr + Ord);
31impl_collect!(HashSet, FromStr + Hash + Eq);
32impl_collect!(BinaryHeap, FromStr + Ord);
33
34#[cfg(test)]
35mod tests {
36 use std::collections::{BTreeSet, BinaryHeap, HashSet, LinkedList, VecDeque};
37
38 use crate::TokenReader;
39
40 macro_rules! impl_colletion_test {
41 ($test:ident, $container:ident) => {
42 #[test]
43 fn $test() {
44 let mut input = TokenReader::new("41 42 43".as_bytes());
45
46 let real: $container<u8> = input.line().unwrap();
47 let expected: $container<u8> = (41..=43).collect();
48
49 assert_eq!(real, expected);
50 }
51 };
52 }
53
54 impl_colletion_test!(reads_into_vec, Vec);
55 impl_colletion_test!(reads_into_linked_list, LinkedList);
56 impl_colletion_test!(reads_into_vec_deque, VecDeque);
57 impl_colletion_test!(reads_into_btree_set, BTreeSet);
58 impl_colletion_test!(reads_into_hash_set, HashSet);
59
60 #[test]
61 fn reads_into_binary_heap() {
62 let mut input = TokenReader::new("41 42 43".as_bytes());
63
64 let real: BinaryHeap<u8> = input.line().unwrap();
65 let real: Vec<u8> = real.into_iter().collect();
66
67 let expected: Vec<u8> = (41..=43).rev().collect();
68
69 assert_eq!(real, expected);
70 }
71}