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    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    /// Get a reference to the value at index, bypassing the lock.
595    /// 获取索引处的值引用,绕过锁。
596    /// 
597    /// # Safety
598    /// This method is unsafe because it bypasses the `RwLock` protecting the value.
599    /// It should only be used when you are sure that no other thread is modifying the value.
600    /// Concurrent access using this method is undefined behavior.
601    /// 
602    /// # 安全性
603    /// 此方法是不安全的,因为它绕过了保护值的 `RwLock`。
604    /// 仅当您确定没有其他线程正在修改该值时才应使用它。
605    /// 使用此方法进行并发访问是未定义行为。
606    fn index(&self, index: usize) -> &Self::Output {
607        unsafe {
608            let v = &*self.dirty.get();
609            // We need to get &V from &RwLock<V> without locking.
610            // Since we are in an unsafe block and claiming it's unsafe/no concurrent access,
611            // we can cast the &RwLock<V> to &mut RwLock<V> (conceptually) to use get_mut(),
612            // or rely on the fact that we are bypassing the lock.
613            // However, RwLock::get_mut requires &mut RwLock.
614            // We only have &RwLock.
615            // We can cast &RwLock to &mut RwLock because we are asserting exclusive access (via the safety contract).
616            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        // This is unsafe because we are bypassing the `RwLock` protecting the value.
625        // 这是不安全的,因为我们绕过了保护值的 `RwLock`。
626        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        // Multiple writers
748        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        // Concurrent read
781        for i in 0..100 {
782            if let Some(val) = vec.get(i) {
783                let _ = *val; // Just read
784            }
785        }
786
787        handle.join().unwrap();
788
789        // Verify modifications
790        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}