offset_vec/vec_like/
string_impl.rs1use core::{iter::{repeat_n, repeat_with}, ops::RangeBounds, str::CharIndices};
2use alloc::string::{Drain, String};
3use super::*;
4
5impl VecLike for String {
6 type Elem = char;
7 type Slice = str;
8 type Collection = String;
9 type Drain<'a> = Drain<'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::Slice {
22 self
23 }
24
25 fn as_mut_slice(&mut self) -> &mut Self::Slice {
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, ch: Self::Elem) {
43 self.push(ch);
44 }
45
46 #[track_caller]
47 fn remove(&mut self, idx: usize) -> Self::Elem {
48 self.remove(idx)
49 }
50
51 #[track_caller]
52 fn insert(&mut self, idx: usize, ch: Self::Elem) {
53 self.insert(idx, ch);
54 }
55
56 #[track_caller]
57 fn reserve(&mut self, additional: usize) {
58 self.reserve(additional)
59 }
60
61 #[track_caller]
62 fn reserve_exact(&mut self, additional: usize) {
63 self.reserve_exact(additional)
64 }
65
66 #[track_caller]
67 fn shrink_to(&mut self, min_capacity: usize) {
68 self.shrink_to(min_capacity)
69 }
70
71 #[track_caller]
72 fn shrink_to_fit(&mut self) {
73 self.shrink_to_fit()
74 }
75
76 fn truncate(&mut self, new_len: usize) {
77 self.truncate(new_len);
78 }
79
80 #[track_caller]
81 fn split_off(&mut self, at: usize) -> Self::Collection {
82 self.split_off(at)
83 }
84
85 #[track_caller]
86 fn resize(&mut self, new_len: usize, value: Self::Elem)
87 where Self::Elem: Clone,
88 {
89 let len = self.len();
90 if new_len > len {
91 self.extend(repeat_n(value, new_len-len));
92 } else {
93 self.truncate(new_len);
94 }
95 }
96
97 #[track_caller]
98 fn resize_with<F>(&mut self, new_len: usize, f: F)
99 where F: FnMut() -> Self::Elem,
100 {
101 let len = self.len();
102 if new_len > len {
103 self.extend(repeat_with(f).take(new_len-len));
104 } else {
105 self.truncate(new_len);
106 }
107 }
108
109 fn drain<R>(&mut self, range: R) -> Self::Drain<'_>
110 where R: RangeBounds<usize>,
111 {
112 self.drain(range)
113 }
114
115 fn clear(&mut self) {
116 self.clear();
117 }
118
119 #[track_caller]
120 fn append(&mut self, other: &mut Self::Collection) {
121 self.push_str(other)
122 }
123}
124impl VecLikeAbstract for String {
125 type Indices<'a> = CharIndices<'a>;
126
127 fn retain<F>(&mut self, f: F)
128 where F: FnMut(Self::Elem) -> bool,
129 {
130 self.retain(f);
131 }
132
133 fn elem_indices(&self) -> Self::Indices<'_> {
134 self.char_indices()
135 }
136}