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
11impl<Index, Value> FromIterator<Value> for TaggedVec<Index, Value> {
12    fn from_iter<T: IntoIterator<Item = Value>>(iter: T) -> Self {
13        Self {
14            index_type: PhantomData,
15            vec: FromIterator::from_iter(iter),
16        }
17    }
18}
19
20impl<Index, Value> IntoIterator for TaggedVec<Index, Value> {
21    type Item = Value;
22
23    type IntoIter = <Vec<Value> as IntoIterator>::IntoIter;
24
25    fn into_iter(self) -> Self::IntoIter {
26        self.vec.into_iter()
27    }
28}
29
30impl<'a, Index, Value> IntoIterator for &'a TaggedVec<Index, Value> {
31    type Item = &'a Value;
32
33    type IntoIter = <&'a Vec<Value> as IntoIterator>::IntoIter;
34
35    fn into_iter(self) -> Self::IntoIter {
36        self.vec.iter()
37    }
38}
39
40impl<'a, Index, Value> IntoIterator for &'a mut TaggedVec<Index, Value> {
41    type Item = &'a mut Value;
42
43    type IntoIter = <&'a mut Vec<Value> as IntoIterator>::IntoIter;
44
45    fn into_iter(self) -> Self::IntoIter {
46        self.vec.iter_mut()
47    }
48}
49
50impl<Index, Value> From<Vec<Value>> for TaggedVec<Index, Value> {
51    fn from(value: Vec<Value>) -> Self {
52        Self {
53            index_type: PhantomData,
54            vec: value,
55        }
56    }
57}
58
59impl<Index, Value> From<TaggedVec<Index, Value>> for Vec<Value> {
60    fn from(value: TaggedVec<Index, Value>) -> Self {
61        value.vec
62    }
63}
64
65impl<Index, Value: Debug> Debug for TaggedVec<Index, Value> {
66    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67        write!(f, "TaggedVec{:?}", self.vec)
68    }
69}
70
71impl<Index, Value: Clone> Clone for TaggedVec<Index, Value> {
72    fn clone(&self) -> Self {
73        Self {
74            index_type: PhantomData,
75            vec: self.vec.clone(),
76        }
77    }
78}
79
80impl<Index, Value> Default for TaggedVec<Index, Value> {
81    fn default() -> Self {
82        Self {
83            index_type: PhantomData,
84            vec: Default::default(),
85        }
86    }
87}
88
89impl<Index, Value: PartialEq> PartialEq for TaggedVec<Index, Value> {
90    fn eq(&self, other: &Self) -> bool {
91        self.vec == other.vec
92    }
93}
94
95impl<Index, Value: Eq> Eq for TaggedVec<Index, Value> {}
96
97impl<Index, Value: PartialOrd> PartialOrd for TaggedVec<Index, Value> {
98    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
99        self.vec.partial_cmp(&other.vec)
100    }
101}
102
103impl<Index, Value: Ord> Ord for TaggedVec<Index, Value> {
104    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
105        self.vec.cmp(&other.vec)
106    }
107}
108
109/////////////////////////////////////////
110////// INDEXING /////////////////////////
111/////////////////////////////////////////
112
113impl<Index: Into<usize>, Value> std::ops::Index<Index> for TaggedVec<Index, Value> {
114    type Output = Value;
115
116    fn index(&self, index: Index) -> &Self::Output {
117        &self.vec[index.into()]
118    }
119}
120
121impl<Index: Into<usize>, Value> std::ops::IndexMut<Index> for TaggedVec<Index, Value> {
122    fn index_mut(&mut self, index: Index) -> &mut Self::Output {
123        &mut self.vec[index.into()]
124    }
125}