Skip to main content

tagged_vec/
trait_impls.rs

1use std::{fmt::Debug, marker::PhantomData};
2
3use crate::TaggedVec;
4
5impl<Index, Value> Extend<Value> for TaggedVec<Index, Value> {
6    fn extend<T: IntoIterator<Item = Value>>(&mut self, iter: T) {
7        self.vec.extend(iter);
8    }
9}
10
11/////////////////////////////////////////
12////// CONVERSIONS //////////////////////
13/////////////////////////////////////////
14
15impl<Index, Value> FromIterator<Value> for TaggedVec<Index, Value> {
16    fn from_iter<T: IntoIterator<Item = Value>>(iter: T) -> Self {
17        Self {
18            index_type: PhantomData,
19            vec: FromIterator::from_iter(iter),
20        }
21    }
22}
23
24impl<Index: From<usize> + Eq + Debug, Value> FromIterator<(Index, Value)>
25    for TaggedVec<Index, Value>
26{
27    fn from_iter<T: IntoIterator<Item = (Index, Value)>>(iter: T) -> Self {
28        Self {
29            index_type: PhantomData,
30            vec: FromIterator::from_iter(iter.into_iter().enumerate().map(
31                |(expected_index, (actual_index, value))| {
32                    assert_eq!(Index::from(expected_index), actual_index);
33                    value
34                },
35            )),
36        }
37    }
38}
39
40impl<Index: From<usize>, Value> IntoIterator for TaggedVec<Index, Value> {
41    type Item = (Index, Value);
42
43    type IntoIter = std::iter::Map<
44        std::iter::Enumerate<<Vec<Value> as IntoIterator>::IntoIter>,
45        fn((usize, Value)) -> (Index, Value),
46    >;
47
48    fn into_iter(self) -> Self::IntoIter {
49        self.vec
50            .into_iter()
51            .enumerate()
52            .map(|(index, value)| (index.into(), value))
53    }
54}
55
56impl<'a, Index: From<usize>, Value> IntoIterator for &'a TaggedVec<Index, Value> {
57    type Item = (Index, &'a Value);
58
59    type IntoIter = std::iter::Map<
60        std::iter::Enumerate<<&'a Vec<Value> as IntoIterator>::IntoIter>,
61        fn((usize, &'a Value)) -> (Index, &'a Value),
62    >;
63
64    fn into_iter(self) -> Self::IntoIter {
65        self.vec
66            .iter()
67            .enumerate()
68            .map(|(index, value)| (index.into(), value))
69    }
70}
71
72impl<'a, Index: From<usize>, Value> IntoIterator for &'a mut TaggedVec<Index, Value> {
73    type Item = (Index, &'a mut Value);
74
75    type IntoIter = std::iter::Map<
76        std::iter::Enumerate<<&'a mut Vec<Value> as IntoIterator>::IntoIter>,
77        fn((usize, &'a mut Value)) -> (Index, &'a mut Value),
78    >;
79
80    fn into_iter(self) -> Self::IntoIter {
81        self.vec
82            .iter_mut()
83            .enumerate()
84            .map(|(index, value)| (index.into(), value))
85    }
86}
87
88impl<Index, Value> From<Vec<Value>> for TaggedVec<Index, Value> {
89    fn from(value: Vec<Value>) -> Self {
90        Self {
91            index_type: PhantomData,
92            vec: value,
93        }
94    }
95}
96
97impl<Index, Value> From<TaggedVec<Index, Value>> for Vec<Value> {
98    fn from(value: TaggedVec<Index, Value>) -> Self {
99        value.vec
100    }
101}
102
103/////////////////////////////////////////
104////// STANDARD TRAITS //////////////////
105/////////////////////////////////////////
106
107impl<Index, Value: Debug> Debug for TaggedVec<Index, Value> {
108    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
109        write!(f, "TaggedVec{:?}", self.vec)
110    }
111}
112
113impl<Index, Value: Clone> Clone for TaggedVec<Index, Value> {
114    fn clone(&self) -> Self {
115        Self {
116            index_type: PhantomData,
117            vec: self.vec.clone(),
118        }
119    }
120}
121
122impl<Index, Value> Default for TaggedVec<Index, Value> {
123    fn default() -> Self {
124        Self {
125            index_type: PhantomData,
126            vec: Default::default(),
127        }
128    }
129}
130
131impl<Index, Value: PartialEq> PartialEq for TaggedVec<Index, Value> {
132    fn eq(&self, other: &Self) -> bool {
133        self.vec == other.vec
134    }
135}
136
137impl<Index, Value: Eq> Eq for TaggedVec<Index, Value> {}
138
139impl<Index, Value: PartialOrd> PartialOrd for TaggedVec<Index, Value> {
140    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
141        self.vec.partial_cmp(&other.vec)
142    }
143}
144
145impl<Index, Value: Ord> Ord for TaggedVec<Index, Value> {
146    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
147        self.vec.cmp(&other.vec)
148    }
149}
150
151/////////////////////////////////////////
152////// INDEXING /////////////////////////
153/////////////////////////////////////////
154
155impl<Index: Into<usize>, Value> std::ops::Index<Index> for TaggedVec<Index, Value> {
156    type Output = Value;
157
158    fn index(&self, index: Index) -> &Self::Output {
159        &self.vec[index.into()]
160    }
161}
162
163impl<Index: Into<usize>, Value> std::ops::IndexMut<Index> for TaggedVec<Index, Value> {
164    fn index_mut(&mut self, index: Index) -> &mut Self::Output {
165        &mut self.vec[index.into()]
166    }
167}