hicc_std/std_deque.rs
1use hicc::AbiType;
2use std::iter::Iterator;
3use std::marker::PhantomData;
4
5hicc::cpp! {
6 #include <deque>
7 #include <algorithm>
8}
9
10hicc::import_class! {
11 #[cpp(class = "template<class T, class Allocator> std::deque<T, Allocator>")]
12 pub class deque<T> {
13 /// ```
14 /// use hicc_std::DequeInt;
15 /// let deque = DequeInt::new();
16 /// assert!(deque.is_empty());
17 /// ```
18 #[cpp(method = "bool empty() const")]
19 pub fn is_empty(&self) -> bool;
20
21 /// ```
22 /// use hicc_std::DequeInt;
23 /// let deque = DequeInt::new();
24 /// assert_eq!(deque.size(), 0);
25 /// ```
26 #[cpp(method = "size_t size() const")]
27 pub fn size(&self) -> usize;
28
29 /// ```
30 /// use hicc_std::DequeInt;
31 /// let deque = DequeInt::new();
32 /// println!("deque.max_size = {}", deque.max_size());
33 /// ```
34 #[cpp(method = "size_t max_size() const")]
35 pub fn max_size(&self) -> usize;
36
37 /// ```
38 /// use hicc_std::DequeInt;
39 /// let mut deque = DequeInt::new();
40 /// deque.push_back(&1);
41 /// deque.clear();
42 /// assert!(deque.is_empty());
43 /// ```
44 #[cpp(method = "void clear()")]
45 pub fn clear(&mut self);
46
47 /// ```
48 /// use hicc_std::DequeInt;
49 /// let mut deque = DequeInt::new();
50 /// deque.resize(10, &1);
51 /// deque.push_front(&2);
52 /// // ...
53 /// deque.shrink_to_fit();
54 /// ```
55 #[cpp(method = "void shrink_to_fit()")]
56 pub fn shrink_to_fit(&mut self);
57
58 /// ```
59 /// use hicc_std::DequeInt;
60 /// let mut deque = DequeInt::new();
61 /// deque.resize(10, &1);
62 /// assert_eq!(deque.size(), 10);
63 /// assert_eq!(deque.back(), Some(&1));
64 /// assert_eq!(deque.front(), Some(&1));
65 /// assert_eq!(deque.get(5), Some(&1));
66 /// ```
67 #[cpp(method = "void resize(size_t, const T&)")]
68 pub fn resize(&mut self, n: usize, val: &T);
69
70 /// ```
71 /// use hicc_std::DequeInt;
72 /// let mut deque = DequeInt::new();
73 /// assert_eq!(deque.get(0), None);
74 /// deque.push_front(&1);
75 /// assert_eq!(deque.get(0), Some(&1));
76 /// ```
77 pub fn get(&self, pos: usize) -> Option<T::OutputRef<'_>> {
78 if pos < self.size() {
79 return unsafe { Some(self._at(pos)) };
80 }
81 None
82 }
83 #[cpp(method = "const T& at(size_t) const")]
84 unsafe fn _at(&self, pos: usize) -> &T;
85
86 /// ```
87 /// use hicc_std::DequeInt;
88 /// let mut deque = DequeInt::new();
89 /// assert_eq!(deque.get(0), None);
90 /// deque.push_front(&1);
91 /// *deque.get_mut(0).unwrap() += 1;
92 /// assert_eq!(deque.get(0), Some(&2));
93 /// ```
94 pub fn get_mut(&mut self, pos: usize) -> Option<T::OutputRefMut<'_>> {
95 if pos < self.size() {
96 return unsafe { Some(self._at_mut(pos)) };
97 }
98 None
99 }
100 #[cpp(method = "T& at(size_t)")]
101 unsafe fn _at_mut(&mut self, pos: usize) -> &mut T;
102
103 /// ```
104 /// use hicc_std::DequeInt;
105 /// let mut deque = DequeInt::new();
106 /// assert_eq!(deque.back(), None);
107 /// deque.push_back(&1);
108 /// assert_eq!(deque.back(), Some(&1));
109 /// ```
110 pub fn back(&self) -> Option<T::OutputRef<'_>> {
111 if !self.is_empty() {
112 return unsafe { Some(self._back()) };
113 }
114 None
115 }
116 #[cpp(method = "const T& back() const")]
117 unsafe fn _back(&self) -> &T;
118
119 /// 1. 如果是`hicc::Pod<T>`,可通过`*back_mut() = <new value>`改为.
120 /// 1. 如果是`c++ class`, 则必须通过`hicc::AbiClass::write`改写.
121 /// ```
122 /// use hicc_std::DequeInt;
123 /// let mut deque = DequeInt::new();
124 /// assert_eq!(deque.back_mut(), None);
125 /// deque.push_back(&1);
126 /// *deque.back_mut().unwrap() += 1;
127 /// assert_eq!(deque.back(), Some(&2));
128 ///
129 /// use hicc_std::{string, DequeString};
130 /// use hicc::AbiClass;
131 /// let mut deque = DequeString::new();
132 /// deque.push_back(&string::from(c"hello"));
133 /// assert_eq!(deque.back(), Some(string::from(c"hello").into_ref()));
134 /// deque.back_mut().unwrap().write(string::from(c"world"));
135 /// assert_eq!(deque.back(), Some(string::from(c"world").into_ref()));
136 /// ```
137 pub fn back_mut(&mut self) -> Option<T::OutputRefMut<'_>> {
138 if !self.is_empty() {
139 return unsafe { Some(self._back_mut()) };
140 }
141 None
142 }
143 #[cpp(method = "T& back()")]
144 unsafe fn _back_mut(&mut self) -> &mut T;
145
146 /// ```
147 /// use hicc_std::DequeInt;
148 /// let mut deque = DequeInt::new();
149 /// assert_eq!(deque.front(), None);
150 /// deque.push_back(&1);
151 /// assert_eq!(deque.front(), Some(&1));
152 /// ```
153 pub fn front(&self) -> Option<T::OutputRef<'_>> {
154 if !self.is_empty() {
155 return unsafe { Some(self._front()) };
156 }
157 None
158 }
159 #[cpp(method = "const T& front() const")]
160 unsafe fn _front(&self) -> &T;
161
162 /// 1. 如果是`hicc::Pod<T>`,可通过`*back_mut() = <new value>`改为.
163 /// 1. 如果是`c++ class`, 则必须通过`hicc::AbiClass::write`改写.
164 /// ```
165 /// use hicc_std::DequeInt;
166 /// let mut deque = DequeInt::new();
167 /// assert_eq!(deque.front_mut(), None);
168 /// deque.push_back(&1);
169 /// *deque.front_mut().unwrap() += 1;
170 /// assert_eq!(deque.front_mut(), Some(&mut 2));
171 ///
172 /// use hicc_std::{string, DequeString};
173 /// use hicc::AbiClass;
174 /// let mut deque = DequeString::new();
175 /// deque.push_back(&string::from(c"hello"));
176 /// assert_eq!(deque.front(), Some(string::from(c"hello").into_ref()));
177 /// deque.front_mut().unwrap().write(string::from(c"world"));
178 /// assert_eq!(deque.front(), Some(string::from(c"world").into_ref()));
179 /// ```
180 pub fn front_mut(&mut self) -> Option<T::OutputRefMut<'_>> {
181 if !self.is_empty() {
182 return unsafe { Some(self._front_mut()) };
183 }
184 None
185 }
186 #[cpp(method = "T& front()")]
187 unsafe fn _front_mut(&mut self) -> &mut T;
188
189 /// ```
190 /// use hicc_std::DequeInt;
191 /// let mut deque = DequeInt::new();
192 /// deque.assign(10, &1);
193 /// assert_eq!(deque.size(), 10);
194 /// ```
195 #[cpp(method = "void assign(size_t, const T&)")]
196 pub fn assign(&mut self, n: usize, val: &T);
197
198 /// 如果为空不做任何改变.
199 /// ```
200 /// use hicc_std::DequeInt;
201 /// let mut deque = DequeInt::new();
202 /// deque.pop_back();
203 /// deque.push_back(&1);
204 /// deque.pop_back();
205 /// assert!(deque.is_empty());
206 /// ```
207 pub fn pop_back(&mut self) {
208 if !self.is_empty() {
209 unsafe { self._pop_back(); }
210 }
211 }
212 #[cpp(method = "void pop_back()")]
213 unsafe fn _pop_back(&mut self);
214
215 /// ```
216 /// use hicc_std::DequeInt;
217 /// let mut deque = DequeInt::new();
218 /// assert_eq!(deque.front(), None);
219 /// deque.push_back(&1);
220 /// assert_eq!(deque.front(), Some(&1));
221 /// ```
222 #[cpp(method = "void push_back(const T&)")]
223 pub fn push_back(&mut self, val: &T);
224
225 /// 如果为空不做任何改变.
226 /// ```
227 /// use hicc_std::DequeInt;
228 /// let mut deque = DequeInt::new();
229 /// deque.pop_front();
230 /// deque.push_front(&1);
231 /// deque.pop_front();
232 /// assert!(deque.is_empty());
233 /// ```
234 pub fn pop_front(&mut self) {
235 if !self.is_empty() {
236 unsafe { self._pop_front(); }
237 }
238 }
239 #[cpp(method = "void pop_front()")]
240 unsafe fn _pop_front(&mut self);
241
242 /// ```
243 /// use hicc_std::DequeInt;
244 /// let mut deque = DequeInt::new();
245 /// deque.push_front(&1);
246 /// assert_eq!(deque.front(), Some(&1));
247 /// ```
248 #[cpp(method = "void push_front(const T&)")]
249 pub fn push_front(&mut self, val: &T);
250
251 /// ```
252 /// use hicc_std::DequeInt;
253 /// let mut deque = DequeInt::new();
254 /// deque.push_back(&1);
255 /// deque.swap(&mut DequeInt::new());
256 /// assert!(deque.is_empty());
257 /// ```
258 #[cpp(method = "void swap(Self&)")]
259 pub fn swap(&mut self, other: &mut Self);
260
261 /// ```
262 /// use hicc_std::DequeInt;
263 /// let mut deque = DequeInt::new();
264 /// deque.insert(2, 10, &2);
265 /// assert_eq!(deque.size(), 10);
266 /// ```
267 hicc::cpp! {
268 static void insert(Self& self, size_t pos, size_t count, const T& val) {
269 self.insert(self.begin() + std::min(pos, self.size()), count, val);
270 }
271 }
272 #[cpp(func = "void SelfMethods::insert(Self&, size_t, size_t, const T&)")]
273 pub fn insert(&mut self, pos: usize, count: usize, val: &T);
274
275 /// ```
276 /// use hicc_std::DequeInt;
277 /// let mut deque = DequeInt::new();
278 /// deque.erase(1, 9);
279 /// deque.insert(0, 10, &2);
280 /// deque.erase(1, 9);
281 /// assert_eq!(deque.size(), 1);
282 /// ```
283 hicc::cpp! {
284 static void erase(Self& self, size_t pos, size_t count) {
285 pos = std::min(pos, self.size());
286 count = std::min(count, self.size() - pos);
287 self.erase(self.begin() + pos, self.begin() + pos + count);
288 }
289 }
290 #[cpp(func = "void SelfMethods::erase(Self&, size_t, size_t)")]
291 pub fn erase(&mut self, pos: usize, count: usize);
292 }
293}
294
295unsafe impl<T: AbiType + Sync> Send for deque<T> {}
296unsafe impl<T: AbiType + Sync> Sync for deque<T> {}
297
298impl<T: AbiType> deque<T> {
299 /// ```
300 /// use hicc_std::DequeInt;
301 /// let mut deque = DequeInt::new();
302 /// deque.push_front(&1);
303 /// deque.push_front(&2);
304 /// let mut it = deque.iter();
305 /// assert_eq!(it.next(), Some(&2));
306 /// assert_eq!(it.next(), Some(&1));
307 /// assert_eq!(it.next(), None);
308 /// ```
309 pub fn iter(&self) -> impl Iterator<Item = T::OutputRef<'_>> {
310 DequeIter {
311 deque: self,
312 pos: 0,
313 _mark: PhantomData,
314 }
315 }
316
317 /// ```
318 /// use hicc_std::DequeInt;
319 /// let mut deque = DequeInt::new();
320 /// deque.push_front(&1);
321 /// deque.push_front(&3);
322 /// deque.iter_mut().for_each(|v| *v += 1);
323 /// let mut it = deque.iter();
324 /// assert_eq!(it.next(), Some(&4));
325 /// assert_eq!(it.next(), Some(&2));
326 /// assert_eq!(it.next(), None);
327 /// ```
328 pub fn iter_mut(&mut self) -> impl Iterator<Item = T::OutputRefMut<'_>> {
329 DequeIterMut {
330 deque: self,
331 pos: 0,
332 _mark: PhantomData,
333 }
334 }
335
336 /// ```
337 /// use hicc_std::DequeInt;
338 /// let mut deque = DequeInt::new();
339 /// deque.push_front(&1);
340 /// deque.push_front(&2);
341 /// let mut it = deque.rev_iter();
342 /// assert_eq!(it.next(), Some(&1));
343 /// assert_eq!(it.next(), Some(&2));
344 /// assert_eq!(it.next(), None);
345 /// ```
346 pub fn rev_iter(&self) -> impl Iterator<Item = T::OutputRef<'_>> {
347 DequeRevIter {
348 deque: self,
349 pos: self.size(),
350 _mark: PhantomData,
351 }
352 }
353
354 /// ```
355 /// use hicc_std::DequeInt;
356 /// let mut deque = DequeInt::new();
357 /// deque.push_front(&1);
358 /// deque.push_front(&3);
359 /// deque.rev_iter_mut().for_each(|v| *v += 1);
360 /// let mut it = deque.rev_iter();
361 /// assert_eq!(it.next(), Some(&2));
362 /// assert_eq!(it.next(), Some(&4));
363 /// assert_eq!(it.next(), None);
364 /// ```
365 pub fn rev_iter_mut(&mut self) -> impl Iterator<Item = T::OutputRefMut<'_>> {
366 DequeRevIterMut {
367 deque: self,
368 pos: self.size(),
369 _mark: PhantomData,
370 }
371 }
372}
373
374/// 对应`std::deque<T>::const_iterator`
375struct DequeIter<'a, T: AbiType + 'static> {
376 deque: *const deque<T>,
377 pos: usize,
378 _mark: PhantomData<&'a deque<T>>,
379}
380
381impl<'a, T: AbiType + 'static> Iterator for DequeIter<'a, T> {
382 type Item = T::OutputRef<'a>;
383 fn next(&mut self) -> Option<Self::Item> {
384 let deque = unsafe { &*self.deque };
385 if self.pos < deque.size() {
386 self.pos += 1;
387 return unsafe { Some(deque._at(self.pos - 1)) };
388 }
389 None
390 }
391}
392
393/// 对应`std::deque<T>::iterator`
394struct DequeIterMut<'a, T: AbiType + 'static> {
395 deque: *mut deque<T>,
396 pos: usize,
397 _mark: PhantomData<&'a mut deque<T>>,
398}
399
400impl<'a, T: AbiType + 'static> Iterator for DequeIterMut<'a, T> {
401 type Item = T::OutputRefMut<'a>;
402 fn next(&mut self) -> Option<Self::Item> {
403 let deque = unsafe { &mut *self.deque };
404 if self.pos < deque.size() {
405 self.pos += 1;
406 return unsafe { Some(deque._at_mut(self.pos - 1)) };
407 }
408 None
409 }
410}
411
412/// 对应`std::deque<T>::const_iterator`
413struct DequeRevIter<'a, T: AbiType + 'static> {
414 deque: *const deque<T>,
415 pos: usize,
416 _mark: PhantomData<&'a deque<T>>,
417}
418
419impl<'a, T: AbiType + 'static> Iterator for DequeRevIter<'a, T> {
420 type Item = T::OutputRef<'a>;
421 fn next(&mut self) -> Option<Self::Item> {
422 let deque = unsafe { &*self.deque };
423 if self.pos > 0 {
424 self.pos -= 1;
425 return unsafe { Some(deque._at(self.pos)) };
426 }
427 None
428 }
429}
430
431/// 对应`std::deque<T>::iterator`
432struct DequeRevIterMut<'a, T: AbiType + 'static> {
433 deque: *mut deque<T>,
434 pos: usize,
435 _mark: PhantomData<&'a mut deque<T>>,
436}
437
438impl<'a, T: AbiType + 'static> Iterator for DequeRevIterMut<'a, T> {
439 type Item = T::OutputRefMut<'a>;
440 fn next(&mut self) -> Option<Self::Item> {
441 let deque = unsafe { &mut *self.deque };
442 if self.pos > 0 {
443 self.pos -= 1;
444 return unsafe { Some(deque._at_mut(self.pos)) };
445 }
446 None
447 }
448}