token_read/impls/
collections.rs

1use 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}