offset_vec/vec_like/
string_impl.rs

1use 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}