Skip to main content

tagged_vec/
trait_impls.rs

1use 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
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, 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
55/////////////////////////////////////////
56////// STANDARD TRAITS //////////////////
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
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
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}