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<T, V: VecLike<Slice = [T]>> Borrow<[T]> for OffsetVec<V> {
80    fn borrow(&self) -> &V::Slice {
81        self
82    }
83}
84impl<T, V: VecLike<Slice = [T]>> BorrowMut<[T]> for OffsetVec<V> {
85    fn borrow_mut(&mut self) -> &mut V::Slice {
86        self
87    }
88}
89
90impl<V: VecLike<Slice = str>> Borrow<str> for OffsetVec<V> {
91    fn borrow(&self) -> &V::Slice {
92        self
93    }
94}
95impl<V: VecLike<Slice = str>> BorrowMut<str> for OffsetVec<V> {
96    fn borrow_mut(&mut self) -> &mut V::Slice {
97        self
98    }
99}
100
101impl<V: VecLike> Hash for OffsetVec<V> where V::Slice: Hash {
102    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
103        self.as_slice().hash(state);
104    }
105}
106
107impl<V: VecLike> AsRef<V::Slice> for OffsetVec<V> {
108    fn as_ref(&self) -> &V::Slice {
109        self
110    }
111}
112
113impl<V: VecLike> AsMut<V::Slice> for OffsetVec<V> {
114    fn as_mut(&mut self) -> &mut V::Slice {
115        self
116    }
117}
118
119impl<V: VecLike> From<V> for OffsetVec<V> {
120    fn from(value: V) -> Self {
121        create(value, 0)
122    }
123}
124
125impl<T, V: VecLike> Extend<T> for OffsetVec<V> where V::Collection: Extend<T> {
126    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
127        self.vec.as_mut_collection().extend(iter);
128    }
129}