src/collection.rs

branch
dev
changeset 59
9226980e45a7
equal deleted inserted replaced
58:1a38447a89fa 59:9226980e45a7
1 /*!
2 Abstract collections of objects.
3 */
4
5 use crate::loc::Loc;
6
7 /// An abstract collection of elements.
8 pub trait Collection : IntoIterator<Item = Self::Element> {
9 /// Type of elements of the collection
10 type Element;
11 /// Iterator over references to elements of the collection
12 type RefsIter<'a> : Iterator<Item=&'a Self::Element> where Self : 'a;
13
14 /// Returns an iterator over references to elements of the collection.
15 fn iter_refs(&self) -> Self::RefsIter<'_>;
16 }
17
18 /// An abstract collection of mutable elements.
19 pub trait CollectionMut : Collection {
20 /// Iterator over references to elements of the collection
21 type RefsIterMut<'a> : Iterator<Item=&'a mut Self::Element> where Self : 'a;
22
23 /// Returns an iterator over references to elements of the collection.
24 fn iter_refs_mut(&mut self) -> Self::RefsIterMut<'_>;
25 }
26
27 /// Helps implement Collection and CollectionMut for slice-like collections.
28 #[macro_export]
29 macro_rules! slice_like_collection {
30 ($type : ty where $($where:tt)*) => {
31 impl<$($where)*> Collection for $type {
32 type Element = E;
33 type RefsIter<'_a> = std::slice::Iter<'_a, E> where Self : '_a;
34
35 #[inline]
36 fn iter_refs(&self) -> Self::RefsIter<'_> {
37 self.iter()
38 }
39 }
40
41 impl<$($where)*> CollectionMut for $type {
42 type RefsIterMut<'_a> = std::slice::IterMut<'_a, E> where Self : '_a;
43
44 #[inline]
45 fn iter_refs_mut(&mut self) -> Self::RefsIterMut<'_> {
46 self.iter_mut()
47 }
48 }
49 }
50 }
51
52 slice_like_collection!(Vec<E> where E);
53 slice_like_collection!([E; N] where E, const N : usize);
54 slice_like_collection!(Loc<E, N> where E, const N : usize);

mercurial