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