tagged_vec/
trait_impls.rs

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