offset_vec/externs/
core_impls.rs

1use core::{borrow::{Borrow, BorrowMut}, hash::Hash};
2
3use crate::{create, OffsetVec, VecLike};
4
5impl<V: VecLike> PartialEq for OffsetVec<V> where V::Slice: PartialEq {
6    fn eq(&self, other: &Self) -> bool {
7        **self == **other
8    }
9}
10
11impl<V: VecLike> PartialEq<V> for OffsetVec<V> where V::Slice: PartialEq {
12    fn eq(&self, other: &V) -> bool {
13        **self == *other.as_slice()
14    }
15}
16
17impl<V: VecLike> Eq for OffsetVec<V> where V::Slice: Eq { }
18
19impl<V: VecLike> PartialOrd for OffsetVec<V> where V::Slice: PartialOrd {
20    fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
21        (**self).partial_cmp(&**other)
22    }
23}
24
25impl<V: VecLike> Ord for OffsetVec<V> where V::Slice: Ord {
26    fn cmp(&self, other: &Self) -> core::cmp::Ordering {
27        (**self).cmp(&**other)
28    }
29}
30
31impl<T: PartialEq, V: VecLike<Elem = T, Slice = [T]>> PartialEq<[T]> for OffsetVec<V> {
32    fn eq(&self, other: &[V::Elem]) -> bool {
33        **self == *other
34    }
35}
36impl<T: PartialEq, V: VecLike<Elem = T, Slice = [T]>> PartialEq<&[T]> for OffsetVec<V> {
37    fn eq(&self, other: &&[V::Elem]) -> bool {
38        **self == **other
39    }
40}
41
42impl<T: PartialEq, V: VecLike<Elem = T, Slice = [T]>, const N: usize> PartialEq<[T; N]> for OffsetVec<V> {
43    fn eq(&self, other: &[V::Elem; N]) -> bool {
44        **self == *other
45    }
46}
47impl<T: PartialEq, V: VecLike<Elem = T, Slice = [T]>, const N: usize> PartialEq<&[T; N]> for OffsetVec<V> {
48    fn eq(&self, other: &&[V::Elem; N]) -> bool {
49        **self == **other
50    }
51}
52
53impl<V: VecLike<Slice = str>> PartialEq<str> for OffsetVec<V> {
54    fn eq(&self, other: &str) -> bool {
55        **self == *other
56    }
57}
58impl<V: VecLike<Slice = str>> PartialEq<&str> for OffsetVec<V> {
59    fn eq(&self, other: &&str) -> bool {
60        **self == **other
61    }
62}
63
64impl<V: VecLike + IntoIterator> IntoIterator for OffsetVec<V> {
65    type Item = V::Item;
66    type IntoIter = V::IntoIter;
67
68    fn into_iter(self) -> Self::IntoIter {
69        let mut iter = self.vec.into_iter();
70
71        if self.offset != 0 {
72            iter.nth(self.offset-1);
73        }
74
75        iter
76    }
77}
78
79impl<'a, V: VecLike + IntoIterator> IntoIterator for &'a OffsetVec<V> where &'a V::Slice: IntoIterator {
80    type Item = <&'a V::Slice as IntoIterator>::Item;
81    type IntoIter = <&'a V::Slice as IntoIterator>::IntoIter;
82
83    fn into_iter(self) -> Self::IntoIter {
84        self.iter()
85    }
86}
87
88impl<'a, V: VecLike + IntoIterator> IntoIterator for &'a mut OffsetVec<V> where &'a mut V::Slice: IntoIterator {
89    type Item = <&'a mut V::Slice as IntoIterator>::Item;
90    type IntoIter = <&'a mut V::Slice as IntoIterator>::IntoIter;
91
92    fn into_iter(self) -> Self::IntoIter {
93        self.iter_mut()
94    }
95}
96
97impl<T, V: VecLike<Slice = [T]>> Borrow<[T]> for OffsetVec<V> {
98    fn borrow(&self) -> &V::Slice {
99        self
100    }
101}
102impl<T, V: VecLike<Slice = [T]>> BorrowMut<[T]> for OffsetVec<V> {
103    fn borrow_mut(&mut self) -> &mut V::Slice {
104        self
105    }
106}
107
108impl<V: VecLike<Slice = str>> Borrow<str> for OffsetVec<V> {
109    fn borrow(&self) -> &V::Slice {
110        self
111    }
112}
113impl<V: VecLike<Slice = str>> BorrowMut<str> for OffsetVec<V> {
114    fn borrow_mut(&mut self) -> &mut V::Slice {
115        self
116    }
117}
118
119impl<V: VecLike> Hash for OffsetVec<V> where V::Slice: Hash {
120    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
121        self.as_slice().hash(state);
122    }
123}
124
125impl<V: VecLike> AsRef<V::Slice> for OffsetVec<V> {
126    fn as_ref(&self) -> &V::Slice {
127        self
128    }
129}
130
131impl<V: VecLike> AsMut<V::Slice> for OffsetVec<V> {
132    fn as_mut(&mut self) -> &mut V::Slice {
133        self
134    }
135}
136
137impl<V: VecLike> From<V> for OffsetVec<V> {
138    fn from(value: V) -> Self {
139        create(value, 0)
140    }
141}
142
143impl<T, V: VecLike> Extend<T> for OffsetVec<V> where V::Collection: Extend<T> {
144    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
145        self.vec.as_mut_collection().extend(iter);
146    }
147}
148
149impl<T, V: VecLike> FromIterator<T> for OffsetVec<V> where V: FromIterator<T> {
150    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
151        iter.into_iter().collect::<V>().into()
152    }
153}