offset_vec/vec_like/
smallstr_impl.rs1use core::{iter::{repeat_n, repeat_with}, ops::{Bound, Range, RangeBounds}};
2use smallstr::SmallString;
3use smallvec::Array;
4use super::*;
5
6mod drain;
7use drain::*;
8
9impl<A: Array<Item = u8>> VecLike for SmallString<A> {
10 type Elem = char;
11 type Slice = str;
12 type Collection = Self;
13 type Drain<'a> = Drain<'a, A> where A: 'a;
14
15 #[inline]
16 fn len(&self) -> usize {
17 self.len()
18 }
19
20 #[inline]
21 fn is_empty(&self) -> bool {
22 self.is_empty()
23 }
24
25 fn as_slice(&self) -> &Self::Slice {
26 self
27 }
28
29 fn as_mut_slice(&mut self) -> &mut Self::Slice {
30 self
31 }
32
33 fn as_mut_collection(&mut self) -> &mut Self::Collection {
34 self
35 }
36
37 fn capacity(&self) -> usize {
38 self.capacity()
39 }
40
41 fn pop(&mut self) -> Option<Self::Elem> {
42 self.pop()
43 }
44
45 #[track_caller]
46 fn push(&mut self, ch: Self::Elem) {
47 self.push(ch);
48 }
49
50 #[track_caller]
51 fn remove(&mut self, idx: usize) -> Self::Elem {
52 self.remove(idx)
53 }
54
55 #[track_caller]
56 fn insert(&mut self, idx: usize, ch: Self::Elem) {
57 self.insert(idx, ch);
58 }
59
60 #[track_caller]
61 fn reserve(&mut self, additional: usize) {
62 self.reserve(additional)
63 }
64
65 #[track_caller]
66 fn reserve_exact(&mut self, additional: usize) {
67 self.reserve_exact(additional)
68 }
69
70 #[track_caller]
71 fn shrink_to_fit(&mut self) {
72 self.shrink_to_fit()
73 }
74
75 fn truncate(&mut self, new_len: usize) {
76 self.truncate(new_len);
77 }
78
79 #[track_caller]
80 fn resize(&mut self, new_len: usize, value: Self::Elem)
81 where Self::Elem: Clone,
82 {
83 let len = self.len();
84 if new_len > len {
85 self.extend(repeat_n(value, new_len-len));
86 } else {
87 self.truncate(new_len);
88 }
89 }
90
91 #[track_caller]
92 fn resize_with<F>(&mut self, new_len: usize, f: F)
93 where F: FnMut() -> Self::Elem,
94 {
95 let len = self.len();
96 if new_len > len {
97 self.extend(repeat_with(f).take(new_len-len));
98 } else {
99 self.truncate(new_len);
100 }
101 }
102
103 #[track_caller]
104 fn drain<R>(&mut self, range: R) -> Self::Drain<'_>
105 where R: RangeBounds<usize>,
106 {
107 let start = match range.start_bound() {
108 Bound::Included(&n) => n,
109 Bound::Excluded(&n) => n.checked_add(1).unwrap(),
110 Bound::Unbounded => 0,
111 };
112 let end = match range.end_bound() {
113 Bound::Included(&n) => n.checked_add(1).unwrap(),
114 Bound::Excluded(&n) => n,
115 Bound::Unbounded => self.len(),
116 };
117 let range = Range { start, end };
118 let _ = self.as_str()[range.clone()];
119 let bytes = unsafe { self.as_mut_vec() };
120 Drain { inner: bytes.drain(range) }
121 }
122
123 fn clear(&mut self) {
124 self.clear();
125 }
126
127 #[track_caller]
128 fn append(&mut self, other: &mut Self::Collection) {
129 self.push_str(other)
130 }
131}
132impl<A: Array<Item = u8>> VecLikeAbstract for SmallString<A> {
133 type Indices<'a> = core::str::CharIndices<'a> where A: 'a;
134
135 fn retain<F>(&mut self, f: F)
136 where F: FnMut(Self::Elem) -> bool,
137 {
138 self.retain(f);
139 }
140
141 fn elem_indices(&self) -> Self::Indices<'_> {
142 self.char_indices()
143 }
144}