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]
197 pub fn get(&self, index: usize) -> Option<VecReadGuard<'_, V>> {
198 let _lock = self.lock.read();
199 let u = self.as_arr();
200 if let Some(v_lock) = u.get(index) {
201 let value_ptr = unsafe {
203 let lock_ptr = v_lock as *const RwLock<V> as *mut RwLock<V>;
204 &*(*lock_ptr).get_mut()
205 };
206 Some(VecReadGuard {
207 _vec_lock: _lock,
208 _value_ptr: value_ptr,
209 })
210 } else {
211 None
212 }
213 }
214
215 #[inline]
218 pub fn get_rlock(&self, index: usize) -> Option<ReadGuard<'_, V>> {
219 let _lock = self.lock.read();
220 let u = self.as_arr();
221 if let Some(v_lock) = u.get(index) {
222 let _value_lock = v_lock.read();
223 Some(ReadGuard {
224 _vec_lock: _lock,
225 _value_lock,
226 })
227 } else {
228 None
229 }
230 }
231
232 #[inline]
240 pub fn get_uncheck(&self, index: usize) -> VecReadGuard<'_, V> {
241 let _lock = self.lock.read();
242 let u = self.as_arr();
243 let v_lock = &u[index];
244 let value_ptr = unsafe {
246 let lock_ptr = v_lock as *const RwLock<V> as *mut RwLock<V>;
247 &*(*lock_ptr).get_mut()
248 };
249 VecReadGuard {
250 _vec_lock: _lock,
251 _value_ptr: value_ptr,
252 }
253 }
254
255 #[inline]
258 pub fn get_mut(&self, index: usize) -> Option<WriteGuard<'_, V>> {
259 let _lock = self.lock.read();
260 let u = self.as_arr();
261 if let Some(v_lock) = u.get(index) {
262 let _value_lock = v_lock.write();
263 Some(WriteGuard {
264 _vec_lock: _lock,
265 _value_lock,
266 })
267 } else {
268 None
269 }
270 }
271
272 #[inline]
273 pub fn contains(&self, x: &V) -> bool
274 where
275 V: PartialEq,
276 {
277 let _lock = self.lock.read();
278 let u = self.as_arr();
279 for item in u {
280 if *item.read() == *x {
281 return true;
282 }
283 }
284 false
285 }
286
287 pub fn iter_rlock(&self) -> IterRLock<'_, V> {
290 let _lock = self.lock.read();
291 let u = self.as_arr();
292 IterRLock {
293 _lock,
294 inner: u.iter(),
295 }
296 }
297
298 pub fn iter(&self) -> IterNoLock<'_, V> {
307 let _lock = self.lock.read();
308 let u = self.as_arr();
309 IterNoLock {
310 _lock,
311 inner: u.iter(),
312 }
313 }
314
315 pub fn iter_mut(&self) -> IterMut<'_, V> {
318 let _lock = self.lock.read();
319 let u = self.as_arr();
320 IterMut {
321 _lock,
322 inner: u.iter(),
323 }
324 }
325
326 pub fn into_iter(self) -> IntoIter<V> {
327 let _lock = self.lock.write();
328 let m = self.dirty.into_inner();
329 let mut v = Vec::with_capacity(m.len());
330 for item in m {
331 v.push(item.into_inner());
332 }
333 v.into_iter()
334 }
335
336 pub fn dirty_ref(&self) -> ReadGuardVec<'_, V> {
337 ReadGuardVec {
338 _lock: self.lock.read(),
339 v: self.as_arr(),
340 }
341 }
342
343 pub fn into_inner(self) -> Vec<V> {
344 let m = self.dirty.into_inner();
345 let mut v = Vec::with_capacity(m.len());
346 for item in m {
347 v.push(item.into_inner());
348 }
349 v
350 }
351
352 pub fn to_vec(&self) -> Vec<V>
353 where V: Clone
354 {
355 let _lock = self.lock.read();
356 let u = self.as_arr();
357 let mut v = Vec::with_capacity(u.len());
358 for item in u {
359 v.push(item.read().clone());
360 }
361 v
362 }
363}
364
365pub struct VecReadGuard<'a, V> {
368 _vec_lock: RwLockReadGuard<'a, ()>,
369 _value_ptr: &'a V,
370}
371
372impl<'a, V> Deref for VecReadGuard<'a, V> {
373 type Target = V;
374 fn deref(&self) -> &Self::Target {
375 self._value_ptr
376 }
377}
378
379impl<'a, V> Debug for VecReadGuard<'_, V>
380where
381 V: Debug,
382{
383 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
384 write!(f, "{:?}", self._value_ptr)
385 }
386}
387
388impl<'a, V> PartialEq for VecReadGuard<'a, V>
389where
390 V: PartialEq,
391{
392 fn eq(&self, other: &Self) -> bool {
393 self._value_ptr.eq(other._value_ptr)
394 }
395}
396
397impl<'a, V> Eq for VecReadGuard<'a, V> where V: Eq {}
398
399impl<'a, V> std::fmt::Display for VecReadGuard<'_, V>
400where
401 V: std::fmt::Display,
402{
403 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
404 self._value_ptr.fmt(f)
405 }
406}
407
408impl<'a, V> AsRef<V> for VecReadGuard<'a, V> {
409 fn as_ref(&self) -> &V {
410 self._value_ptr
411 }
412}
413
414pub struct ReadGuard<'a, V> {
415 _vec_lock: RwLockReadGuard<'a, ()>,
416 _value_lock: RwLockReadGuard<'a, V>,
417}
418
419impl<'a, V> Deref for ReadGuard<'a, V> {
420 type Target = V;
421 fn deref(&self) -> &Self::Target {
422 &*self._value_lock
423 }
424}
425
426impl<'a, V> Debug for ReadGuard<'_, V>
427where
428 V: Debug,
429{
430 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
431 write!(f, "{:?}", &*self._value_lock)
432 }
433}
434
435impl<'a, V> PartialEq for ReadGuard<'a, V>
436where
437 V: PartialEq,
438{
439 fn eq(&self, other: &Self) -> bool {
440 (*self._value_lock).eq(&*other._value_lock)
441 }
442}
443
444impl<'a, V> Eq for ReadGuard<'a, V> where V: Eq {}
445
446impl<'a, V> std::fmt::Display for ReadGuard<'_, V>
447where
448 V: std::fmt::Display,
449{
450 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
451 (*self._value_lock).fmt(f)
452 }
453}
454
455impl<'a, V> AsRef<V> for ReadGuard<'a, V> {
456 fn as_ref(&self) -> &V {
457 &*self._value_lock
458 }
459}
460
461pub struct ReadGuardVec<'a, V> {
462 _lock: RwLockReadGuard<'a, ()>,
463 v: &'a Vec<RwLock<V>>,
464}
465
466impl<'a, V> Deref for ReadGuardVec<'a, V> {
467 type Target = Vec<RwLock<V>>;
468 fn deref(&self) -> &Self::Target {
469 self.v
470 }
471}
472
473impl<'a, V> AsRef<Vec<RwLock<V>>> for ReadGuardVec<'a, V> {
474 fn as_ref(&self) -> &Vec<RwLock<V>> {
475 self.v
476 }
477}
478
479impl<'a, V> Debug for ReadGuardVec<'_, V>
480where
481 V: Debug,
482{
483 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
484 f.debug_list().entries(self.v.iter().map(|x| x.read())).finish()
485 }
486}
487
488pub struct WriteGuard<'a, V> {
489 _vec_lock: RwLockReadGuard<'a, ()>,
490 _value_lock: RwLockWriteGuard<'a, V>,
491}
492
493impl<'a, V> AsRef<V> for WriteGuard<'a, V> {
494 fn as_ref(&self) -> &V {
495 &*self._value_lock
496 }
497}
498
499impl<'a, V> AsMut<V> for WriteGuard<'a, V> {
500 fn as_mut(&mut self) -> &mut V {
501 &mut *self._value_lock
502 }
503}
504
505impl<'a, V> Deref for WriteGuard<'_, V> {
506 type Target = V;
507
508 fn deref(&self) -> &Self::Target {
509 &*self._value_lock
510 }
511}
512
513impl<'a, V> DerefMut for WriteGuard<'_, V> {
514 fn deref_mut(&mut self) -> &mut Self::Target {
515 &mut *self._value_lock
516 }
517}
518
519impl<'a, V> Debug for WriteGuard<'_, V>
520where
521 V: Debug,
522{
523 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
524 write!(f, "{:?}", &*self._value_lock)
525 }
526}
527
528impl<'a, V> std::fmt::Display for WriteGuard<'_, V>
529where V: std::fmt::Display
530{
531 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
532 (*self._value_lock).fmt(f)
533 }
534}
535
536pub struct IterRLock<'a, V> {
537 _lock: RwLockReadGuard<'a, ()>,
538 inner: SliceIter<'a, RwLock<V>>,
539}
540
541impl<'a, V> Iterator for IterRLock<'a, V> {
542 type Item = RwLockReadGuard<'a, V>;
543 fn next(&mut self) -> Option<Self::Item> {
544 self.inner.next().map(|v| v.read())
545 }
546}
547
548impl<'a, V> ExactSizeIterator for IterRLock<'a, V> {
549 fn len(&self) -> usize {
550 self.inner.len()
551 }
552}
553
554impl<'a, V> DoubleEndedIterator for IterRLock<'a, V> {
555 fn next_back(&mut self) -> Option<Self::Item> {
556 self.inner.next_back().map(|v| v.read())
557 }
558}
559
560impl<'a, V> FusedIterator for IterRLock<'a, V> {}
561
562pub struct IterMut<'a, V> {
563 _lock: RwLockReadGuard<'a, ()>,
564 inner: SliceIter<'a, RwLock<V>>,
565}
566
567impl<'a, V> Iterator for IterMut<'a, V> {
568 type Item = RwLockWriteGuard<'a, V>;
569
570 fn next(&mut self) -> Option<Self::Item> {
571 self.inner.next().map(|v| v.write())
572 }
573}
574
575impl<'a, V> ExactSizeIterator for IterMut<'a, V> {
576 fn len(&self) -> usize {
577 self.inner.len()
578 }
579}
580
581impl<'a, V> DoubleEndedIterator for IterMut<'a, V> {
582 fn next_back(&mut self) -> Option<Self::Item> {
583 self.inner.next_back().map(|v| v.write())
584 }
585}
586
587impl<'a, V> FusedIterator for IterMut<'a, V> {}
588
589pub struct IterNoLock<'a, V> {
592 _lock: RwLockReadGuard<'a, ()>,
593 inner: SliceIter<'a, RwLock<V>>,
594}
595
596impl<'a, V> Iterator for IterNoLock<'a, V> {
597 type Item = &'a V;
598
599 fn next(&mut self) -> Option<Self::Item> {
600 self.inner.next().map(|v| {
601 unsafe {
603 let lock_ptr = v as *const RwLock<V> as *mut RwLock<V>;
604 &*(*lock_ptr).get_mut()
605 }
606 })
607 }
608}
609
610impl<'a, V> ExactSizeIterator for IterNoLock<'a, V> {
611 fn len(&self) -> usize {
612 self.inner.len()
613 }
614}
615
616impl<'a, V> DoubleEndedIterator for IterNoLock<'a, V> {
617 fn next_back(&mut self) -> Option<Self::Item> {
618 self.inner.next_back().map(|v| {
619 unsafe {
621 let lock_ptr = v as *const RwLock<V> as *mut RwLock<V>;
622 &*(*lock_ptr).get_mut()
623 }
624 })
625 }
626}
627
628impl<'a, V> FusedIterator for IterNoLock<'a, V> {}
629
630impl<'a, V> IntoIterator for &'a SyncVec<V> {
631 type Item = &'a V;
632 type IntoIter = IterNoLock<'a, V>;
633
634 fn into_iter(self) -> Self::IntoIter {
635 self.iter()
636 }
637}
638
639impl<'a, V> IntoIterator for &'a mut SyncVec<V> {
640 type Item = RwLockWriteGuard<'a, V>;
641 type IntoIter = IterMut<'a, V>;
642
643 fn into_iter(self) -> Self::IntoIter {
644 self.iter_mut()
645 }
646}
647
648impl<V> IntoIterator for SyncVec<V> {
649 type Item = V;
650 type IntoIter = IntoIter<V>;
651
652 fn into_iter(self) -> Self::IntoIter {
653 self.into_iter()
654 }
655}
656
657impl<V> Serialize for SyncVec<V>
658where
659 V: Serialize,
660{
661 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
662 where
663 S: Serializer,
664 {
665 use serde::ser::SerializeSeq;
666 let _lock = self.lock.read();
667 let v = unsafe { &*self.dirty.get() };
668 let mut seq = serializer.serialize_seq(Some(v.len()))?;
669 for element in v {
670 seq.serialize_element(&*element.read())?;
671 }
672 seq.end()
673 }
674}
675
676impl<'de, V> serde::Deserialize<'de> for SyncVec<V>
677where
678 V: serde::Deserialize<'de>,
679{
680 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
681 where
682 D: Deserializer<'de>,
683 {
684 let m = Vec::deserialize(deserializer)?;
685 Ok(Self::from(m))
686 }
687}
688
689impl<V> Debug for SyncVec<V>
690where
691 V: Debug,
692{
693 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
694 write!(f, "{:?}", self.dirty_ref())
695 }
696}
697
698impl<V: std::fmt::Display> std::fmt::Display for SyncVec<V> {
699 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
700 let _lock = self.lock.read();
701 let v = unsafe { &*self.dirty.get() };
702 write!(f, "[")?;
703 for (i, item) in v.iter().enumerate() {
704 if i > 0 {
705 write!(f, ", ")?;
706 }
707 write!(f, "{}", item.read())?;
708 }
709 write!(f, "]")
710 }
711}
712
713impl<V: PartialEq> PartialEq for SyncVec<V> {
714 fn eq(&self, other: &Self) -> bool {
715 let _lock1 = self.lock.read();
716 let _lock2 = other.lock.read();
717 let v1 = unsafe { &*self.dirty.get() };
718 let v2 = unsafe { &*other.dirty.get() };
719 if v1.len() != v2.len() {
720 return false;
721 }
722 for (i1, i2) in v1.iter().zip(v2.iter()) {
723 if *i1.read() != *i2.read() {
724 return false;
725 }
726 }
727 true
728 }
729}
730
731impl<V: Clone> Clone for SyncVec<V> {
732 fn clone(&self) -> Self {
733 let _lock = self.lock.read();
734 let v = unsafe { &*self.dirty.get() };
735 let mut new_vec = Vec::with_capacity(v.len());
736 for item in v {
737 new_vec.push(RwLock::new(item.read().clone()));
738 }
739 Self {
740 dirty: UnsafeCell::new(new_vec),
741 lock: RwLock::new(()),
742 }
743 }
744}
745
746impl<V> Index<usize> for SyncVec<V> {
747 type Output = V;
748
749 fn index(&self, index: usize) -> &Self::Output {
762 unsafe {
763 let v = &*self.dirty.get();
764 let lock_ptr = &v[index] as *const RwLock<V> as *mut RwLock<V>;
772 (*lock_ptr).get_mut()
773 }
774 }
775}
776
777impl<V> IndexMut<usize> for SyncVec<V> {
778 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
779 let v = self.dirty.get_mut();
782 v[index].get_mut()
783 }
784}
785
786#[macro_export]
787macro_rules! sync_vec {
788 () => (
789 $crate::SyncVec::new()
790 );
791 ($elem:expr; $n:expr) => (
792 $crate::SyncVec::with_vec(vec![$elem;$n])
793 );
794 ($($x:expr),+ $(,)?) => (
795 $crate::SyncVec::with_vec(vec![$($x),+,])
796 );
797}
798
799#[test]
800fn test_case() {
801 struct D {}
802 impl D {
803 fn is_some(&self) -> bool {
804 println!("is_some");
805 true
806 }
807 fn take(&mut self) -> Option<bool> {
808 println!("take");
809 Some(true)
810 }
811 }
812
813 let mut d = D {};
814 if let (true, Some(d)) = (d.is_some(), d.take()) {
815 println!("d is {d}");
816 }
817}
818
819#[cfg(test)]
820mod tests {
821 use super::*;
822 use std::sync::Arc;
823 use std::thread;
824
825 #[test]
826 fn test_new_and_capacity() {
827 let vec: SyncVec<i32> = SyncVec::new();
828 assert!(vec.is_empty());
829 assert_eq!(vec.len(), 0);
830
831 let vec: SyncVec<i32> = SyncVec::with_capacity(10);
832 assert!(vec.is_empty());
833 assert_eq!(vec.len(), 0);
834 }
835
836 #[test]
837 fn test_push_and_get() {
838 let vec = SyncVec::new();
839 vec.push(1);
840 vec.push(2);
841 vec.push(3);
842
843 assert_eq!(vec.len(), 3);
844 assert_eq!(*vec.get(0).unwrap(), 1);
845 assert_eq!(*vec.get(1).unwrap(), 2);
846 assert_eq!(*vec.get(2).unwrap(), 3);
847 assert!(vec.get(3).is_none());
848 }
849
850 #[test]
851 fn test_index_methods() {
852 let mut vec = SyncVec::new();
853 vec.push(10);
854 vec.push(20);
855
856 assert_eq!(vec[0], 10);
857 assert_eq!(vec[1], 20);
858
859 {
860 let val = &mut vec[0];
861 *val = 100;
862 }
863 assert_eq!(vec[0], 100);
864 }
865
866 #[test]
867 #[should_panic(expected = "index out of bounds")]
868 fn test_index_panic() {
869 let vec = SyncVec::new();
870 vec.push(1);
871 let _ = vec[1];
872 }
873
874 #[test]
875 #[should_panic(expected = "index out of bounds")]
876 fn test_index_mut_panic() {
877 let mut vec = SyncVec::new();
878 vec.push(1);
879 let _ = &mut vec[1];
880 }
881
882 #[test]
883 fn test_remove_and_pop() {
884 let vec = SyncVec::new();
885 vec.push(1);
886 vec.push(2);
887 vec.push(3);
888
889 assert_eq!(vec.pop(), Some(3));
890 assert_eq!(vec.len(), 2);
891
892 assert_eq!(vec.remove(0), Some(1));
893 assert_eq!(vec.len(), 1);
894 assert_eq!(*vec.get(0).unwrap(), 2);
895 }
896
897 #[test]
898 fn test_concurrency() {
899 let vec = Arc::new(SyncVec::new());
900 let mut handles = vec![];
901
902 for i in 0..10 {
904 let vec = vec.clone();
905 handles.push(thread::spawn(move || {
906 for j in 0..100 {
907 vec.push(i * 100 + j);
908 }
909 }));
910 }
911
912 for handle in handles {
913 handle.join().unwrap();
914 }
915
916 assert_eq!(vec.len(), 1000);
917 }
918
919 #[test]
920 fn test_concurrent_modify() {
921 let vec = Arc::new(SyncVec::new());
922 for i in 0..100 {
923 vec.push(i);
924 }
925
926 let vec_clone = vec.clone();
927 let handle = thread::spawn(move || {
928 for i in 0..100 {
929 if let Some(mut guard) = vec_clone.get_mut(i) {
930 *guard += 1;
931 }
932 }
933 });
934
935 for i in 0..100 {
937 if let Some(val) = vec.get(i) {
938 let _ = *val; }
940 }
941
942 handle.join().unwrap();
943
944 for i in 0..100 {
946 assert_eq!(*vec.get(i).unwrap(), i + 1);
947 }
948 }
949
950 #[test]
951 fn test_iter() {
952 let vec = SyncVec::new();
953 vec.push(1);
954 vec.push(2);
955 vec.push(3);
956
957 let mut sum = 0;
958 for item in vec.iter() {
959 sum += *item;
960 }
961 assert_eq!(sum, 6);
962 }
963
964 #[test]
965 fn test_iter_mut() {
966 let vec = SyncVec::new();
967 vec.push(1);
968 vec.push(2);
969 vec.push(3);
970
971 for mut item in vec.iter_mut() {
972 *item *= 2;
973 }
974
975 assert_eq!(*vec.get(0).unwrap(), 2);
976 assert_eq!(*vec.get(1).unwrap(), 4);
977 assert_eq!(*vec.get(2).unwrap(), 6);
978 }
979
980 #[test]
981 fn test_clear() {
982 let vec = SyncVec::new();
983 vec.push(1);
984 vec.clear();
985 assert!(vec.is_empty());
986 }
987
988 #[test]
989 fn test_contains() {
990 let vec = SyncVec::new();
991 vec.push(1);
992 vec.push(2);
993 assert!(vec.contains(&1));
994 assert!(!vec.contains(&3));
995 }
996
997 #[test]
998 fn test_iterator_traits() {
999 let vec = SyncVec::new();
1000 vec.push(1);
1001 vec.push(2);
1002 vec.push(3);
1003
1004 let mut iter = vec.iter();
1005 assert_eq!(iter.len(), 3);
1006 assert_eq!(*iter.next().unwrap(), 1);
1007 assert_eq!(iter.len(), 2);
1008 assert_eq!(*iter.next_back().unwrap(), 3);
1009 assert_eq!(iter.len(), 1);
1010 assert_eq!(*iter.next().unwrap(), 2);
1011 assert_eq!(iter.len(), 0);
1012 assert!(iter.next().is_none());
1013 assert!(iter.next_back().is_none());
1014
1015 let mut vec = SyncVec::new();
1016 vec.push(1);
1017 vec.push(2);
1018 vec.push(3);
1019 let mut iter_mut = vec.iter_mut();
1020 assert_eq!(iter_mut.len(), 3);
1021 assert_eq!(*iter_mut.next().unwrap(), 1);
1022 assert_eq!(iter_mut.len(), 2);
1023 assert_eq!(*iter_mut.next_back().unwrap(), 3);
1024 assert_eq!(iter_mut.len(), 1);
1025 assert_eq!(*iter_mut.next().unwrap(), 2);
1026 assert_eq!(iter_mut.len(), 0);
1027 assert!(iter_mut.next().is_none());
1028 assert!(iter_mut.next_back().is_none());
1029 }
1030
1031 #[test]
1032 fn test_from_iter_and_extend() {
1033 let vec: SyncVec<i32> = SyncVec::from_iter(vec![1, 2, 3]);
1034 assert_eq!(vec.len(), 3);
1035 assert_eq!(*vec.get(0).unwrap(), 1);
1036
1037 let mut vec = SyncVec::new();
1038 vec.extend(vec![1, 2, 3]);
1039 assert_eq!(vec.len(), 3);
1040 assert_eq!(*vec.get(0).unwrap(), 1);
1041 }
1042
1043 #[test]
1044 fn test_iter_notlock() {
1045 let vec = SyncVec::new();
1046 vec.push(1);
1047 vec.push(2);
1048 vec.push(3);
1049
1050 let mut sum = 0;
1052 for item in vec.iter() {
1053 sum += *item;
1054 }
1055 assert_eq!(sum, 6);
1056
1057 let iter = vec.iter();
1059 assert_eq!(iter.len(), 3);
1060 }
1061
1062 #[test]
1063 fn test_iter_double_ended() {
1064 let vec = SyncVec::new();
1065 vec.push(1);
1066 vec.push(2);
1067 vec.push(3);
1068
1069 let mut iter = vec.iter();
1070 assert_eq!(*iter.next().unwrap(), 1);
1071 assert_eq!(*iter.next_back().unwrap(), 3);
1072 assert_eq!(*iter.next().unwrap(), 2);
1073 assert!(iter.next().is_none());
1074 }
1075
1076 #[test]
1077 fn test_iter_empty() {
1078 let vec: SyncVec<i32> = SyncVec::new();
1079
1080 let mut count = 0;
1081 for _ in vec.iter() {
1082 count += 1;
1083 }
1084 assert_eq!(count, 0);
1085
1086 let iter = vec.iter();
1087 assert_eq!(iter.len(), 0);
1088 }
1089
1090 #[test]
1091 fn test_into_iter_ref() {
1092 let vec = SyncVec::new();
1093 vec.push(10);
1094 vec.push(20);
1095 vec.push(30);
1096
1097 let mut sum = 0;
1099 for item in &vec {
1100 sum += *item;
1101 }
1102 assert_eq!(sum, 60);
1103
1104 assert_eq!(vec.len(), 3);
1106 }
1107
1108 #[test]
1109 fn test_into_iter_mut() {
1110 let mut vec = SyncVec::new();
1111 vec.push(1);
1112 vec.push(2);
1113 vec.push(3);
1114
1115 for mut item in &mut vec {
1117 *item *= 2;
1118 }
1119
1120 assert_eq!(*vec.get(0).unwrap(), 2);
1121 assert_eq!(*vec.get(1).unwrap(), 4);
1122 assert_eq!(*vec.get(2).unwrap(), 6);
1123 }
1124
1125 #[test]
1126 fn test_into_iter_owned() {
1127 let vec = SyncVec::new();
1128 vec.push(1);
1129 vec.push(2);
1130 vec.push(3);
1131
1132 let collected: Vec<_> = vec.into_iter().collect();
1134 assert_eq!(collected, vec![1, 2, 3]);
1135 }
1136}