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 read lock
190    /// 获取索引处的值引用,使用Vec读锁 + 值的读锁保护
191    #[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    /// Get a reference to the value at index (unchecked), protected by Vec read lock + value read lock
207    /// 获取索引处的值引用(无检查),使用Vec读锁 + 值的读锁保护
208    #[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    /// Get a mutable reference to the value at index, protected by Vec read lock + value write lock
221    /// 获取索引处的可变值引用,使用Vec读锁 + 值的写锁保护
222    #[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    /// Safety; Get an iterator over the values, protected by Vec read lock + individual value read locks
253    /// 安全地访问每个数据,获取迭代器,使用Vec读锁 + 各个值的读锁保护
254    pub fn iter_rlock(&self) -> IterRLock<'_, V> {
255        let _lock = self.lock.read();
256        let u = self.as_arr();
257        IterRLock {
258            _lock,
259            inner: u.iter(),
260        }
261    }
262
263    /// 不锁值,只锁Vec结构,适用于只读但不修改值的场景
264    /// 
265    /// # Safety
266    /// 此方法是不安全的,因为它绕过了保护每个值的 `RwLock`。
267    /// 仅当您确定没有其他线程正在修改这些值时才应使用它。
268    /// 
269    /// This method is unsafe because it bypasses the `RwLock` protecting each value.
270    /// It should only be used when you are sure that no other thread is modifying the values.
271    pub fn iter(&self) -> IterNoLock<'_, V> {
272        let _lock = self.lock.read();
273        let u = self.as_arr();
274        IterNoLock {
275            _lock,
276            inner: u.iter(),
277        }
278    }
279
280    /// Get a mutable iterator over the values, protected by Vec read lock + individual value write locks
281    /// 获取可变迭代器,使用Vec读锁 + 各个值的写锁保护
282    pub fn iter_mut(&self) -> IterMut<'_, V> {
283        let _lock = self.lock.read();
284        let u = self.as_arr();
285        IterMut {
286            _lock,
287            inner: u.iter(),
288        }
289    }
290
291    pub fn into_iter(self) -> IntoIter<V> {
292        let _lock = self.lock.write();
293        let m = self.dirty.into_inner();
294        let mut v = Vec::with_capacity(m.len());
295        for item in m {
296            v.push(item.into_inner());
297        }
298        v.into_iter()
299    }
300
301    pub fn dirty_ref(&self) -> ReadGuardVec<'_, V> {
302        ReadGuardVec {
303            _lock: self.lock.read(),
304            v: self.as_arr(),
305        }
306    }
307
308    pub fn into_inner(self) -> Vec<V> {
309        let m = self.dirty.into_inner();
310        let mut v = Vec::with_capacity(m.len());
311        for item in m {
312            v.push(item.into_inner());
313        }
314        v
315    }
316    
317    pub fn to_vec(&self) -> Vec<V> 
318    where V: Clone
319    {
320        let _lock = self.lock.read();
321        let u = self.as_arr();
322        let mut v = Vec::with_capacity(u.len());
323        for item in u {
324            v.push(item.read().clone());
325        }
326        v
327    }
328}
329
330pub struct ReadGuard<'a, V> {
331    _vec_lock: RwLockReadGuard<'a, ()>,
332    _value_lock: RwLockReadGuard<'a, V>,
333}
334
335impl<'a, V> Deref for ReadGuard<'a, V> {
336    type Target = V;
337    fn deref(&self) -> &Self::Target {
338        &*self._value_lock
339    }
340}
341
342impl<'a, V> Debug for ReadGuard<'_, V>
343where
344    V: Debug,
345{
346    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
347        write!(f, "{:?}", &*self._value_lock)
348    }
349}
350
351impl<'a, V> PartialEq for ReadGuard<'a, V>
352where
353    V: PartialEq,
354{
355    fn eq(&self, other: &Self) -> bool {
356        (*self._value_lock).eq(&*other._value_lock)
357    }
358}
359
360impl<'a, V> Eq for ReadGuard<'a, V> where V: Eq {}
361
362impl<'a, V> std::fmt::Display for ReadGuard<'_, V>
363where
364    V: std::fmt::Display,
365{
366    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
367        (*self._value_lock).fmt(f)
368    }
369}
370
371impl<'a, V> AsRef<V> for ReadGuard<'a, V> {
372    fn as_ref(&self) -> &V {
373        &*self._value_lock
374    }
375}
376
377pub struct ReadGuardVec<'a, V> {
378    _lock: RwLockReadGuard<'a, ()>,
379    v: &'a Vec<RwLock<V>>,
380}
381
382impl<'a, V> Deref for ReadGuardVec<'a, V> {
383    type Target = Vec<RwLock<V>>;
384    fn deref(&self) -> &Self::Target {
385        self.v
386    }
387}
388
389impl<'a, V> AsRef<Vec<RwLock<V>>> for ReadGuardVec<'a, V> {
390    fn as_ref(&self) -> &Vec<RwLock<V>> {
391        self.v
392    }
393}
394
395impl<'a, V> Debug for ReadGuardVec<'_, V>
396where
397    V: Debug,
398{
399    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
400        f.debug_list().entries(self.v.iter().map(|x| x.read())).finish()
401    }
402}
403
404pub struct WriteGuard<'a, V> {
405    _vec_lock: RwLockReadGuard<'a, ()>,
406    _value_lock: RwLockWriteGuard<'a, V>,
407}
408
409impl<'a, V> AsRef<V> for WriteGuard<'a, V> {
410    fn as_ref(&self) -> &V {
411        &*self._value_lock
412    }
413}
414
415impl<'a, V> AsMut<V> for WriteGuard<'a, V> {
416    fn as_mut(&mut self) -> &mut V {
417        &mut *self._value_lock
418    }
419}
420
421impl<'a, V> Deref for WriteGuard<'_, V> {
422    type Target = V;
423
424    fn deref(&self) -> &Self::Target {
425        &*self._value_lock
426    }
427}
428
429impl<'a, V> DerefMut for WriteGuard<'_, V> {
430    fn deref_mut(&mut self) -> &mut Self::Target {
431        &mut *self._value_lock
432    }
433}
434
435impl<'a, V> Debug for WriteGuard<'_, V>
436where
437    V: Debug,
438{
439    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
440        write!(f, "{:?}", &*self._value_lock)
441    }
442}
443
444impl<'a, V> std::fmt::Display for WriteGuard<'_, V> 
445where V: std::fmt::Display
446{
447    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
448        (*self._value_lock).fmt(f)
449    }
450}
451
452pub struct IterRLock<'a, V> {
453    _lock: RwLockReadGuard<'a, ()>,
454    inner: SliceIter<'a, RwLock<V>>,
455}
456
457impl<'a, V> Iterator for IterRLock<'a, V> {
458    type Item = RwLockReadGuard<'a, V>;
459    fn next(&mut self) -> Option<Self::Item> {
460        self.inner.next().map(|v| v.read())
461    }
462}
463
464impl<'a, V> ExactSizeIterator for IterRLock<'a, V> {
465    fn len(&self) -> usize {
466        self.inner.len()
467    }
468}
469
470impl<'a, V> DoubleEndedIterator for IterRLock<'a, V> {
471    fn next_back(&mut self) -> Option<Self::Item> {
472        self.inner.next_back().map(|v| v.read())
473    }
474}
475
476impl<'a, V> FusedIterator for IterRLock<'a, V> {}
477
478pub struct IterMut<'a, V> {
479    _lock: RwLockReadGuard<'a, ()>,
480    inner: SliceIter<'a, RwLock<V>>,
481}
482
483impl<'a, V> Iterator for IterMut<'a, V> {
484    type Item = RwLockWriteGuard<'a, V>;
485
486    fn next(&mut self) -> Option<Self::Item> {
487        self.inner.next().map(|v| v.write())
488    }
489}
490
491impl<'a, V> ExactSizeIterator for IterMut<'a, V> {
492    fn len(&self) -> usize {
493        self.inner.len()
494    }
495}
496
497impl<'a, V> DoubleEndedIterator for IterMut<'a, V> {
498    fn next_back(&mut self) -> Option<Self::Item> {
499        self.inner.next_back().map(|v| v.write())
500    }
501}
502
503impl<'a, V> FusedIterator for IterMut<'a, V> {}
504
505/// 不锁值的迭代器,只锁Vec结构
506/// Iterator that only locks Vec structure, not individual values
507pub struct IterNoLock<'a, V> {
508    _lock: RwLockReadGuard<'a, ()>,
509    inner: SliceIter<'a, RwLock<V>>,
510}
511
512impl<'a, V> Iterator for IterNoLock<'a, V> {
513    type Item = &'a V;
514
515    fn next(&mut self) -> Option<Self::Item> {
516        self.inner.next().map(|v| {
517            // SAFETY: 调用者通过使用 unsafe fn iter 保证没有并发写入
518            unsafe {
519                let lock_ptr = v as *const RwLock<V> as *mut RwLock<V>;
520                &*(*lock_ptr).get_mut()
521            }
522        })
523    }
524}
525
526impl<'a, V> ExactSizeIterator for IterNoLock<'a, V> {
527    fn len(&self) -> usize {
528        self.inner.len()
529    }
530}
531
532impl<'a, V> DoubleEndedIterator for IterNoLock<'a, V> {
533    fn next_back(&mut self) -> Option<Self::Item> {
534        self.inner.next_back().map(|v| {
535            // SAFETY: 调用者通过使用 unsafe fn iter 保证没有并发写入
536            unsafe {
537                let lock_ptr = v as *const RwLock<V> as *mut RwLock<V>;
538                &*(*lock_ptr).get_mut()
539            }
540        })
541    }
542}
543
544impl<'a, V> FusedIterator for IterNoLock<'a, V> {}
545
546impl<'a, V> IntoIterator for &'a SyncVec<V> {
547    type Item = &'a V;
548    type IntoIter = IterNoLock<'a, V>;
549
550    fn into_iter(self) -> Self::IntoIter {
551        self.iter()
552    }
553}
554
555impl<'a, V> IntoIterator for &'a mut SyncVec<V> {
556    type Item = RwLockWriteGuard<'a, V>;
557    type IntoIter = IterMut<'a, V>;
558
559    fn into_iter(self) -> Self::IntoIter {
560        self.iter_mut()
561    }
562}
563
564impl<V> IntoIterator for SyncVec<V> {
565    type Item = V;
566    type IntoIter = IntoIter<V>;
567
568    fn into_iter(self) -> Self::IntoIter {
569        self.into_iter()
570    }
571}
572
573impl<V> Serialize for SyncVec<V>
574where
575    V: Serialize,
576{
577    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
578    where
579        S: Serializer,
580    {
581        use serde::ser::SerializeSeq;
582        let _lock = self.lock.read();
583        let v = unsafe { &*self.dirty.get() };
584        let mut seq = serializer.serialize_seq(Some(v.len()))?;
585        for element in v {
586            seq.serialize_element(&*element.read())?;
587        }
588        seq.end()
589    }
590}
591
592impl<'de, V> serde::Deserialize<'de> for SyncVec<V>
593where
594    V: serde::Deserialize<'de>,
595{
596    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
597    where
598        D: Deserializer<'de>,
599    {
600        let m = Vec::deserialize(deserializer)?;
601        Ok(Self::from(m))
602    }
603}
604
605impl<V> Debug for SyncVec<V>
606where
607    V: Debug,
608{
609    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
610        write!(f, "{:?}", self.dirty_ref())
611    }
612}
613
614impl<V: std::fmt::Display> std::fmt::Display for SyncVec<V> {
615    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
616        let _lock = self.lock.read();
617        let v = unsafe { &*self.dirty.get() };
618        write!(f, "[")?;
619        for (i, item) in v.iter().enumerate() {
620            if i > 0 {
621                write!(f, ", ")?;
622            }
623            write!(f, "{}", item.read())?;
624        }
625        write!(f, "]")
626    }
627}
628
629impl<V: PartialEq> PartialEq for SyncVec<V> {
630    fn eq(&self, other: &Self) -> bool {
631        let _lock1 = self.lock.read();
632        let _lock2 = other.lock.read();
633        let v1 = unsafe { &*self.dirty.get() };
634        let v2 = unsafe { &*other.dirty.get() };
635        if v1.len() != v2.len() {
636            return false;
637        }
638        for (i1, i2) in v1.iter().zip(v2.iter()) {
639            if *i1.read() != *i2.read() {
640                return false;
641            }
642        }
643        true
644    }
645}
646
647impl<V: Clone> Clone for SyncVec<V> {
648    fn clone(&self) -> Self {
649        let _lock = self.lock.read();
650        let v = unsafe { &*self.dirty.get() };
651        let mut new_vec = Vec::with_capacity(v.len());
652        for item in v {
653            new_vec.push(RwLock::new(item.read().clone()));
654        }
655        Self {
656            dirty: UnsafeCell::new(new_vec),
657            lock: RwLock::new(()),
658        }
659    }
660}
661
662impl<V> Index<usize> for SyncVec<V> {
663    type Output = V;
664
665    /// Get a reference to the value at index, bypassing the lock.
666    /// 获取索引处的值引用,绕过锁。
667    /// 
668    /// # Safety
669    /// This method is unsafe because it bypasses the `RwLock` protecting the value.
670    /// It should only be used when you are sure that no other thread is modifying the value.
671    /// Concurrent access using this method is undefined behavior.
672    /// 
673    /// # 安全性
674    /// 此方法是不安全的,因为它绕过了保护值的 `RwLock`。
675    /// 仅当您确定没有其他线程正在修改该值时才应使用它。
676    /// 使用此方法进行并发访问是未定义行为。
677    fn index(&self, index: usize) -> &Self::Output {
678        unsafe {
679            let v = &*self.dirty.get();
680            // We need to get &V from &RwLock<V> without locking.
681            // Since we are in an unsafe block and claiming it's unsafe/no concurrent access,
682            // we can cast the &RwLock<V> to &mut RwLock<V> (conceptually) to use get_mut(),
683            // or rely on the fact that we are bypassing the lock.
684            // However, RwLock::get_mut requires &mut RwLock.
685            // We only have &RwLock.
686            // We can cast &RwLock to &mut RwLock because we are asserting exclusive access (via the safety contract).
687            let lock_ptr = &v[index] as *const RwLock<V> as *mut RwLock<V>;
688            (*lock_ptr).get_mut()
689        }
690    }
691}
692
693impl<V> IndexMut<usize> for SyncVec<V> {
694    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
695        // This is unsafe because we are bypassing the `RwLock` protecting the value.
696        // 这是不安全的,因为我们绕过了保护值的 `RwLock`。
697        let v = self.dirty.get_mut();
698        v[index].get_mut()
699    }
700}
701
702#[macro_export]
703macro_rules! sync_vec {
704    () => (
705        $crate::SyncVec::new()
706    );
707    ($elem:expr; $n:expr) => (
708        $crate::SyncVec::with_vec(vec![$elem;$n])
709    );
710    ($($x:expr),+ $(,)?) => (
711        $crate::SyncVec::with_vec(vec![$($x),+,])
712    );
713}
714
715#[test]
716fn test_case() {
717    struct D {}
718    impl D {
719        fn is_some(&self) -> bool {
720            println!("is_some");
721            true
722        }
723        fn take(&mut self) -> Option<bool> {
724            println!("take");
725            Some(true)
726        }
727    }
728
729    let mut d = D {};
730    if let (true, Some(d)) = (d.is_some(), d.take()) {
731        println!("d is {d}");
732    }
733}
734
735#[cfg(test)]
736mod tests {
737    use super::*;
738    use std::sync::Arc;
739    use std::thread;
740
741    #[test]
742    fn test_new_and_capacity() {
743        let vec: SyncVec<i32> = SyncVec::new();
744        assert!(vec.is_empty());
745        assert_eq!(vec.len(), 0);
746
747        let vec: SyncVec<i32> = SyncVec::with_capacity(10);
748        assert!(vec.is_empty());
749        assert_eq!(vec.len(), 0);
750    }
751
752    #[test]
753    fn test_push_and_get() {
754        let vec = SyncVec::new();
755        vec.push(1);
756        vec.push(2);
757        vec.push(3);
758
759        assert_eq!(vec.len(), 3);
760        assert_eq!(*vec.get(0).unwrap(), 1);
761        assert_eq!(*vec.get(1).unwrap(), 2);
762        assert_eq!(*vec.get(2).unwrap(), 3);
763        assert!(vec.get(3).is_none());
764    }
765
766    #[test]
767    fn test_index_methods() {
768        let mut vec = SyncVec::new();
769        vec.push(10);
770        vec.push(20);
771
772        assert_eq!(vec[0], 10);
773        assert_eq!(vec[1], 20);
774
775        {
776            let val = &mut vec[0];
777            *val = 100;
778        }
779        assert_eq!(vec[0], 100);
780    }
781
782    #[test]
783    #[should_panic(expected = "index out of bounds")]
784    fn test_index_panic() {
785        let vec = SyncVec::new();
786        vec.push(1);
787        let _ = vec[1];
788    }
789
790    #[test]
791    #[should_panic(expected = "index out of bounds")]
792    fn test_index_mut_panic() {
793        let mut vec = SyncVec::new();
794        vec.push(1);
795        let _ = &mut vec[1];
796    }
797
798    #[test]
799    fn test_remove_and_pop() {
800        let vec = SyncVec::new();
801        vec.push(1);
802        vec.push(2);
803        vec.push(3);
804
805        assert_eq!(vec.pop(), Some(3));
806        assert_eq!(vec.len(), 2);
807
808        assert_eq!(vec.remove(0), Some(1));
809        assert_eq!(vec.len(), 1);
810        assert_eq!(*vec.get(0).unwrap(), 2);
811    }
812
813    #[test]
814    fn test_concurrency() {
815        let vec = Arc::new(SyncVec::new());
816        let mut handles = vec![];
817
818        // Multiple writers
819        for i in 0..10 {
820            let vec = vec.clone();
821            handles.push(thread::spawn(move || {
822                for j in 0..100 {
823                    vec.push(i * 100 + j);
824                }
825            }));
826        }
827
828        for handle in handles {
829            handle.join().unwrap();
830        }
831
832        assert_eq!(vec.len(), 1000);
833    }
834
835    #[test]
836    fn test_concurrent_modify() {
837        let vec = Arc::new(SyncVec::new());
838        for i in 0..100 {
839            vec.push(i);
840        }
841
842        let vec_clone = vec.clone();
843        let handle = thread::spawn(move || {
844            for i in 0..100 {
845                if let Some(mut guard) = vec_clone.get_mut(i) {
846                    *guard += 1;
847                }
848            }
849        });
850
851        // Concurrent read
852        for i in 0..100 {
853            if let Some(val) = vec.get(i) {
854                let _ = *val; // Just read
855            }
856        }
857
858        handle.join().unwrap();
859
860        // Verify modifications
861        for i in 0..100 {
862            assert_eq!(*vec.get(i).unwrap(), i + 1);
863        }
864    }
865
866    #[test]
867    fn test_iter() {
868        let vec = SyncVec::new();
869        vec.push(1);
870        vec.push(2);
871        vec.push(3);
872
873        let mut sum = 0;
874        for item in vec.iter() {
875            sum += *item;
876        }
877        assert_eq!(sum, 6);
878    }
879
880    #[test]
881    fn test_iter_mut() {
882        let vec = SyncVec::new();
883        vec.push(1);
884        vec.push(2);
885        vec.push(3);
886
887        for mut item in vec.iter_mut() {
888            *item *= 2;
889        }
890
891        assert_eq!(*vec.get(0).unwrap(), 2);
892        assert_eq!(*vec.get(1).unwrap(), 4);
893        assert_eq!(*vec.get(2).unwrap(), 6);
894    }
895
896    #[test]
897    fn test_clear() {
898        let vec = SyncVec::new();
899        vec.push(1);
900        vec.clear();
901        assert!(vec.is_empty());
902    }
903
904    #[test]
905    fn test_contains() {
906        let vec = SyncVec::new();
907        vec.push(1);
908        vec.push(2);
909        assert!(vec.contains(&1));
910        assert!(!vec.contains(&3));
911    }
912
913    #[test]
914    fn test_iterator_traits() {
915        let vec = SyncVec::new();
916        vec.push(1);
917        vec.push(2);
918        vec.push(3);
919
920        let mut iter = vec.iter();
921        assert_eq!(iter.len(), 3);
922        assert_eq!(*iter.next().unwrap(), 1);
923        assert_eq!(iter.len(), 2);
924        assert_eq!(*iter.next_back().unwrap(), 3);
925        assert_eq!(iter.len(), 1);
926        assert_eq!(*iter.next().unwrap(), 2);
927        assert_eq!(iter.len(), 0);
928        assert!(iter.next().is_none());
929        assert!(iter.next_back().is_none());
930
931        let mut vec = SyncVec::new();
932        vec.push(1);
933        vec.push(2);
934        vec.push(3);
935        let mut iter_mut = vec.iter_mut();
936        assert_eq!(iter_mut.len(), 3);
937        assert_eq!(*iter_mut.next().unwrap(), 1);
938        assert_eq!(iter_mut.len(), 2);
939        assert_eq!(*iter_mut.next_back().unwrap(), 3);
940        assert_eq!(iter_mut.len(), 1);
941        assert_eq!(*iter_mut.next().unwrap(), 2);
942        assert_eq!(iter_mut.len(), 0);
943        assert!(iter_mut.next().is_none());
944        assert!(iter_mut.next_back().is_none());
945    }
946
947    #[test]
948    fn test_from_iter_and_extend() {
949        let vec: SyncVec<i32> = SyncVec::from_iter(vec![1, 2, 3]);
950        assert_eq!(vec.len(), 3);
951        assert_eq!(*vec.get(0).unwrap(), 1);
952
953        let mut vec = SyncVec::new();
954        vec.extend(vec![1, 2, 3]);
955        assert_eq!(vec.len(), 3);
956        assert_eq!(*vec.get(0).unwrap(), 1);
957    }
958
959    #[test]
960    fn test_iter_notlock() {
961        let vec = SyncVec::new();
962        vec.push(1);
963        vec.push(2);
964        vec.push(3);
965
966        // 测试 iter 基本功能
967        let mut sum = 0;
968        for item in vec.iter() {
969            sum += *item;
970        }
971        assert_eq!(sum, 6);
972
973        // 测试 ExactSizeIterator
974        let iter = vec.iter();
975        assert_eq!(iter.len(), 3);
976    }
977
978    #[test]
979    fn test_iter_double_ended() {
980        let vec = SyncVec::new();
981        vec.push(1);
982        vec.push(2);
983        vec.push(3);
984
985        let mut iter = vec.iter();
986        assert_eq!(*iter.next().unwrap(), 1);
987        assert_eq!(*iter.next_back().unwrap(), 3);
988        assert_eq!(*iter.next().unwrap(), 2);
989        assert!(iter.next().is_none());
990    }
991
992    #[test]
993    fn test_iter_empty() {
994        let vec: SyncVec<i32> = SyncVec::new();
995        
996        let mut count = 0;
997        for _ in vec.iter() {
998            count += 1;
999        }
1000        assert_eq!(count, 0);
1001        
1002        let iter = vec.iter();
1003        assert_eq!(iter.len(), 0);
1004    }
1005
1006    #[test]
1007    fn test_into_iter_ref() {
1008        let vec = SyncVec::new();
1009        vec.push(10);
1010        vec.push(20);
1011        vec.push(30);
1012
1013        // 测试 IntoIterator for &SyncVec
1014        let mut sum = 0;
1015        for item in &vec {
1016            sum += *item;
1017        }
1018        assert_eq!(sum, 60);
1019
1020        // 确保 vec 仍然可用
1021        assert_eq!(vec.len(), 3);
1022    }
1023
1024    #[test]
1025    fn test_into_iter_mut() {
1026        let mut vec = SyncVec::new();
1027        vec.push(1);
1028        vec.push(2);
1029        vec.push(3);
1030
1031        // 测试 IntoIterator for &mut SyncVec
1032        for mut item in &mut vec {
1033            *item *= 2;
1034        }
1035
1036        assert_eq!(*vec.get(0).unwrap(), 2);
1037        assert_eq!(*vec.get(1).unwrap(), 4);
1038        assert_eq!(*vec.get(2).unwrap(), 6);
1039    }
1040
1041    #[test]
1042    fn test_into_iter_owned() {
1043        let vec = SyncVec::new();
1044        vec.push(1);
1045        vec.push(2);
1046        vec.push(3);
1047
1048        // 测试 IntoIterator for SyncVec (消耗所有权)
1049        let collected: Vec<_> = vec.into_iter().collect();
1050        assert_eq!(collected, vec![1, 2, 3]);
1051    }
1052}