Skip to main content

im_lists/shared_vector/
mod.rs

1mod drain;
2mod intoiter;
3mod raw;
4mod shared;
5mod splice;
6mod vector;
7
8pub use raw::{AtomicRefCount, BufferSize, DefaultRefCount, RefCount};
9
10#[allow(unused_imports)]
11pub use shared::{AtomicSharedVector, RefCountedVector, SharedVector};
12pub use vector::{RawVector, Vector};
13
14pub use intoiter::IntoIter;
15
16pub mod alloc {
17    pub use allocator_api2::alloc::{AllocError, Allocator, Global};
18}
19
20pub(crate) fn grow_amortized(len: usize, additional: usize) -> usize {
21    let required = len.saturating_add(additional);
22    let cap = len.saturating_add(len).max(required).max(8);
23
24    const MAX: usize = BufferSize::MAX as usize;
25
26    if cap > MAX {
27        if required <= MAX {
28            return required;
29        }
30
31        panic!("Required allocation size is too large");
32    }
33
34    cap
35}
36
37#[macro_export]
38macro_rules! vector {
39    (@one@ $x:expr) => (1usize);
40    ($elem:expr; $n:expr) => ({
41        $crate::shared_vector::Vector::from_elem($elem, $n)
42    });
43    ($($x:expr),*$(,)*) => ({
44        let count = 0usize $(+ $crate::vector!(@one@ $x))*;
45        let mut vec = $crate::shared_vector::Vector::with_capacity(count);
46        $(vec.push($x);)*
47        vec
48    });
49    ([$($x:expr),*$(,)*] in $allocator:expr) => ({
50        let count = 0usize $(+ $crate::vector!(@one@ $x))*;
51        let mut vec = $crate::shared_vector::Vector::try_with_capacity_in(count, $allocator).unwrap();
52        $(vec.push($x);)*
53        vec
54    });
55    ([$x:expr;$n:expr] in $allocator:expr) => ({
56        let mut vec = $crate::Vector::try_with_capacity_in($n, $allocator).unwrap();
57        for _ in 0..$n { vec.push($x.clone()); }
58        vec
59    });
60}
61
62#[macro_export]
63macro_rules! rc_vector {
64    ($elem:expr; $n:expr) => ({
65        let mut vec = $crate::shared_vector::SharedVector::with_capacity($n);
66        for _ in 0..$n { vec.push($elem.clone()); }
67        vec
68    });
69    ($($x:expr),*$(,)*) => ({
70        let count = 0usize $(+ $crate::vector!(@one@ $x))*;
71        let mut vec = $crate::shared_vector::SharedVector::with_capacity(count);
72        $(vec.push($x);)*
73        vec
74    });
75    ([$($x:expr),*$(,)*] in $allocator:expr) => ({
76        let count = 0usize $(+ $crate::vector!(@one@ $x))*;
77        let mut vec = $crate::SharedVector::try_with_capacity_in(count, $allocator).unwrap();
78        $(vec.push($x);)*
79        vec
80    });
81    ([$elem:expr;$n:expr] in $allocator:expr) => ({
82        let mut vec = $crate::shared_vector::SharedVector::try_with_capacity_in($n, $allocator).unwrap();
83        for _ in 0..$n { vec.push($elem.clone()); }
84        vec
85    });
86}
87
88#[macro_export]
89macro_rules! arc_vector {
90    ($elem:expr; $n:expr) => ({
91        let mut vec = $crate::shared_vector::AtomicSharedVector::with_capacity($n);
92        for _ in 0..$n { vec.push($elem.clone()); }
93        vec
94    });
95    ($($x:expr),*$(,)*) => ({
96        let count = 0usize $(+ $crate::vector!(@one@ $x))*;
97        let mut vec = $crate::shared_vector::AtomicSharedVector::with_capacity(count);
98        $(vec.push($x);)*
99        vec
100    });
101    ([$($x:expr),*$(,)*] in $allocator:expr) => ({
102        let count = 0usize $(+ $crate::vector!(@one@ $x))*;
103        let mut vec = $crate::shared_vector::AtomicSharedVector::try_with_capacity_in(count, $allocator).unwrap();
104        $(vec.push($x);)*
105        vec
106    });
107    ([$elem:expr;$n:expr] in $allocator:expr) => ({
108        let mut vec = $crate::AtomicSharedVector::try_with_capacity_in($n, $allocator).unwrap();
109        for _ in 0..$n { vec.push($elem.clone()); }
110        vec
111    });
112}
113
114#[test]
115fn vector_macro() {
116    pub use allocator_api2::alloc::Global;
117
118    let v1: Vector<u32> = vector![0, 1, 2, 3, 4, 5];
119    let v2: Vector<u32> = vector![2; 4];
120    let v3: Vector<u32> = vector!([6, 7] in Global);
121    assert_eq!(v1.as_slice(), &[0, 1, 2, 3, 4, 5]);
122    assert_eq!(v2.as_slice(), &[2, 2, 2, 2]);
123    assert_eq!(v3.as_slice(), &[6, 7]);
124
125    let v1: SharedVector<u32> = rc_vector![0, 1, 2, 3, 4, 5];
126    let v2: SharedVector<u32> = rc_vector![3; 5];
127    let v3: SharedVector<u32> = rc_vector!([4; 3] in Global);
128    assert_eq!(v1.as_slice(), &[0, 1, 2, 3, 4, 5]);
129    assert_eq!(v2.as_slice(), &[3, 3, 3, 3, 3]);
130    assert_eq!(v3.as_slice(), &[4, 4, 4]);
131
132    let v1: AtomicSharedVector<u32> = arc_vector![0, 1, 2, 3, 4, 5];
133    let v2: AtomicSharedVector<u32> = arc_vector![1; 4];
134    let v3: AtomicSharedVector<u32> = arc_vector![[3, 2, 1] in Global];
135    assert_eq!(v1.as_slice(), &[0, 1, 2, 3, 4, 5]);
136    assert_eq!(v2.as_slice(), &[1, 1, 1, 1]);
137    assert_eq!(v3.as_slice(), &[3, 2, 1]);
138}