im_lists/shared_vector/
mod.rs1mod 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}