tagged_vec/
trait_impls.rs1use 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
11impl<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
103impl<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
151impl<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}