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}