hicc_std/std_vector.rs
1use hicc::{AbiClass, AbiType, ClassArray, ClassMutArray};
2use std::slice;
3
4hicc::cpp! {
5 #include <vector>
6 #include <algorithm>
7}
8
9hicc::import_class! {
10 #[cpp(class = "template<class T, class Allocator> std::vector<T, Allocator>")]
11 pub class vector<T> {
12 #[cpp(method = "const T* data() const")]
13 fn data(&self) -> *const T;
14 /// ```
15 /// use hicc_std::VecInt;
16 /// let vec = VecInt::new();
17 /// assert!(vec.is_empty());
18 /// ```
19 #[cpp(method = "bool empty() const")]
20 pub fn is_empty(&self) -> bool;
21
22 /// ```
23 /// use hicc_std::VecInt;
24 /// let vec = VecInt::new();
25 /// assert_eq!(vec.size(), 0);
26 /// ```
27 #[cpp(method = "size_t size() const")]
28 pub fn size(&self) -> usize;
29
30 /// ```
31 /// use hicc_std::VecInt;
32 /// let vec = VecInt::new();
33 /// println!("vec.max_size = {}", vec.max_size());
34 /// ```
35 #[cpp(method = "size_t max_size() const")]
36 pub fn max_size(&self) -> usize;
37
38 /// ```
39 /// use hicc_std::VecInt;
40 /// let vec = VecInt::new();
41 /// println!("vec.capacity = {}", vec.capacity());
42 /// ```
43 #[cpp(method = "size_t capacity() const")]
44 pub fn capacity(&self) -> usize;
45
46 /// ```
47 /// use hicc_std::VecInt;
48 /// let mut vec = VecInt::new();
49 /// vec.push_back(&1);
50 /// vec.clear();
51 /// assert!(vec.is_empty());
52 /// ```
53 #[cpp(method = "void clear()")]
54 pub fn clear(&mut self);
55
56 /// ```
57 /// use hicc_std::VecInt;
58 /// let mut vec = VecInt::new();
59 /// vec.reserve(10_usize);
60 /// assert!(vec.is_empty());
61 /// println!("vec.capacity = {}", vec.capacity());
62 /// ```
63 #[cpp(method = "void reserve(size_t)")]
64 pub fn reserve(&mut self, n: usize);
65
66 /// ```
67 /// use hicc_std::VecInt;
68 /// let mut vec = VecInt::new();
69 /// vec.reserve(10_usize);
70 /// vec.shrink_to_fit();
71 /// println!("vec.capacity = {}", vec.capacity());
72 /// ```
73 #[cpp(method = "void shrink_to_fit()")]
74 pub fn shrink_to_fit(&mut self);
75
76 /// ```
77 /// use hicc_std::VecInt;
78 /// let mut vec = VecInt::new();
79 /// vec.resize(10, &1);
80 /// assert_eq!(vec.size(), 10);
81 /// assert_eq!(vec.back(), Some(&1));
82 /// vec.as_slice().iter().for_each(|v| println!("{v}"));
83 /// ```
84 #[cpp(method = "void resize(size_t, const T&)")]
85 pub fn resize(&mut self, n: usize, val: &T);
86
87 /// ```
88 /// use hicc_std::VecInt;
89 /// let mut vec = VecInt::new();
90 /// assert_eq!(vec.get(0), None);
91 /// vec.push_back(&1);
92 /// assert_eq!(vec.get(0), Some(&1));
93 /// ```
94 pub fn get(&self, pos: usize) -> Option<T::OutputRef<'_>> {
95 if pos < self.size() {
96 return unsafe { Some(self.at(pos)) };
97 }
98 None
99 }
100 #[cpp(method = "const T& at(size_t) const")]
101 unsafe fn at(&self, pos: usize) -> &T;
102
103 /// ```
104 /// use hicc_std::VecInt;
105 /// let mut vec = VecInt::new();
106 /// assert_eq!(vec.get(0), None);
107 /// vec.push_back(&1);
108 /// *vec.get_mut(0).unwrap() += 1;
109 /// assert_eq!(vec.get(0), Some(&2));
110 /// ```
111 pub fn get_mut(&mut self, pos: usize) -> Option<T::OutputRefMut<'_>> {
112 if pos < self.size() {
113 return unsafe { Some(self.at_mut(pos)) };
114 }
115 None
116 }
117 #[cpp(method = "T& at(size_t)")]
118 unsafe fn at_mut(&mut self, pos: usize) -> &mut T;
119
120 /// ```
121 /// use hicc_std::VecInt;
122 /// let mut vec = VecInt::new();
123 /// assert_eq!(vec.back(), None);
124 /// vec.push_back(&1);
125 /// assert_eq!(vec.back(), Some(&1));
126 /// ```
127 pub fn back(&self) -> Option<T::OutputRef<'_>> {
128 if !self.is_empty() {
129 return unsafe { Some(self._back()) };
130 }
131 None
132 }
133 #[cpp(method = "const T& back() const")]
134 unsafe fn _back(&self) -> &T;
135
136 /// 1. 如果是`hicc::Pod<T>`,可通过`*back_mut() = <new value>`改为.
137 /// 1. 如果是`c++ class`, 则必须通过`hicc::AbiClass::write`改写.
138 /// ```
139 /// use hicc_std::VecInt;
140 /// let mut vec = VecInt::new();
141 /// assert_eq!(vec.back_mut(), None);
142 /// vec.push_back(&1);
143 /// *vec.back_mut().unwrap() += 1;
144 /// assert_eq!(vec.back(), Some(&2));
145 ///
146 /// use hicc_std::{string, VecString};
147 /// use hicc::AbiClass;
148 /// let mut vec = VecString::new();
149 /// vec.push_back(&string::from(c"hello"));
150 /// assert_eq!(vec.back(), Some(string::from(c"hello").into_ref()));
151 /// vec.back_mut().unwrap().write(string::from(c"world"));
152 /// assert_eq!(vec.back(), Some(string::from(c"world").into_ref()));
153 /// ```
154 pub fn back_mut(&mut self) -> Option<T::OutputRefMut<'_>> {
155 if !self.is_empty() {
156 return unsafe { Some(self._back_mut()) };
157 }
158 None
159 }
160 #[cpp(method = "T& back()")]
161 unsafe fn _back_mut(&mut self) -> &mut T;
162
163 /// ```
164 /// use hicc_std::VecInt;
165 /// let mut vec = VecInt::new();
166 /// assert_eq!(vec.front(), None);
167 /// vec.push_back(&1);
168 /// assert_eq!(vec.front(), Some(&1));
169 /// ```
170 pub fn front(&self) -> Option<T::OutputRef<'_>> {
171 if !self.is_empty() {
172 return unsafe { Some(self._front()) };
173 }
174 None
175 }
176 #[cpp(method = "const T& front() const")]
177 unsafe fn _front(&self) -> &T;
178
179 /// 1. 如果是`hicc::Pod<T>`,可通过`*back_mut() = <new value>`改为.
180 /// 1. 如果是`c++ class`, 则必须通过`hicc::AbiClass::write`改写.
181 /// ```
182 /// use hicc_std::VecInt;
183 /// let mut vec = VecInt::new();
184 /// assert_eq!(vec.front_mut(), None);
185 /// vec.push_back(&1);
186 /// *vec.front_mut().unwrap() += 1;
187 /// assert_eq!(vec.front(), Some(&2));
188 ///
189 /// use hicc_std::{string, VecString};
190 /// use hicc::AbiClass;
191 /// let mut vec = VecString::new();
192 /// vec.push_back(&string::from(c"hello"));
193 /// assert_eq!(vec.front(), Some(string::from(c"hello").into_ref()));
194 /// vec.front_mut().unwrap().write(string::from(c"world"));
195 /// assert_eq!(vec.front(), Some(string::from(c"world").into_ref()));
196 /// ```
197 pub fn front_mut(&mut self) -> Option<T::OutputRefMut<'_>> {
198 if !self.is_empty() {
199 return unsafe { Some(self._front_mut()) };
200 }
201 None
202 }
203
204 #[cpp(method = "T& front()")]
205 unsafe fn _front_mut(&mut self) -> &mut T;
206
207 /// ```
208 /// use hicc_std::VecInt;
209 /// let mut vec = VecInt::new();
210 /// vec.assign(10, &1);
211 /// assert_eq!(vec.size(), 10);
212 /// ```
213 #[cpp(method = "void assign(size_t, const T&)")]
214 pub fn assign(&mut self, n: usize, val: &T);
215
216 /// 如果为空不做任何改变.
217 /// ```
218 /// use hicc_std::VecInt;
219 /// let mut vec = VecInt::new();
220 /// vec.pop_back();
221 /// vec.push_back(&1);
222 /// assert!(!vec.is_empty());
223 /// vec.pop_back();
224 /// assert!(vec.is_empty());
225 /// ```
226 pub fn pop_back(&mut self) {
227 if !self.is_empty() {
228 unsafe { self._pop_back() };
229 }
230 }
231 #[cpp(method = "void pop_back()")]
232 unsafe fn _pop_back(&mut self);
233
234 /// ```
235 /// use hicc_std::VecInt;
236 /// let mut vec = VecInt::new();
237 /// vec.push_back(&1);
238 /// assert_eq!(vec.front(), Some(&1));
239 /// ```
240 #[cpp(method = "void push_back(const T&)")]
241 pub fn push_back(&mut self, val: &T);
242
243 /// ```
244 /// use hicc_std::VecInt;
245 /// let mut vec = VecInt::new();
246 /// vec.push_back(&1);
247 /// vec.swap(&mut VecInt::new());
248 /// assert!(vec.is_empty());
249 /// ```
250 #[cpp(method = "void swap(Self&)")]
251 pub fn swap(&mut self, other: &mut Self);
252
253 hicc::cpp! {
254 static void insert(Self& self, size_t pos, size_t count, const T& val) {
255 self.insert(self.begin() + std::min(pos, self.size()), count, val);
256 }
257 }
258 /// 如果pos超出范围则追加到最后.
259 /// ```
260 /// use hicc_std::VecInt;
261 /// let mut vec = VecInt::new();
262 /// vec.insert(0, 2, &1);
263 /// vec.insert(vec.size(), 1, &2);
264 /// assert_eq!(vec.as_slice(), &[1, 1, 2]);
265 /// ```
266 #[cpp(func = "void SelfMethods::insert(Self&, size_t, size_t, const T&)")]
267 pub fn insert(&mut self, pos: usize, count: usize, val: &T);
268
269 hicc::cpp! {
270 static void erase(Self& self, size_t pos, size_t count) {
271 pos = std::min(pos, self.size());
272 count = std::min(count, self.size() - pos);
273 self.erase(self.begin() + pos, self.begin() + pos + count);
274 }
275 }
276 /// 如果pos超出范围则不做任何改变.
277 /// ```
278 /// use hicc_std::VecInt;
279 /// let mut vec = VecInt::new();
280 /// vec.insert(0, 10, &2);
281 /// vec.erase(1, 9);
282 /// assert_eq!(vec.size(), 1);
283 /// ```
284 #[cpp(func = "void SelfMethods::erase(Self&, size_t, size_t)")]
285 pub fn erase(&mut self, pos: usize, count: usize);
286 }
287}
288
289unsafe impl<T: AbiType + Sync> Send for vector<T> {}
290unsafe impl<T: AbiType + Sync> Sync for vector<T> {}
291
292impl<T: Sized + 'static> vector<hicc::Pod<T>> {
293 /// ```
294 /// use hicc_std::VecInt;
295 /// let mut vec = VecInt::new();
296 /// vec.insert(0, 2, &2);
297 /// assert_eq!(vec.as_slice(), &[2, 2]);
298 /// ```
299 pub fn as_slice(&self) -> &[T] {
300 let data = self.data();
301 let size = self.size();
302 unsafe { slice::from_raw_parts(data, size) }
303 }
304
305 /// ```
306 /// use hicc_std::VecInt;
307 /// let mut vec = VecInt::new();
308 /// vec.insert(0, 2, &2);
309 /// vec.as_slice_mut().iter_mut().for_each(|v| {*v += 1;});
310 /// assert_eq!(vec.as_slice(), &[3, 3]);
311 /// ```
312 pub fn as_slice_mut(&mut self) -> &mut [T] {
313 let data = self.data();
314 let size = self.size();
315 unsafe { slice::from_raw_parts_mut(data.cast_mut(), size) }
316 }
317}
318
319impl<T: AbiClass + 'static> vector<T> {
320 /// ```
321 /// use hicc_std::{VecString, string};
322 /// let mut vec = VecString::new();
323 /// let msg = string::with_cstr(c"hello");
324 /// vec.insert(0, 10, &msg);
325 /// vec.as_array().iter().for_each(|msg| { println!("msg.size() = {}", msg.size()); });
326 /// ```
327 pub fn as_array(&self) -> ClassArray<'_, T> {
328 unsafe { self.data().into_array(self.size()) }
329 }
330}
331
332impl<T: AbiClass + 'static> vector<T> {
333 /// ```
334 /// use hicc_std::{VecString, string};
335 /// let mut vec = VecString::new();
336 /// let msg = string::with_cstr(c"hello");
337 /// vec.insert(0, 10, &msg);
338 /// vec.as_mut_array().iter_mut().for_each(|mut msg| { msg.append(1, b'c' as i8); });
339 /// ```
340 pub fn as_mut_array(&mut self) -> ClassMutArray<'_, T> {
341 unsafe { self.data().into_mut_ptr().into_mut_array(self.size()) }
342 }
343}
344
345hicc::import_class! {
346 /// 对应`std::vector<bool>`.
347 #[cpp(class = "template<class Allocator> std::vector<bool, Allocator>")]
348 pub class VecBool {
349 /// ```
350 /// use hicc_std::VecBool;
351 /// let vec = VecBool::new();
352 /// assert!(vec.is_empty());
353 /// ```
354 #[cpp(method = "bool empty() const")]
355 pub fn is_empty(&self) -> bool;
356
357 /// ```
358 /// use hicc_std::VecBool;
359 /// let vec = VecBool::new();
360 /// assert_eq!(vec.size(), 0);
361 /// ```
362 #[cpp(method = "size_t size() const")]
363 pub fn size(&self) -> usize;
364
365 /// ```
366 /// use hicc_std::VecBool;
367 /// let vec = VecBool::new();
368 /// println!("vec.max_size = {}", vec.max_size());
369 /// ```
370 #[cpp(method = "size_t max_size() const")]
371 pub fn max_size(&self) -> usize;
372
373 /// ```
374 /// use hicc_std::VecBool;
375 /// let vec = VecBool::new();
376 /// println!("vec.capacity = {}", vec.capacity());
377 /// ```
378 #[cpp(method = "size_t capacity() const")]
379 pub fn capacity(&self) -> usize;
380
381 /// ```
382 /// use hicc_std::VecBool;
383 /// let mut vec = VecBool::new();
384 /// vec.push_back(true);
385 /// vec.clear();
386 /// assert!(vec.is_empty());
387 /// ```
388 #[cpp(method = "void clear()")]
389 pub fn clear(&mut self);
390
391 /// ```
392 /// use hicc_std::VecBool;
393 /// let mut vec = VecBool::new();
394 /// vec.reserve(10_usize);
395 /// assert!(vec.is_empty());
396 /// println!("vec.capacity = {}", vec.capacity());
397 /// ```
398 #[cpp(method = "void reserve(size_t)")]
399 pub fn reserve(&mut self, n: usize);
400
401 /// ```
402 /// use hicc_std::VecBool;
403 /// let mut vec = VecBool::new();
404 /// vec.reserve(10_usize);
405 /// // ...
406 /// vec.shrink_to_fit();
407 /// ```
408 #[cpp(method = "void shrink_to_fit()")]
409 pub fn shrink_to_fit(&mut self);
410
411 /// ```
412 /// use hicc_std::VecBool;
413 /// let mut vec = VecBool::new();
414 /// vec.resize(2, true);
415 /// assert_eq!(vec.size(), 2);
416 /// assert_eq!(vec.back(), Some(true));
417 /// assert_eq!(vec.front(), Some(true));
418 /// ```
419 #[cpp(method = "void resize(size_t, bool)")]
420 pub fn resize(&mut self, n: usize, val: bool);
421
422 /// ```
423 /// use hicc_std::VecBool;
424 /// let mut vec = VecBool::new();
425 /// assert_eq!(vec.get(0), None);
426 /// vec.push_back(true);
427 /// assert_eq!(vec.get(0), Some(true));
428 /// ```
429 pub fn get(&self, pos: usize) -> Option<bool> {
430 if pos < self.size() {
431 return unsafe { Some(self.at(pos)) };
432 }
433 None
434 }
435 #[cpp(method = "bool at(size_t) const")]
436 unsafe fn at(&self, pos: usize) -> bool;
437
438 hicc::cpp! {
439 static void set(Self& self, size_t pos, bool val) {
440 if (pos < self.size()) {
441 self[pos] = val;
442 }
443 }
444 }
445 /// 如果`pos`超出范围,则不做任何修改.
446 /// ```
447 /// use hicc_std::VecBool;
448 /// let mut vec = VecBool::new();
449 /// vec.set(0, false);
450 /// assert_eq!(vec.get(0), None);
451 /// vec.push_back(true);
452 /// assert_eq!(vec.get(0), Some(true));
453 /// vec.set(0, false);
454 /// assert_eq!(vec.get(0), Some(false));
455 /// ```
456 ///
457 #[cpp(func = "void SelfMethods::set(Self&, size_t, bool)")]
458 pub fn set(&mut self, pos: usize, val: bool);
459
460 /// ```
461 /// use hicc_std::VecBool;
462 /// let mut vec = VecBool::new();
463 /// assert_eq!(vec.back(), None);
464 /// vec.push_back(true);
465 /// assert_eq!(vec.back(), Some(true));
466 /// ```
467 pub fn back(&self) -> Option<bool> {
468 if !self.is_empty() {
469 return unsafe { Some(self._back()) };
470 }
471 None
472 }
473 #[cpp(method = "bool back() const")]
474 unsafe fn _back(&self) -> bool;
475
476 /// ```
477 /// use hicc_std::VecBool;
478 /// let mut vec = VecBool::new();
479 /// vec.push_back(true);
480 /// assert_eq!(vec.front(), Some(true));
481 /// ```
482 pub fn front(&self) -> Option<bool> {
483 if !self.is_empty() {
484 return unsafe { Some(self._front()) };
485 }
486 None
487 }
488 #[cpp(method = "bool front() const")]
489 unsafe fn _front(&self) -> bool;
490
491 /// ```
492 /// use hicc_std::VecBool;
493 /// let mut vec = VecBool::new();
494 /// vec.assign(2, true);
495 /// assert_eq!(vec.size(), 2);
496 /// assert_eq!(vec.front(), Some(true));
497 /// assert_eq!(vec.back(), Some(true));
498 /// ```
499 pub fn assign(&mut self, n: usize, val: bool) {
500 self._assign(n, &val);
501 }
502 #[cpp(method = "void assign(size_t, const bool&)")]
503 fn _assign(&mut self, n: usize, val: &bool);
504
505 /// 如果为空不做任何改变.
506 /// ```
507 /// use hicc_std::VecBool;
508 /// let mut vec = VecBool::new();
509 /// vec.pop_back();
510 /// vec.push_back(true);
511 /// vec.pop_back();
512 /// assert!(vec.is_empty());
513 /// ```
514 pub fn pop_back(&mut self) {
515 if !self.is_empty() {
516 unsafe { self._pop_back() };
517 }
518 }
519 #[cpp(method = "void pop_back()")]
520 unsafe fn _pop_back(&mut self);
521
522 /// ```
523 /// use hicc_std::VecBool;
524 /// let mut vec = VecBool::new();
525 /// vec.push_back(true);
526 /// assert_eq!(vec.front(), Some(true));
527 /// ```
528 #[cpp(method = "void push_back(bool)")]
529 pub fn push_back(&mut self, val: bool);
530
531 /// ```
532 /// use hicc_std::VecBool;
533 /// let mut vec = VecBool::new();
534 /// vec.push_back(true);
535 /// vec.swap(&mut VecBool::new());
536 /// assert!(vec.is_empty());
537 /// ```
538 #[cpp(method = "void swap(Self&)")]
539 pub fn swap(&mut self, other: &mut Self);
540
541 hicc::cpp! {
542 static void insert(Self& self, size_t pos, size_t count, bool val) {
543 self.insert(self.begin() + std::min(pos, self.size()), count, val);
544 }
545 }
546 /// 如果pos超出范围则添加到最后.
547 /// ```
548 /// use hicc_std::VecBool;
549 /// let mut vec = VecBool::new();
550 /// vec.insert(0, 2, true);
551 /// vec.insert(vec.size(), 1, false);
552 /// assert_eq!(vec.get(0), Some(true));
553 /// assert_eq!(vec.get(1), Some(true));
554 /// assert_eq!(vec.get(2), Some(false));
555 /// assert_eq!(vec.get(3), None);
556 /// ```
557 #[cpp(func = "void SelfMethods::insert(Self&, size_t, size_t, bool)")]
558 pub fn insert(&mut self, pos: usize, count: usize, val: bool);
559
560 hicc::cpp! {
561 static void erase(Self& self, size_t pos, size_t count) {
562 pos = std::min(pos, self.size());
563 count = std::min(count, self.size() - pos);
564 self.erase(self.begin() + pos, self.begin() + pos + count);
565 }
566 }
567 /// 如果pos超出范围则不做任何改变.
568 /// ```
569 /// use hicc_std::VecBool;
570 /// let mut vec = VecBool::new();
571 /// vec.insert(0, 10, true);
572 /// vec.erase(1, 9);
573 /// assert_eq!(vec.size(), 1);
574 /// assert_eq!(vec.get(0), Some(true));
575 /// ```
576 #[cpp(func = "void SelfMethods::erase(Self&, size_t, size_t)")]
577 pub fn erase(&mut self, pos: usize, count: usize);
578 }
579}
580
581unsafe impl Send for VecBool {}
582unsafe impl Sync for VecBool {}
583
584impl VecBool {
585
586 /// ```
587 /// use hicc_std::VecBool;
588 /// let mut vec = VecBool::new();
589 /// vec.resize(2, false);
590 /// vec.set(0, true);
591 /// let mut it = vec.iter();
592 /// assert_eq!(it.next(), Some(true));
593 /// assert_eq!(it.next(), Some(false));
594 /// assert_eq!(it.next(), None);
595 /// ```
596 pub fn iter(&self) -> impl Iterator<Item = bool> + '_ {
597 VecBoolIter { vec: self, pos: 0 }
598 }
599
600 /// ```
601 /// use hicc_std::VecBool;
602 /// let mut vec = VecBool::new();
603 /// vec.resize(2, false);
604 /// vec.set(0, true);
605 /// let mut it = vec.rev_iter();
606 /// assert_eq!(it.next(), Some(false));
607 /// assert_eq!(it.next(), Some(true));
608 /// assert_eq!(it.next(), None);
609 /// ```
610 pub fn rev_iter(&self) -> impl Iterator<Item = bool> + '_ {
611 VecBoolRevIter {
612 vec: self,
613 pos: self.size(),
614 }
615 }
616}
617
618struct VecBoolIter<'a> {
619 vec: &'a VecBool,
620 pos: usize,
621}
622
623impl Iterator for VecBoolIter<'_> {
624 type Item = bool;
625 fn next(&mut self) -> Option<Self::Item> {
626 if self.pos < self.vec.size() {
627 self.pos += 1;
628 return Some(unsafe { self.vec.at(self.pos - 1) });
629 }
630 None
631 }
632}
633
634struct VecBoolRevIter<'a> {
635 vec: &'a VecBool,
636 pos: usize,
637}
638
639impl Iterator for VecBoolRevIter<'_> {
640 type Item = bool;
641 fn next(&mut self) -> Option<Self::Item> {
642 if self.pos > 0 {
643 self.pos -= 1;
644 return Some(unsafe { self.vec.at(self.pos) });
645 }
646 None
647 }
648}