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(&self) -> Iter<'_, V> {
253 let _lock = self.lock.read();
254 let u = self.as_arr();
255 Iter {
256 _lock,
257 inner: u.iter(),
258 }
259 }
260
261 pub fn iter_mut(&self) -> IterMut<'_, V> {
262 let _lock = self.lock.read();
263 let u = self.as_arr();
264 IterMut {
265 _lock,
266 inner: u.iter(),
267 }
268 }
269
270 pub fn into_iter(self) -> IntoIter<V> {
271 let _lock = self.lock.write();
272 let m = self.dirty.into_inner();
273 let mut v = Vec::with_capacity(m.len());
274 for item in m {
275 v.push(item.into_inner());
276 }
277 v.into_iter()
278 }
279
280 pub fn dirty_ref(&self) -> ReadGuardVec<'_, V> {
281 ReadGuardVec {
282 _lock: self.lock.read(),
283 v: self.as_arr(),
284 }
285 }
286
287 pub fn into_inner(self) -> Vec<V> {
288 let m = self.dirty.into_inner();
289 let mut v = Vec::with_capacity(m.len());
290 for item in m {
291 v.push(item.into_inner());
292 }
293 v
294 }
295
296 pub fn to_vec(&self) -> Vec<V>
297 where V: Clone
298 {
299 let _lock = self.lock.read();
300 let u = self.as_arr();
301 let mut v = Vec::with_capacity(u.len());
302 for item in u {
303 v.push(item.read().clone());
304 }
305 v
306 }
307}
308
309pub struct ReadGuard<'a, V> {
310 _vec_lock: RwLockReadGuard<'a, ()>,
311 _value_lock: RwLockReadGuard<'a, V>,
312}
313
314impl<'a, V> Deref for ReadGuard<'a, V> {
315 type Target = V;
316 fn deref(&self) -> &Self::Target {
317 &*self._value_lock
318 }
319}
320
321impl<'a, V> Debug for ReadGuard<'_, V>
322where
323 V: Debug,
324{
325 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
326 write!(f, "{:?}", &*self._value_lock)
327 }
328}
329
330impl<'a, V> PartialEq for ReadGuard<'a, V>
331where
332 V: PartialEq,
333{
334 fn eq(&self, other: &Self) -> bool {
335 (*self._value_lock).eq(&*other._value_lock)
336 }
337}
338
339impl<'a, V> Eq for ReadGuard<'a, V> where V: Eq {}
340
341impl<'a, V> std::fmt::Display for ReadGuard<'_, V>
342where
343 V: std::fmt::Display,
344{
345 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
346 (*self._value_lock).fmt(f)
347 }
348}
349
350impl<'a, V> AsRef<V> for ReadGuard<'a, V> {
351 fn as_ref(&self) -> &V {
352 &*self._value_lock
353 }
354}
355
356pub struct ReadGuardVec<'a, V> {
357 _lock: RwLockReadGuard<'a, ()>,
358 v: &'a Vec<RwLock<V>>,
359}
360
361impl<'a, V> Deref for ReadGuardVec<'a, V> {
362 type Target = Vec<RwLock<V>>;
363 fn deref(&self) -> &Self::Target {
364 self.v
365 }
366}
367
368impl<'a, V> AsRef<Vec<RwLock<V>>> for ReadGuardVec<'a, V> {
369 fn as_ref(&self) -> &Vec<RwLock<V>> {
370 self.v
371 }
372}
373
374impl<'a, V> Debug for ReadGuardVec<'_, V>
375where
376 V: Debug,
377{
378 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
379 f.debug_list().entries(self.v.iter().map(|x| x.read())).finish()
380 }
381}
382
383pub struct WriteGuard<'a, V> {
384 _vec_lock: RwLockReadGuard<'a, ()>,
385 _value_lock: RwLockWriteGuard<'a, V>,
386}
387
388impl<'a, V> AsRef<V> for WriteGuard<'a, V> {
389 fn as_ref(&self) -> &V {
390 &*self._value_lock
391 }
392}
393
394impl<'a, V> AsMut<V> for WriteGuard<'a, V> {
395 fn as_mut(&mut self) -> &mut V {
396 &mut *self._value_lock
397 }
398}
399
400impl<'a, V> Deref for WriteGuard<'_, V> {
401 type Target = V;
402
403 fn deref(&self) -> &Self::Target {
404 &*self._value_lock
405 }
406}
407
408impl<'a, V> DerefMut for WriteGuard<'_, V> {
409 fn deref_mut(&mut self) -> &mut Self::Target {
410 &mut *self._value_lock
411 }
412}
413
414impl<'a, V> Debug for WriteGuard<'_, V>
415where
416 V: Debug,
417{
418 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
419 write!(f, "{:?}", &*self._value_lock)
420 }
421}
422
423impl<'a, V> std::fmt::Display for WriteGuard<'_, V>
424where V: std::fmt::Display
425{
426 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
427 (*self._value_lock).fmt(f)
428 }
429}
430
431pub struct Iter<'a, V> {
432 _lock: RwLockReadGuard<'a, ()>,
433 inner: SliceIter<'a, RwLock<V>>,
434}
435
436impl<'a, V> Iterator for Iter<'a, V> {
437 type Item = RwLockReadGuard<'a, V>;
438 fn next(&mut self) -> Option<Self::Item> {
439 self.inner.next().map(|v| v.read())
440 }
441}
442
443impl<'a, V> ExactSizeIterator for Iter<'a, V> {
444 fn len(&self) -> usize {
445 self.inner.len()
446 }
447}
448
449impl<'a, V> DoubleEndedIterator for Iter<'a, V> {
450 fn next_back(&mut self) -> Option<Self::Item> {
451 self.inner.next_back().map(|v| v.read())
452 }
453}
454
455impl<'a, V> FusedIterator for Iter<'a, V> {}
456
457pub struct IterMut<'a, V> {
458 _lock: RwLockReadGuard<'a, ()>,
459 inner: SliceIter<'a, RwLock<V>>,
460}
461
462impl<'a, V> Iterator for IterMut<'a, V> {
463 type Item = RwLockWriteGuard<'a, V>;
464
465 fn next(&mut self) -> Option<Self::Item> {
466 self.inner.next().map(|v| v.write())
467 }
468}
469
470impl<'a, V> ExactSizeIterator for IterMut<'a, V> {
471 fn len(&self) -> usize {
472 self.inner.len()
473 }
474}
475
476impl<'a, V> DoubleEndedIterator for IterMut<'a, V> {
477 fn next_back(&mut self) -> Option<Self::Item> {
478 self.inner.next_back().map(|v| v.write())
479 }
480}
481
482impl<'a, V> FusedIterator for IterMut<'a, V> {}
483
484impl<'a, V> IntoIterator for &'a SyncVec<V> {
485 type Item = RwLockReadGuard<'a, V>;
486 type IntoIter = Iter<'a, V>;
487
488 fn into_iter(self) -> Self::IntoIter {
489 self.iter()
490 }
491}
492
493impl<V> IntoIterator for SyncVec<V> {
494 type Item = V;
495 type IntoIter = IntoIter<V>;
496
497 fn into_iter(self) -> Self::IntoIter {
498 self.into_iter()
499 }
500}
501
502impl<V> Serialize for SyncVec<V>
503where
504 V: Serialize,
505{
506 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
507 where
508 S: Serializer,
509 {
510 use serde::ser::SerializeSeq;
511 let _lock = self.lock.read();
512 let v = unsafe { &*self.dirty.get() };
513 let mut seq = serializer.serialize_seq(Some(v.len()))?;
514 for element in v {
515 seq.serialize_element(&*element.read())?;
516 }
517 seq.end()
518 }
519}
520
521impl<'de, V> serde::Deserialize<'de> for SyncVec<V>
522where
523 V: serde::Deserialize<'de>,
524{
525 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
526 where
527 D: Deserializer<'de>,
528 {
529 let m = Vec::deserialize(deserializer)?;
530 Ok(Self::from(m))
531 }
532}
533
534impl<V> Debug for SyncVec<V>
535where
536 V: Debug,
537{
538 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
539 write!(f, "{:?}", self.dirty_ref())
540 }
541}
542
543impl<V: std::fmt::Display> std::fmt::Display for SyncVec<V> {
544 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
545 let _lock = self.lock.read();
546 let v = unsafe { &*self.dirty.get() };
547 write!(f, "[")?;
548 for (i, item) in v.iter().enumerate() {
549 if i > 0 {
550 write!(f, ", ")?;
551 }
552 write!(f, "{}", item.read())?;
553 }
554 write!(f, "]")
555 }
556}
557
558impl<V: PartialEq> PartialEq for SyncVec<V> {
559 fn eq(&self, other: &Self) -> bool {
560 let _lock1 = self.lock.read();
561 let _lock2 = other.lock.read();
562 let v1 = unsafe { &*self.dirty.get() };
563 let v2 = unsafe { &*other.dirty.get() };
564 if v1.len() != v2.len() {
565 return false;
566 }
567 for (i1, i2) in v1.iter().zip(v2.iter()) {
568 if *i1.read() != *i2.read() {
569 return false;
570 }
571 }
572 true
573 }
574}
575
576impl<V: Clone> Clone for SyncVec<V> {
577 fn clone(&self) -> Self {
578 let _lock = self.lock.read();
579 let v = unsafe { &*self.dirty.get() };
580 let mut new_vec = Vec::with_capacity(v.len());
581 for item in v {
582 new_vec.push(RwLock::new(item.read().clone()));
583 }
584 Self {
585 dirty: UnsafeCell::new(new_vec),
586 lock: RwLock::new(()),
587 }
588 }
589}
590
591impl<V> Index<usize> for SyncVec<V> {
592 type Output = V;
593
594 fn index(&self, index: usize) -> &Self::Output {
607 unsafe {
608 let v = &*self.dirty.get();
609 let lock_ptr = &v[index] as *const RwLock<V> as *mut RwLock<V>;
617 (*lock_ptr).get_mut()
618 }
619 }
620}
621
622impl<V> IndexMut<usize> for SyncVec<V> {
623 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
624 let v = self.dirty.get_mut();
627 v[index].get_mut()
628 }
629}
630
631#[macro_export]
632macro_rules! sync_vec {
633 () => (
634 $crate::SyncVec::new()
635 );
636 ($elem:expr; $n:expr) => (
637 $crate::SyncVec::with_vec(vec![$elem;$n])
638 );
639 ($($x:expr),+ $(,)?) => (
640 $crate::SyncVec::with_vec(vec![$($x),+,])
641 );
642}
643
644#[test]
645fn test_case() {
646 struct D {}
647 impl D {
648 fn is_some(&self) -> bool {
649 println!("is_some");
650 true
651 }
652 fn take(&mut self) -> Option<bool> {
653 println!("take");
654 Some(true)
655 }
656 }
657
658 let mut d = D {};
659 if let (true, Some(d)) = (d.is_some(), d.take()) {
660 println!("d is {d}");
661 }
662}
663
664#[cfg(test)]
665mod tests {
666 use super::*;
667 use std::sync::Arc;
668 use std::thread;
669
670 #[test]
671 fn test_new_and_capacity() {
672 let vec: SyncVec<i32> = SyncVec::new();
673 assert!(vec.is_empty());
674 assert_eq!(vec.len(), 0);
675
676 let vec: SyncVec<i32> = SyncVec::with_capacity(10);
677 assert!(vec.is_empty());
678 assert_eq!(vec.len(), 0);
679 }
680
681 #[test]
682 fn test_push_and_get() {
683 let vec = SyncVec::new();
684 vec.push(1);
685 vec.push(2);
686 vec.push(3);
687
688 assert_eq!(vec.len(), 3);
689 assert_eq!(*vec.get(0).unwrap(), 1);
690 assert_eq!(*vec.get(1).unwrap(), 2);
691 assert_eq!(*vec.get(2).unwrap(), 3);
692 assert!(vec.get(3).is_none());
693 }
694
695 #[test]
696 fn test_index_methods() {
697 let mut vec = SyncVec::new();
698 vec.push(10);
699 vec.push(20);
700
701 assert_eq!(vec[0], 10);
702 assert_eq!(vec[1], 20);
703
704 {
705 let val = &mut vec[0];
706 *val = 100;
707 }
708 assert_eq!(vec[0], 100);
709 }
710
711 #[test]
712 #[should_panic(expected = "index out of bounds")]
713 fn test_index_panic() {
714 let vec = SyncVec::new();
715 vec.push(1);
716 let _ = vec[1];
717 }
718
719 #[test]
720 #[should_panic(expected = "index out of bounds")]
721 fn test_index_mut_panic() {
722 let mut vec = SyncVec::new();
723 vec.push(1);
724 let _ = &mut vec[1];
725 }
726
727 #[test]
728 fn test_remove_and_pop() {
729 let vec = SyncVec::new();
730 vec.push(1);
731 vec.push(2);
732 vec.push(3);
733
734 assert_eq!(vec.pop(), Some(3));
735 assert_eq!(vec.len(), 2);
736
737 assert_eq!(vec.remove(0), Some(1));
738 assert_eq!(vec.len(), 1);
739 assert_eq!(*vec.get(0).unwrap(), 2);
740 }
741
742 #[test]
743 fn test_concurrency() {
744 let vec = Arc::new(SyncVec::new());
745 let mut handles = vec![];
746
747 for i in 0..10 {
749 let vec = vec.clone();
750 handles.push(thread::spawn(move || {
751 for j in 0..100 {
752 vec.push(i * 100 + j);
753 }
754 }));
755 }
756
757 for handle in handles {
758 handle.join().unwrap();
759 }
760
761 assert_eq!(vec.len(), 1000);
762 }
763
764 #[test]
765 fn test_concurrent_modify() {
766 let vec = Arc::new(SyncVec::new());
767 for i in 0..100 {
768 vec.push(i);
769 }
770
771 let vec_clone = vec.clone();
772 let handle = thread::spawn(move || {
773 for i in 0..100 {
774 if let Some(mut guard) = vec_clone.get_mut(i) {
775 *guard += 1;
776 }
777 }
778 });
779
780 for i in 0..100 {
782 if let Some(val) = vec.get(i) {
783 let _ = *val; }
785 }
786
787 handle.join().unwrap();
788
789 for i in 0..100 {
791 assert_eq!(*vec.get(i).unwrap(), i + 1);
792 }
793 }
794
795 #[test]
796 fn test_iter() {
797 let vec = SyncVec::new();
798 vec.push(1);
799 vec.push(2);
800 vec.push(3);
801
802 let mut sum = 0;
803 for item in vec.iter() {
804 sum += *item;
805 }
806 assert_eq!(sum, 6);
807 }
808
809 #[test]
810 fn test_iter_mut() {
811 let vec = SyncVec::new();
812 vec.push(1);
813 vec.push(2);
814 vec.push(3);
815
816 for mut item in vec.iter_mut() {
817 *item *= 2;
818 }
819
820 assert_eq!(*vec.get(0).unwrap(), 2);
821 assert_eq!(*vec.get(1).unwrap(), 4);
822 assert_eq!(*vec.get(2).unwrap(), 6);
823 }
824
825 #[test]
826 fn test_clear() {
827 let vec = SyncVec::new();
828 vec.push(1);
829 vec.clear();
830 assert!(vec.is_empty());
831 }
832
833 #[test]
834 fn test_contains() {
835 let vec = SyncVec::new();
836 vec.push(1);
837 vec.push(2);
838 assert!(vec.contains(&1));
839 assert!(!vec.contains(&3));
840 }
841
842 #[test]
843 fn test_iterator_traits() {
844 let vec = SyncVec::new();
845 vec.push(1);
846 vec.push(2);
847 vec.push(3);
848
849 let mut iter = vec.iter();
850 assert_eq!(iter.len(), 3);
851 assert_eq!(*iter.next().unwrap(), 1);
852 assert_eq!(iter.len(), 2);
853 assert_eq!(*iter.next_back().unwrap(), 3);
854 assert_eq!(iter.len(), 1);
855 assert_eq!(*iter.next().unwrap(), 2);
856 assert_eq!(iter.len(), 0);
857 assert!(iter.next().is_none());
858 assert!(iter.next_back().is_none());
859
860 let mut vec = SyncVec::new();
861 vec.push(1);
862 vec.push(2);
863 vec.push(3);
864 let mut iter_mut = vec.iter_mut();
865 assert_eq!(iter_mut.len(), 3);
866 assert_eq!(*iter_mut.next().unwrap(), 1);
867 assert_eq!(iter_mut.len(), 2);
868 assert_eq!(*iter_mut.next_back().unwrap(), 3);
869 assert_eq!(iter_mut.len(), 1);
870 assert_eq!(*iter_mut.next().unwrap(), 2);
871 assert_eq!(iter_mut.len(), 0);
872 assert!(iter_mut.next().is_none());
873 assert!(iter_mut.next_back().is_none());
874 }
875
876 #[test]
877 fn test_from_iter_and_extend() {
878 let vec: SyncVec<i32> = SyncVec::from_iter(vec![1, 2, 3]);
879 assert_eq!(vec.len(), 3);
880 assert_eq!(*vec.get(0).unwrap(), 1);
881
882 let mut vec = SyncVec::new();
883 vec.extend(vec![1, 2, 3]);
884 assert_eq!(vec.len(), 3);
885 assert_eq!(*vec.get(0).unwrap(), 1);
886 }
887}