offset_vec/vec_like/
smallvec_impl.rs

1use smallvec::{Array, SmallVec};
2use super::*;
3
4impl<A: Array> VecLike for SmallVec<A> {
5    type Elem = A::Item;
6    type ElemRef<'a> = &'a A::Item where Self: 'a;
7    type Slice = [A::Item];
8    type Collection = SmallVec<A>;
9    type Drain<'a> = smallvec::Drain<'a, A> where Self: 'a;
10
11    #[inline]
12    fn len(&self) -> usize {
13        self.len()
14    }
15
16    #[inline]
17    fn is_empty(&self) -> bool {
18        self.is_empty()
19    }
20
21    fn as_slice(&self) -> &[Self::Elem] {
22        self
23    }
24
25    fn as_mut_slice(&mut self) -> &mut [Self::Elem] {
26        self
27    }
28
29    fn as_mut_collection(&mut self) -> &mut Self::Collection {
30        self
31    }
32
33    fn capacity(&self) -> usize {
34        self.capacity()
35    }
36
37    fn pop(&mut self) -> Option<Self::Elem> {
38        self.pop()
39    }
40
41    #[track_caller]
42    fn push(&mut self, value: Self::Elem) {
43        self.push(value);
44    }
45
46    #[track_caller]
47    fn remove(&mut self, index: usize) -> Self::Elem {
48        self.remove(index)
49    }
50
51    fn insert(&mut self, index: usize, element: Self::Elem) {
52        self.insert(index, element);
53    }
54
55    #[track_caller]
56    fn reserve(&mut self, additional: usize) {
57        self.reserve(additional)
58    }
59
60    #[track_caller]
61    fn reserve_exact(&mut self, additional: usize) {
62        self.reserve_exact(additional)
63    }
64
65    #[track_caller]
66    fn shrink_to_fit(&mut self) {
67        self.shrink_to_fit()
68    }
69
70    fn truncate(&mut self, len: usize) {
71        self.truncate(len);
72    }
73
74    #[track_caller]
75    fn resize(&mut self, new_len: usize, value: Self::Elem)
76    where Self::Elem: Clone,
77    {
78        self.resize(new_len, value);
79    }
80
81    #[track_caller]
82    fn resize_with<F>(&mut self, new_len: usize, f: F)
83    where F: FnMut() -> Self::Elem,
84    {
85        self.resize_with(new_len, f);
86    }
87
88    fn drain<R>(&mut self, range: R) -> Self::Drain<'_>
89    where R: RangeBounds<usize>,
90    {
91        self.drain(range)
92    }
93
94    fn clear(&mut self) {
95        self.clear();
96    }
97
98    #[track_caller]
99    fn append(&mut self, other: &mut Self::Collection) {
100        self.append(other);
101    }
102
103    fn retain<F>(&mut self, mut f: F)
104    where F: FnMut(&A::Item) -> bool,
105    {
106        self.retain(|elem| f(&*elem));
107    }
108}
109impl<A: Array> VecLikeSolid for SmallVec<A> {
110    fn swap_remove(&mut self, index: usize) -> Self::Elem {
111        self.swap_remove(index)
112    }
113
114    fn retain_mut<F>(&mut self, f: F)
115    where F: FnMut(&mut Self::Elem) -> bool,
116    {
117        self.retain_mut(f);
118    }
119
120    fn pop_if<F>(&mut self, predicate: F) -> Option<Self::Elem>
121    where F: FnOnce(&mut Self::Elem) -> bool,
122    {
123        let last = self.last_mut()?;
124        if predicate(last) { self.pop() } else { None }
125    }
126}