tagged_vec/
trait_impls.rs1use std::{fmt::Debug, hash::Hash, 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, Value> From<Vec<Value>> for TaggedVec<Index, Value> {
41 fn from(value: Vec<Value>) -> Self {
42 Self {
43 index_type: PhantomData,
44 vec: value,
45 }
46 }
47}
48
49impl<Index, Value> From<TaggedVec<Index, Value>> for Vec<Value> {
50 fn from(value: TaggedVec<Index, Value>) -> Self {
51 value.vec
52 }
53}
54
55impl<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
103impl<Index, Value: Hash> Hash for TaggedVec<Index, Value> {
104 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
105 self.vec.hash(state);
106 }
107}
108
109impl<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}