fast_able/
vec2.rs

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
11/// Synchronous vector supporting fine-grained lock control
12/// 同步向量类型,支持细粒度锁控制,更安全地访问数据
13/// 
14/// Locking strategy:
15/// - Read operations like `get`: Vec read lock + value read lock
16/// - Value modification operations like `get_mut`: Vec read lock + value write lock
17/// - Structure modification operations like `push`/`remove`: Vec write lock
18/// 锁策略:
19/// - get 等读取操作: Vec读锁 + 值的读锁
20/// - get_mut 等修改值操作: Vec读锁 + 值的写锁
21/// - push/remove 等修改结构操作: Vec写锁
22/// 
23/// This allows:
24/// - Multiple threads can read different values simultaneously
25/// - When one thread modifies a value, other threads can still read other values
26/// - Exclusive access when modifying the Vec structure
27/// 这样可以实现:
28/// - 多个线程可以同时读取不同的值
29/// - 一个线程修改某个值时,其他线程仍可读取其他值
30/// - 修改Vec结构时独占访问
31pub struct SyncVec<V> {
32    dirty: UnsafeCell<Vec<RwLock<V>>>,
33    lock: RwLock<()>,
34}
35
36/// This is safe, dirty mutex ensures safety
37/// 这是安全的,dirty 互斥锁保证了安全性
38unsafe impl<V> Send for SyncVec<V> {}
39
40/// This is safe, dirty mutex ensures safety
41/// 这是安全的,dirty 互斥锁保证了安全性
42unsafe 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    /// Get a reference to the value at index, protected by Vec read lock (value no lock)
190    /// 获取索引处的值引用,使用Vec读锁 (值无锁)
191    /// 
192    /// # Safety
193    /// 此方法绕过了保护值的 `RwLock`,仅当您确定没有其他线程正在修改该值时才应使用它。
194    /// This method bypasses the `RwLock` protecting the value.
195    /// It should only be used when you are sure that no other thread is modifying the value.
196    #[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            // SAFETY: 只有Vec结构锁保护,值无锁
202            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    /// Get a reference to the value at index, protected by Vec read lock + value read lock
216    /// 获取索引处的值引用,使用Vec读锁 + 值的读锁保护
217    #[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    /// Get a reference to the value at index (unchecked), protected by Vec read lock (value no lock)
233    /// 获取索引处的值引用(无检查),使用Vec读锁 (值无锁)
234    /// 
235    /// # Safety
236    /// 此方法绕过了保护值的 `RwLock`,仅当您确定没有其他线程正在修改该值时才应使用它。
237    /// This method bypasses the `RwLock` protecting the value.
238    /// It should only be used when you are sure that no other thread is modifying the value.
239    #[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        // SAFETY: 只有Vec结构锁保护,值无锁
245        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    /// Get a mutable reference to the value at index, protected by Vec read lock + value write lock
256    /// 获取索引处的可变值引用,使用Vec读锁 + 值的写锁保护
257    #[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    /// Safety; Get an iterator over the values, protected by Vec read lock + individual value read locks
288    /// 安全地访问每个数据,获取迭代器,使用Vec读锁 + 各个值的读锁保护
289    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    /// 不锁值,只锁Vec结构,适用于只读但不修改值的场景
299    /// 
300    /// # Safety
301    /// 此方法是不安全的,因为它绕过了保护每个值的 `RwLock`。
302    /// 仅当您确定没有其他线程正在修改这些值时才应使用它。
303    /// 
304    /// This method is unsafe because it bypasses the `RwLock` protecting each value.
305    /// It should only be used when you are sure that no other thread is modifying the values.
306    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    /// Get a mutable iterator over the values, protected by Vec read lock + individual value write locks
316    /// 获取可变迭代器,使用Vec读锁 + 各个值的写锁保护
317    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
365/// Read guard without value lock, only Vec structure lock
366/// 无值锁的读守护者,只有Vec结构锁
367pub 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
589/// 不锁值的迭代器,只锁Vec结构
590/// Iterator that only locks Vec structure, not individual values
591pub 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            // SAFETY: 调用者通过使用 unsafe fn iter 保证没有并发写入
602            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            // SAFETY: 调用者通过使用 unsafe fn iter 保证没有并发写入
620            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    /// Get a reference to the value at index, bypassing the lock.
750    /// 获取索引处的值引用,绕过锁。
751    /// 
752    /// # Safety
753    /// This method is unsafe because it bypasses the `RwLock` protecting the value.
754    /// It should only be used when you are sure that no other thread is modifying the value.
755    /// Concurrent access using this method is undefined behavior.
756    /// 
757    /// # 安全性
758    /// 此方法是不安全的,因为它绕过了保护值的 `RwLock`。
759    /// 仅当您确定没有其他线程正在修改该值时才应使用它。
760    /// 使用此方法进行并发访问是未定义行为。
761    fn index(&self, index: usize) -> &Self::Output {
762        unsafe {
763            let v = &*self.dirty.get();
764            // We need to get &V from &RwLock<V> without locking.
765            // Since we are in an unsafe block and claiming it's unsafe/no concurrent access,
766            // we can cast the &RwLock<V> to &mut RwLock<V> (conceptually) to use get_mut(),
767            // or rely on the fact that we are bypassing the lock.
768            // However, RwLock::get_mut requires &mut RwLock.
769            // We only have &RwLock.
770            // We can cast &RwLock to &mut RwLock because we are asserting exclusive access (via the safety contract).
771            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        // This is unsafe because we are bypassing the `RwLock` protecting the value.
780        // 这是不安全的,因为我们绕过了保护值的 `RwLock`。
781        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        // Multiple writers
903        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        // Concurrent read
936        for i in 0..100 {
937            if let Some(val) = vec.get(i) {
938                let _ = *val; // Just read
939            }
940        }
941
942        handle.join().unwrap();
943
944        // Verify modifications
945        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        // 测试 iter 基本功能
1051        let mut sum = 0;
1052        for item in vec.iter() {
1053            sum += *item;
1054        }
1055        assert_eq!(sum, 6);
1056
1057        // 测试 ExactSizeIterator
1058        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        // 测试 IntoIterator for &SyncVec
1098        let mut sum = 0;
1099        for item in &vec {
1100            sum += *item;
1101        }
1102        assert_eq!(sum, 60);
1103
1104        // 确保 vec 仍然可用
1105        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        // 测试 IntoIterator for &mut SyncVec
1116        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        // 测试 IntoIterator for SyncVec (消耗所有权)
1133        let collected: Vec<_> = vec.into_iter().collect();
1134        assert_eq!(collected, vec![1, 2, 3]);
1135    }
1136}