1use serde::{Deserializer, Serialize, Serializer};
2use spin::{RwLock, RwLockReadGuard, RwLockWriteGuard};
3use std::cell::UnsafeCell;
4use std::fmt::{Debug, Formatter};
5use std::ops::{Deref, DerefMut, Index, IndexMut};
6use std::slice::{Iter as SliceIter};
7use std::sync::Arc;
8use std::vec::IntoIter;
9use std::iter::FusedIterator;
10
11pub struct SyncVec<V> {
32 dirty: UnsafeCell<Vec<RwLock<V>>>,
33 lock: RwLock<()>,
34}
35
36unsafe impl<V> Send for SyncVec<V> {}
39
40unsafe impl<V> Sync for SyncVec<V> {}
43
44impl<V> Default for SyncVec<V> {
45 fn default() -> Self {
46 Self::new()
47 }
48}
49
50impl<V> From<Vec<V>> for SyncVec<V> {
51 fn from(v: Vec<V>) -> Self {
52 Self::with_vec(v)
53 }
54}
55
56impl<V> FromIterator<V> for SyncVec<V> {
57 fn from_iter<T: IntoIterator<Item = V>>(iter: T) -> Self {
58 let mut v = Vec::new();
59 for item in iter {
60 v.push(RwLock::new(item));
61 }
62 Self {
63 dirty: UnsafeCell::new(v),
64 lock: RwLock::new(()),
65 }
66 }
67}
68
69impl<V> Extend<V> for SyncVec<V> {
70 fn extend<T: IntoIterator<Item = V>>(&mut self, iter: T) {
71 let v = self.dirty.get_mut();
72 for item in iter {
73 v.push(RwLock::new(item));
74 }
75 }
76}
77
78impl<V> SyncVec<V> {
79 pub fn new_arc() -> Arc<Self> {
80 Arc::new(Self::new())
81 }
82
83 pub const fn new() -> Self {
84 Self {
85 dirty: UnsafeCell::new(Vec::new()),
86 lock: RwLock::new(()),
87 }
88 }
89
90 pub fn with_vec(vec: Vec<V>) -> Self {
91 let mut v = Vec::with_capacity(vec.len());
92 for item in vec {
93 v.push(RwLock::new(item));
94 }
95 Self {
96 dirty: UnsafeCell::new(v),
97 lock: RwLock::new(()),
98 }
99 }
100
101 pub fn with_capacity(capacity: usize) -> Self {
102 Self {
103 dirty: UnsafeCell::new(Vec::with_capacity(capacity)),
104 lock: RwLock::new(()),
105 }
106 }
107
108 #[inline(always)]
109 fn as_arr(&self) -> &Vec<RwLock<V>> {
110 unsafe { &*self.dirty.get() }
111 }
112
113 #[inline(always)]
114 fn as_arr_mut(&self) -> &mut Vec<RwLock<V>> {
115 unsafe { &mut *self.dirty.get() }
116 }
117
118 #[inline(always)]
119 pub fn insert(&self, index: usize, v: V) {
120 let _lock = self.lock.write();
121 self.as_arr_mut().insert(index, RwLock::new(v));
122 }
123
124 #[inline(always)]
125 pub fn push(&self, v: V) {
126 let _lock = self.lock.write();
127 self.as_arr_mut().push(RwLock::new(v));
128 }
129
130 #[inline(always)]
131 pub fn push_return(&self, v: V) -> usize {
132 let _lock = self.lock.write();
133 let u = self.as_arr_mut();
134 let index = u.len();
135 u.push(RwLock::new(v));
136 index
137 }
138
139 #[inline(always)]
140 pub fn push_vec(&self, input_arr: Vec<V>) {
141 let mut _lock = self.lock.write();
142 let u = self.as_arr_mut();
143 for ele in input_arr.into_iter() {
144 u.push(RwLock::new(ele));
145 }
146 }
147
148 pub fn pop(&self) -> Option<V> {
149 let _lock = self.lock.write();
150 let u = self.as_arr_mut();
151 u.pop().map(|v| v.into_inner())
152 }
153
154 pub fn remove(&self, index: usize) -> Option<V> {
155 let _lock = self.lock.write();
156 let u = self.as_arr_mut();
157 if u.len() > index {
158 let v = u.remove(index);
159 Some(v.into_inner())
160 } else {
161 None
162 }
163 }
164
165 pub fn len(&self) -> usize {
166 let _lock = self.lock.read();
167 let u = self.as_arr();
168 u.len()
169 }
170
171 pub fn is_empty(&self) -> bool {
172 let _lock = self.lock.read();
173 let u = self.as_arr();
174 u.is_empty()
175 }
176
177 pub fn clear(&self) {
178 let _lock = self.lock.write();
179 let u = self.as_arr_mut();
180 u.clear();
181 }
182
183 pub fn shrink_to_fit(&self) {
184 let _lock = self.lock.write();
185 let u = self.as_arr_mut();
186 u.shrink_to_fit();
187 }
188
189 #[inline]
192 pub fn get(&self, index: usize) -> Option<ReadGuard<'_, V>> {
193 let _lock = self.lock.read();
194 let u = self.as_arr();
195 if let Some(v_lock) = u.get(index) {
196 let _value_lock = v_lock.read();
197 Some(ReadGuard {
198 _vec_lock: _lock,
199 _value_lock,
200 })
201 } else {
202 None
203 }
204 }
205
206 #[inline]
209 pub fn get_uncheck(&self, index: usize) -> ReadGuard<'_, V> {
210 let _lock = self.lock.read();
211 let u = self.as_arr();
212 let v_lock = &u[index];
213 let _value_lock = v_lock.read();
214 ReadGuard {
215 _vec_lock: _lock,
216 _value_lock,
217 }
218 }
219
220 #[inline]
223 pub fn get_mut(&self, index: usize) -> Option<WriteGuard<'_, V>> {
224 let _lock = self.lock.read();
225 let u = self.as_arr();
226 if let Some(v_lock) = u.get(index) {
227 let _value_lock = v_lock.write();
228 Some(WriteGuard {
229 _vec_lock: _lock,
230 _value_lock,
231 })
232 } else {
233 None
234 }
235 }
236
237 #[inline]
238 pub fn contains(&self, x: &V) -> bool
239 where
240 V: PartialEq,
241 {
242 let _lock = self.lock.read();
243 let u = self.as_arr();
244 for item in u {
245 if *item.read() == *x {
246 return true;
247 }
248 }
249 false
250 }
251
252 pub fn iter_rlock(&self) -> IterRLock<'_, V> {
255 let _lock = self.lock.read();
256 let u = self.as_arr();
257 IterRLock {
258 _lock,
259 inner: u.iter(),
260 }
261 }
262
263 pub fn iter(&self) -> IterNoLock<'_, V> {
272 let _lock = self.lock.read();
273 let u = self.as_arr();
274 IterNoLock {
275 _lock,
276 inner: u.iter(),
277 }
278 }
279
280 pub fn iter_mut(&self) -> IterMut<'_, V> {
283 let _lock = self.lock.read();
284 let u = self.as_arr();
285 IterMut {
286 _lock,
287 inner: u.iter(),
288 }
289 }
290
291 pub fn into_iter(self) -> IntoIter<V> {
292 let _lock = self.lock.write();
293 let m = self.dirty.into_inner();
294 let mut v = Vec::with_capacity(m.len());
295 for item in m {
296 v.push(item.into_inner());
297 }
298 v.into_iter()
299 }
300
301 pub fn dirty_ref(&self) -> ReadGuardVec<'_, V> {
302 ReadGuardVec {
303 _lock: self.lock.read(),
304 v: self.as_arr(),
305 }
306 }
307
308 pub fn into_inner(self) -> Vec<V> {
309 let m = self.dirty.into_inner();
310 let mut v = Vec::with_capacity(m.len());
311 for item in m {
312 v.push(item.into_inner());
313 }
314 v
315 }
316
317 pub fn to_vec(&self) -> Vec<V>
318 where V: Clone
319 {
320 let _lock = self.lock.read();
321 let u = self.as_arr();
322 let mut v = Vec::with_capacity(u.len());
323 for item in u {
324 v.push(item.read().clone());
325 }
326 v
327 }
328}
329
330pub struct ReadGuard<'a, V> {
331 _vec_lock: RwLockReadGuard<'a, ()>,
332 _value_lock: RwLockReadGuard<'a, V>,
333}
334
335impl<'a, V> Deref for ReadGuard<'a, V> {
336 type Target = V;
337 fn deref(&self) -> &Self::Target {
338 &*self._value_lock
339 }
340}
341
342impl<'a, V> Debug for ReadGuard<'_, V>
343where
344 V: Debug,
345{
346 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
347 write!(f, "{:?}", &*self._value_lock)
348 }
349}
350
351impl<'a, V> PartialEq for ReadGuard<'a, V>
352where
353 V: PartialEq,
354{
355 fn eq(&self, other: &Self) -> bool {
356 (*self._value_lock).eq(&*other._value_lock)
357 }
358}
359
360impl<'a, V> Eq for ReadGuard<'a, V> where V: Eq {}
361
362impl<'a, V> std::fmt::Display for ReadGuard<'_, V>
363where
364 V: std::fmt::Display,
365{
366 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
367 (*self._value_lock).fmt(f)
368 }
369}
370
371impl<'a, V> AsRef<V> for ReadGuard<'a, V> {
372 fn as_ref(&self) -> &V {
373 &*self._value_lock
374 }
375}
376
377pub struct ReadGuardVec<'a, V> {
378 _lock: RwLockReadGuard<'a, ()>,
379 v: &'a Vec<RwLock<V>>,
380}
381
382impl<'a, V> Deref for ReadGuardVec<'a, V> {
383 type Target = Vec<RwLock<V>>;
384 fn deref(&self) -> &Self::Target {
385 self.v
386 }
387}
388
389impl<'a, V> AsRef<Vec<RwLock<V>>> for ReadGuardVec<'a, V> {
390 fn as_ref(&self) -> &Vec<RwLock<V>> {
391 self.v
392 }
393}
394
395impl<'a, V> Debug for ReadGuardVec<'_, V>
396where
397 V: Debug,
398{
399 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
400 f.debug_list().entries(self.v.iter().map(|x| x.read())).finish()
401 }
402}
403
404pub struct WriteGuard<'a, V> {
405 _vec_lock: RwLockReadGuard<'a, ()>,
406 _value_lock: RwLockWriteGuard<'a, V>,
407}
408
409impl<'a, V> AsRef<V> for WriteGuard<'a, V> {
410 fn as_ref(&self) -> &V {
411 &*self._value_lock
412 }
413}
414
415impl<'a, V> AsMut<V> for WriteGuard<'a, V> {
416 fn as_mut(&mut self) -> &mut V {
417 &mut *self._value_lock
418 }
419}
420
421impl<'a, V> Deref for WriteGuard<'_, V> {
422 type Target = V;
423
424 fn deref(&self) -> &Self::Target {
425 &*self._value_lock
426 }
427}
428
429impl<'a, V> DerefMut for WriteGuard<'_, V> {
430 fn deref_mut(&mut self) -> &mut Self::Target {
431 &mut *self._value_lock
432 }
433}
434
435impl<'a, V> Debug for WriteGuard<'_, V>
436where
437 V: Debug,
438{
439 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
440 write!(f, "{:?}", &*self._value_lock)
441 }
442}
443
444impl<'a, V> std::fmt::Display for WriteGuard<'_, V>
445where V: std::fmt::Display
446{
447 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
448 (*self._value_lock).fmt(f)
449 }
450}
451
452pub struct IterRLock<'a, V> {
453 _lock: RwLockReadGuard<'a, ()>,
454 inner: SliceIter<'a, RwLock<V>>,
455}
456
457impl<'a, V> Iterator for IterRLock<'a, V> {
458 type Item = RwLockReadGuard<'a, V>;
459 fn next(&mut self) -> Option<Self::Item> {
460 self.inner.next().map(|v| v.read())
461 }
462}
463
464impl<'a, V> ExactSizeIterator for IterRLock<'a, V> {
465 fn len(&self) -> usize {
466 self.inner.len()
467 }
468}
469
470impl<'a, V> DoubleEndedIterator for IterRLock<'a, V> {
471 fn next_back(&mut self) -> Option<Self::Item> {
472 self.inner.next_back().map(|v| v.read())
473 }
474}
475
476impl<'a, V> FusedIterator for IterRLock<'a, V> {}
477
478pub struct IterMut<'a, V> {
479 _lock: RwLockReadGuard<'a, ()>,
480 inner: SliceIter<'a, RwLock<V>>,
481}
482
483impl<'a, V> Iterator for IterMut<'a, V> {
484 type Item = RwLockWriteGuard<'a, V>;
485
486 fn next(&mut self) -> Option<Self::Item> {
487 self.inner.next().map(|v| v.write())
488 }
489}
490
491impl<'a, V> ExactSizeIterator for IterMut<'a, V> {
492 fn len(&self) -> usize {
493 self.inner.len()
494 }
495}
496
497impl<'a, V> DoubleEndedIterator for IterMut<'a, V> {
498 fn next_back(&mut self) -> Option<Self::Item> {
499 self.inner.next_back().map(|v| v.write())
500 }
501}
502
503impl<'a, V> FusedIterator for IterMut<'a, V> {}
504
505pub struct IterNoLock<'a, V> {
508 _lock: RwLockReadGuard<'a, ()>,
509 inner: SliceIter<'a, RwLock<V>>,
510}
511
512impl<'a, V> Iterator for IterNoLock<'a, V> {
513 type Item = &'a V;
514
515 fn next(&mut self) -> Option<Self::Item> {
516 self.inner.next().map(|v| {
517 unsafe {
519 let lock_ptr = v as *const RwLock<V> as *mut RwLock<V>;
520 &*(*lock_ptr).get_mut()
521 }
522 })
523 }
524}
525
526impl<'a, V> ExactSizeIterator for IterNoLock<'a, V> {
527 fn len(&self) -> usize {
528 self.inner.len()
529 }
530}
531
532impl<'a, V> DoubleEndedIterator for IterNoLock<'a, V> {
533 fn next_back(&mut self) -> Option<Self::Item> {
534 self.inner.next_back().map(|v| {
535 unsafe {
537 let lock_ptr = v as *const RwLock<V> as *mut RwLock<V>;
538 &*(*lock_ptr).get_mut()
539 }
540 })
541 }
542}
543
544impl<'a, V> FusedIterator for IterNoLock<'a, V> {}
545
546impl<'a, V> IntoIterator for &'a SyncVec<V> {
547 type Item = &'a V;
548 type IntoIter = IterNoLock<'a, V>;
549
550 fn into_iter(self) -> Self::IntoIter {
551 self.iter()
552 }
553}
554
555impl<'a, V> IntoIterator for &'a mut SyncVec<V> {
556 type Item = RwLockWriteGuard<'a, V>;
557 type IntoIter = IterMut<'a, V>;
558
559 fn into_iter(self) -> Self::IntoIter {
560 self.iter_mut()
561 }
562}
563
564impl<V> IntoIterator for SyncVec<V> {
565 type Item = V;
566 type IntoIter = IntoIter<V>;
567
568 fn into_iter(self) -> Self::IntoIter {
569 self.into_iter()
570 }
571}
572
573impl<V> Serialize for SyncVec<V>
574where
575 V: Serialize,
576{
577 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
578 where
579 S: Serializer,
580 {
581 use serde::ser::SerializeSeq;
582 let _lock = self.lock.read();
583 let v = unsafe { &*self.dirty.get() };
584 let mut seq = serializer.serialize_seq(Some(v.len()))?;
585 for element in v {
586 seq.serialize_element(&*element.read())?;
587 }
588 seq.end()
589 }
590}
591
592impl<'de, V> serde::Deserialize<'de> for SyncVec<V>
593where
594 V: serde::Deserialize<'de>,
595{
596 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
597 where
598 D: Deserializer<'de>,
599 {
600 let m = Vec::deserialize(deserializer)?;
601 Ok(Self::from(m))
602 }
603}
604
605impl<V> Debug for SyncVec<V>
606where
607 V: Debug,
608{
609 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
610 write!(f, "{:?}", self.dirty_ref())
611 }
612}
613
614impl<V: std::fmt::Display> std::fmt::Display for SyncVec<V> {
615 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
616 let _lock = self.lock.read();
617 let v = unsafe { &*self.dirty.get() };
618 write!(f, "[")?;
619 for (i, item) in v.iter().enumerate() {
620 if i > 0 {
621 write!(f, ", ")?;
622 }
623 write!(f, "{}", item.read())?;
624 }
625 write!(f, "]")
626 }
627}
628
629impl<V: PartialEq> PartialEq for SyncVec<V> {
630 fn eq(&self, other: &Self) -> bool {
631 let _lock1 = self.lock.read();
632 let _lock2 = other.lock.read();
633 let v1 = unsafe { &*self.dirty.get() };
634 let v2 = unsafe { &*other.dirty.get() };
635 if v1.len() != v2.len() {
636 return false;
637 }
638 for (i1, i2) in v1.iter().zip(v2.iter()) {
639 if *i1.read() != *i2.read() {
640 return false;
641 }
642 }
643 true
644 }
645}
646
647impl<V: Clone> Clone for SyncVec<V> {
648 fn clone(&self) -> Self {
649 let _lock = self.lock.read();
650 let v = unsafe { &*self.dirty.get() };
651 let mut new_vec = Vec::with_capacity(v.len());
652 for item in v {
653 new_vec.push(RwLock::new(item.read().clone()));
654 }
655 Self {
656 dirty: UnsafeCell::new(new_vec),
657 lock: RwLock::new(()),
658 }
659 }
660}
661
662impl<V> Index<usize> for SyncVec<V> {
663 type Output = V;
664
665 fn index(&self, index: usize) -> &Self::Output {
678 unsafe {
679 let v = &*self.dirty.get();
680 let lock_ptr = &v[index] as *const RwLock<V> as *mut RwLock<V>;
688 (*lock_ptr).get_mut()
689 }
690 }
691}
692
693impl<V> IndexMut<usize> for SyncVec<V> {
694 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
695 let v = self.dirty.get_mut();
698 v[index].get_mut()
699 }
700}
701
702#[macro_export]
703macro_rules! sync_vec {
704 () => (
705 $crate::SyncVec::new()
706 );
707 ($elem:expr; $n:expr) => (
708 $crate::SyncVec::with_vec(vec![$elem;$n])
709 );
710 ($($x:expr),+ $(,)?) => (
711 $crate::SyncVec::with_vec(vec![$($x),+,])
712 );
713}
714
715#[test]
716fn test_case() {
717 struct D {}
718 impl D {
719 fn is_some(&self) -> bool {
720 println!("is_some");
721 true
722 }
723 fn take(&mut self) -> Option<bool> {
724 println!("take");
725 Some(true)
726 }
727 }
728
729 let mut d = D {};
730 if let (true, Some(d)) = (d.is_some(), d.take()) {
731 println!("d is {d}");
732 }
733}
734
735#[cfg(test)]
736mod tests {
737 use super::*;
738 use std::sync::Arc;
739 use std::thread;
740
741 #[test]
742 fn test_new_and_capacity() {
743 let vec: SyncVec<i32> = SyncVec::new();
744 assert!(vec.is_empty());
745 assert_eq!(vec.len(), 0);
746
747 let vec: SyncVec<i32> = SyncVec::with_capacity(10);
748 assert!(vec.is_empty());
749 assert_eq!(vec.len(), 0);
750 }
751
752 #[test]
753 fn test_push_and_get() {
754 let vec = SyncVec::new();
755 vec.push(1);
756 vec.push(2);
757 vec.push(3);
758
759 assert_eq!(vec.len(), 3);
760 assert_eq!(*vec.get(0).unwrap(), 1);
761 assert_eq!(*vec.get(1).unwrap(), 2);
762 assert_eq!(*vec.get(2).unwrap(), 3);
763 assert!(vec.get(3).is_none());
764 }
765
766 #[test]
767 fn test_index_methods() {
768 let mut vec = SyncVec::new();
769 vec.push(10);
770 vec.push(20);
771
772 assert_eq!(vec[0], 10);
773 assert_eq!(vec[1], 20);
774
775 {
776 let val = &mut vec[0];
777 *val = 100;
778 }
779 assert_eq!(vec[0], 100);
780 }
781
782 #[test]
783 #[should_panic(expected = "index out of bounds")]
784 fn test_index_panic() {
785 let vec = SyncVec::new();
786 vec.push(1);
787 let _ = vec[1];
788 }
789
790 #[test]
791 #[should_panic(expected = "index out of bounds")]
792 fn test_index_mut_panic() {
793 let mut vec = SyncVec::new();
794 vec.push(1);
795 let _ = &mut vec[1];
796 }
797
798 #[test]
799 fn test_remove_and_pop() {
800 let vec = SyncVec::new();
801 vec.push(1);
802 vec.push(2);
803 vec.push(3);
804
805 assert_eq!(vec.pop(), Some(3));
806 assert_eq!(vec.len(), 2);
807
808 assert_eq!(vec.remove(0), Some(1));
809 assert_eq!(vec.len(), 1);
810 assert_eq!(*vec.get(0).unwrap(), 2);
811 }
812
813 #[test]
814 fn test_concurrency() {
815 let vec = Arc::new(SyncVec::new());
816 let mut handles = vec![];
817
818 for i in 0..10 {
820 let vec = vec.clone();
821 handles.push(thread::spawn(move || {
822 for j in 0..100 {
823 vec.push(i * 100 + j);
824 }
825 }));
826 }
827
828 for handle in handles {
829 handle.join().unwrap();
830 }
831
832 assert_eq!(vec.len(), 1000);
833 }
834
835 #[test]
836 fn test_concurrent_modify() {
837 let vec = Arc::new(SyncVec::new());
838 for i in 0..100 {
839 vec.push(i);
840 }
841
842 let vec_clone = vec.clone();
843 let handle = thread::spawn(move || {
844 for i in 0..100 {
845 if let Some(mut guard) = vec_clone.get_mut(i) {
846 *guard += 1;
847 }
848 }
849 });
850
851 for i in 0..100 {
853 if let Some(val) = vec.get(i) {
854 let _ = *val; }
856 }
857
858 handle.join().unwrap();
859
860 for i in 0..100 {
862 assert_eq!(*vec.get(i).unwrap(), i + 1);
863 }
864 }
865
866 #[test]
867 fn test_iter() {
868 let vec = SyncVec::new();
869 vec.push(1);
870 vec.push(2);
871 vec.push(3);
872
873 let mut sum = 0;
874 for item in vec.iter() {
875 sum += *item;
876 }
877 assert_eq!(sum, 6);
878 }
879
880 #[test]
881 fn test_iter_mut() {
882 let vec = SyncVec::new();
883 vec.push(1);
884 vec.push(2);
885 vec.push(3);
886
887 for mut item in vec.iter_mut() {
888 *item *= 2;
889 }
890
891 assert_eq!(*vec.get(0).unwrap(), 2);
892 assert_eq!(*vec.get(1).unwrap(), 4);
893 assert_eq!(*vec.get(2).unwrap(), 6);
894 }
895
896 #[test]
897 fn test_clear() {
898 let vec = SyncVec::new();
899 vec.push(1);
900 vec.clear();
901 assert!(vec.is_empty());
902 }
903
904 #[test]
905 fn test_contains() {
906 let vec = SyncVec::new();
907 vec.push(1);
908 vec.push(2);
909 assert!(vec.contains(&1));
910 assert!(!vec.contains(&3));
911 }
912
913 #[test]
914 fn test_iterator_traits() {
915 let vec = SyncVec::new();
916 vec.push(1);
917 vec.push(2);
918 vec.push(3);
919
920 let mut iter = vec.iter();
921 assert_eq!(iter.len(), 3);
922 assert_eq!(*iter.next().unwrap(), 1);
923 assert_eq!(iter.len(), 2);
924 assert_eq!(*iter.next_back().unwrap(), 3);
925 assert_eq!(iter.len(), 1);
926 assert_eq!(*iter.next().unwrap(), 2);
927 assert_eq!(iter.len(), 0);
928 assert!(iter.next().is_none());
929 assert!(iter.next_back().is_none());
930
931 let mut vec = SyncVec::new();
932 vec.push(1);
933 vec.push(2);
934 vec.push(3);
935 let mut iter_mut = vec.iter_mut();
936 assert_eq!(iter_mut.len(), 3);
937 assert_eq!(*iter_mut.next().unwrap(), 1);
938 assert_eq!(iter_mut.len(), 2);
939 assert_eq!(*iter_mut.next_back().unwrap(), 3);
940 assert_eq!(iter_mut.len(), 1);
941 assert_eq!(*iter_mut.next().unwrap(), 2);
942 assert_eq!(iter_mut.len(), 0);
943 assert!(iter_mut.next().is_none());
944 assert!(iter_mut.next_back().is_none());
945 }
946
947 #[test]
948 fn test_from_iter_and_extend() {
949 let vec: SyncVec<i32> = SyncVec::from_iter(vec![1, 2, 3]);
950 assert_eq!(vec.len(), 3);
951 assert_eq!(*vec.get(0).unwrap(), 1);
952
953 let mut vec = SyncVec::new();
954 vec.extend(vec![1, 2, 3]);
955 assert_eq!(vec.len(), 3);
956 assert_eq!(*vec.get(0).unwrap(), 1);
957 }
958
959 #[test]
960 fn test_iter_notlock() {
961 let vec = SyncVec::new();
962 vec.push(1);
963 vec.push(2);
964 vec.push(3);
965
966 let mut sum = 0;
968 for item in vec.iter() {
969 sum += *item;
970 }
971 assert_eq!(sum, 6);
972
973 let iter = vec.iter();
975 assert_eq!(iter.len(), 3);
976 }
977
978 #[test]
979 fn test_iter_double_ended() {
980 let vec = SyncVec::new();
981 vec.push(1);
982 vec.push(2);
983 vec.push(3);
984
985 let mut iter = vec.iter();
986 assert_eq!(*iter.next().unwrap(), 1);
987 assert_eq!(*iter.next_back().unwrap(), 3);
988 assert_eq!(*iter.next().unwrap(), 2);
989 assert!(iter.next().is_none());
990 }
991
992 #[test]
993 fn test_iter_empty() {
994 let vec: SyncVec<i32> = SyncVec::new();
995
996 let mut count = 0;
997 for _ in vec.iter() {
998 count += 1;
999 }
1000 assert_eq!(count, 0);
1001
1002 let iter = vec.iter();
1003 assert_eq!(iter.len(), 0);
1004 }
1005
1006 #[test]
1007 fn test_into_iter_ref() {
1008 let vec = SyncVec::new();
1009 vec.push(10);
1010 vec.push(20);
1011 vec.push(30);
1012
1013 let mut sum = 0;
1015 for item in &vec {
1016 sum += *item;
1017 }
1018 assert_eq!(sum, 60);
1019
1020 assert_eq!(vec.len(), 3);
1022 }
1023
1024 #[test]
1025 fn test_into_iter_mut() {
1026 let mut vec = SyncVec::new();
1027 vec.push(1);
1028 vec.push(2);
1029 vec.push(3);
1030
1031 for mut item in &mut vec {
1033 *item *= 2;
1034 }
1035
1036 assert_eq!(*vec.get(0).unwrap(), 2);
1037 assert_eq!(*vec.get(1).unwrap(), 4);
1038 assert_eq!(*vec.get(2).unwrap(), 6);
1039 }
1040
1041 #[test]
1042 fn test_into_iter_owned() {
1043 let vec = SyncVec::new();
1044 vec.push(1);
1045 vec.push(2);
1046 vec.push(3);
1047
1048 let collected: Vec<_> = vec.into_iter().collect();
1050 assert_eq!(collected, vec![1, 2, 3]);
1051 }
1052}