]>
git.proxmox.com Git - rustc.git/blob - vendor/tinyvec/tests/tinyvec.rs
df1700452fcae22b2612b01f05887772fe4800ad
1 #![cfg(feature = "alloc")]
3 #![allow(clippy::redundant_clone)]
5 #[cfg(feature = "serde")]
6 use serde_test
::{assert_tokens, Token}
;
7 use std
::iter
::FromIterator
;
11 fn TinyVec_swap_remove() {
12 let mut tv
: TinyVec
<[i32; 10]> = Default
::default();
17 assert_eq
!(tv
.swap_remove(3), 4);
18 assert_eq
!(&tv
[..], &[1, 2, 3][..]);
19 assert_eq
!(tv
.swap_remove(0), 1);
20 assert_eq
!(&tv
[..], &[3, 2][..]);
21 assert_eq
!(tv
.swap_remove(0), 3);
22 assert_eq
!(&tv
[..], &[2][..]);
23 assert_eq
!(tv
.swap_remove(0), 2);
24 assert_eq
!(&tv
[..], &[][..]);
28 fn TinyVec_capacity() {
29 let mut tv
: TinyVec
<[i32; 1]> = Default
::default();
30 assert_eq
!(tv
.capacity(), 1);
31 tv
.move_to_the_heap();
32 tv
.extend_from_slice(&[1, 2, 3, 4]);
33 assert_eq
!(tv
.capacity(), 4);
38 let mut tv
: TinyVec
<[i32; 10]> = Default
::default();
43 assert_eq
!(Vec
::from_iter(tv
.clone().drain(..)), vec
![1, 2, 3]);
45 assert_eq
!(Vec
::from_iter(tv
.clone().drain(..2)), vec
![1, 2]);
46 assert_eq
!(Vec
::from_iter(tv
.clone().drain(..3)), vec
![1, 2, 3]);
48 assert_eq
!(Vec
::from_iter(tv
.clone().drain(..=1)), vec
![1, 2]);
49 assert_eq
!(Vec
::from_iter(tv
.clone().drain(..=2)), vec
![1, 2, 3]);
51 assert_eq
!(Vec
::from_iter(tv
.clone().drain(0..)), vec
![1, 2, 3]);
52 assert_eq
!(Vec
::from_iter(tv
.clone().drain(1..)), vec
![2, 3]);
54 assert_eq
!(Vec
::from_iter(tv
.clone().drain(0..2)), vec
![1, 2]);
55 assert_eq
!(Vec
::from_iter(tv
.clone().drain(0..3)), vec
![1, 2, 3]);
56 assert_eq
!(Vec
::from_iter(tv
.clone().drain(1..2)), vec
![2]);
57 assert_eq
!(Vec
::from_iter(tv
.clone().drain(1..3)), vec
![2, 3]);
59 assert_eq
!(Vec
::from_iter(tv
.clone().drain(0..=1)), vec
![1, 2]);
60 assert_eq
!(Vec
::from_iter(tv
.clone().drain(0..=2)), vec
![1, 2, 3]);
61 assert_eq
!(Vec
::from_iter(tv
.clone().drain(1..=1)), vec
![2]);
62 assert_eq
!(Vec
::from_iter(tv
.clone().drain(1..=2)), vec
![2, 3]);
67 let mut tv
: TinyVec
<[i32; 10]> = Default
::default();
72 // splice returns the same things as drain
73 assert_eq
!(Vec
::from_iter(tv
.clone().splice(.., None
)), vec
![1, 2, 3]);
75 assert_eq
!(Vec
::from_iter(tv
.clone().splice(..2, None
)), vec
![1, 2]);
76 assert_eq
!(Vec
::from_iter(tv
.clone().splice(..3, None
)), vec
![1, 2, 3]);
78 assert_eq
!(Vec
::from_iter(tv
.clone().splice(..=1, None
)), vec
![1, 2]);
79 assert_eq
!(Vec
::from_iter(tv
.clone().splice(..=2, None
)), vec
![1, 2, 3]);
81 assert_eq
!(Vec
::from_iter(tv
.clone().splice(0.., None
)), vec
![1, 2, 3]);
82 assert_eq
!(Vec
::from_iter(tv
.clone().splice(1.., None
)), vec
![2, 3]);
84 assert_eq
!(Vec
::from_iter(tv
.clone().splice(0..2, None
)), vec
![1, 2]);
85 assert_eq
!(Vec
::from_iter(tv
.clone().splice(0..3, None
)), vec
![1, 2, 3]);
86 assert_eq
!(Vec
::from_iter(tv
.clone().splice(1..2, None
)), vec
![2]);
87 assert_eq
!(Vec
::from_iter(tv
.clone().splice(1..3, None
)), vec
![2, 3]);
89 assert_eq
!(Vec
::from_iter(tv
.clone().splice(0..=1, None
)), vec
![1, 2]);
90 assert_eq
!(Vec
::from_iter(tv
.clone().splice(0..=2, None
)), vec
![1, 2, 3]);
91 assert_eq
!(Vec
::from_iter(tv
.clone().splice(1..=1, None
)), vec
![2]);
92 assert_eq
!(Vec
::from_iter(tv
.clone().splice(1..=2, None
)), vec
![2, 3]);
94 // splice removes the same things as drain
95 let mut tv2
= tv
.clone();
97 assert_eq
!(tv2
, tiny_vec
![]);
99 let mut tv2
= tv
.clone();
100 tv2
.splice(..2, None
);
101 assert_eq
!(tv2
, tiny_vec
![3]);
103 let mut tv2
= tv
.clone();
104 tv2
.splice(..3, None
);
105 assert_eq
!(tv2
, tiny_vec
![]);
107 let mut tv2
= tv
.clone();
108 tv2
.splice(..=1, None
);
109 assert_eq
!(tv2
, tiny_vec
![3]);
110 let mut tv2
= tv
.clone();
111 tv2
.splice(..=2, None
);
112 assert_eq
!(tv2
, tiny_vec
![]);
114 let mut tv2
= tv
.clone();
115 tv2
.splice(0.., None
);
116 assert_eq
!(tv2
, tiny_vec
![]);
117 let mut tv2
= tv
.clone();
118 tv2
.splice(1.., None
);
119 assert_eq
!(tv2
, tiny_vec
![1]);
121 let mut tv2
= tv
.clone();
122 tv2
.splice(0..2, None
);
123 assert_eq
!(tv2
, tiny_vec
![3]);
125 let mut tv2
= tv
.clone();
126 tv2
.splice(0..3, None
);
127 assert_eq
!(tv2
, tiny_vec
![]);
128 let mut tv2
= tv
.clone();
129 tv2
.splice(1..2, None
);
130 assert_eq
!(tv2
, tiny_vec
![1, 3]);
132 let mut tv2
= tv
.clone();
133 tv2
.splice(1..3, None
);
134 assert_eq
!(tv2
, tiny_vec
![1]);
136 let mut tv2
= tv
.clone();
137 tv2
.splice(0..=1, None
);
138 assert_eq
!(tv2
, tiny_vec
![3]);
140 let mut tv2
= tv
.clone();
141 tv2
.splice(0..=2, None
);
142 assert_eq
!(tv2
, tiny_vec
![]);
144 let mut tv2
= tv
.clone();
145 tv2
.splice(1..=1, None
);
146 assert_eq
!(tv2
, tiny_vec
![1, 3]);
148 let mut tv2
= tv
.clone();
149 tv2
.splice(1..=2, None
);
150 assert_eq
!(tv2
, tiny_vec
![1]);
152 // splice adds the elements correctly
153 let mut tv2
= tv
.clone();
154 tv2
.splice(.., 4..=6);
155 assert_eq
!(tv2
, tiny_vec
![4, 5, 6]);
157 let mut tv2
= tv
.clone();
158 tv2
.splice(..2, 4..=6);
159 assert_eq
!(tv2
, tiny_vec
![4, 5, 6, 3]);
161 let mut tv2
= tv
.clone();
162 tv2
.splice(..3, 4..=6);
163 assert_eq
!(tv2
, tiny_vec
![4, 5, 6]);
165 let mut tv2
= tv
.clone();
166 tv2
.splice(..=1, 4..=6);
167 assert_eq
!(tv2
, tiny_vec
![4, 5, 6, 3]);
169 let mut tv2
= tv
.clone();
170 tv2
.splice(..=2, 4..=6);
171 assert_eq
!(tv2
, tiny_vec
![4, 5, 6]);
173 let mut tv2
= tv
.clone();
174 tv2
.splice(0.., 4..=6);
175 assert_eq
!(tv2
, tiny_vec
![4, 5, 6]);
177 let mut tv2
= tv
.clone();
178 tv2
.splice(1.., 4..=6);
179 assert_eq
!(tv2
, tiny_vec
![1, 4, 5, 6]);
181 let mut tv2
= tv
.clone();
182 tv2
.splice(0..2, 4..=6);
183 assert_eq
!(tv2
, tiny_vec
![4, 5, 6, 3]);
185 let mut tv2
= tv
.clone();
186 tv2
.splice(0..3, 4..=6);
187 assert_eq
!(tv2
, tiny_vec
![4, 5, 6]);
189 let mut tv2
= tv
.clone();
190 tv2
.splice(1..2, 4..=6);
191 assert_eq
!(tv2
, tiny_vec
![1, 4, 5, 6, 3]);
193 let mut tv2
= tv
.clone();
194 tv2
.splice(1..3, 4..=6);
195 assert_eq
!(tv2
, tiny_vec
![1, 4, 5, 6]);
197 let mut tv2
= tv
.clone();
198 tv2
.splice(0..=1, 4..=6);
199 assert_eq
!(tv2
, tiny_vec
![4, 5, 6, 3]);
201 let mut tv2
= tv
.clone();
202 tv2
.splice(0..=2, 4..=6);
203 assert_eq
!(tv2
, tiny_vec
![4, 5, 6]);
205 let mut tv2
= tv
.clone();
206 tv2
.splice(1..=1, 4..=6);
207 assert_eq
!(tv2
, tiny_vec
![1, 4, 5, 6, 3]);
209 let mut tv2
= tv
.clone();
210 tv2
.splice(1..=2, 4..=6);
211 assert_eq
!(tv2
, tiny_vec
![1, 4, 5, 6]);
213 // splice adds the elements correctly when the replacement is smaller
214 let mut tv2
= tv
.clone();
215 tv2
.splice(.., Some(4));
216 assert_eq
!(tv2
, tiny_vec
![4]);
218 let mut tv2
= tv
.clone();
219 tv2
.splice(..2, Some(4));
220 assert_eq
!(tv2
, tiny_vec
![4, 3]);
222 let mut tv2
= tv
.clone();
223 tv2
.splice(1.., Some(4));
224 assert_eq
!(tv2
, tiny_vec
![1, 4]);
226 let mut tv2
= tv
.clone();
227 tv2
.splice(1..=1, Some(4));
228 assert_eq
!(tv2
, tiny_vec
![1, 4, 3]);
232 fn TinyVec_resize() {
233 let mut tv
: TinyVec
<[i32; 10]> = Default
::default();
235 assert_eq
!(&tv
[..], &[5; 20]);
239 fn TinyVec_from_slice_impl() {
240 let bigger_slice
: [u8; 11] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
241 let tinyvec
: TinyVec
<[u8; 10]> = TinyVec
::Heap((&bigger_slice
[..]).into());
242 assert_eq
!(TinyVec
::from(&bigger_slice
[..]), tinyvec
);
244 let smaller_slice
: [u8; 5] = [0, 1, 2, 3, 4];
245 let tinyvec
: TinyVec
<[u8; 10]> = TinyVec
::Inline(ArrayVec
::from_array_len(
246 [0, 1, 2, 3, 4, 0, 0, 0, 0, 0],
249 assert_eq
!(TinyVec
::from(&smaller_slice
[..]), tinyvec
);
251 let same_size
: [u8; 4] = [0, 1, 2, 3];
252 let tinyvec
: TinyVec
<[u8; 4]> =
253 TinyVec
::Inline(ArrayVec
::from_array_len(same_size
, 4));
254 assert_eq
!(TinyVec
::from(&same_size
[..]), tinyvec
);
258 fn TinyVec_from_array() {
259 let array
= [9, 8, 7, 6, 5, 4, 3, 2, 1];
260 let tv
= TinyVec
::from(array
);
261 assert_eq
!(&array
, &tv
[..]);
266 let mut expected
: TinyVec
<[i32; 4]> = Default
::default();
271 let actual
= tiny_vec
!(1, 2, 3);
273 assert_eq
!(expected
, actual
);
275 assert_eq
!(tiny_vec
![0u8; 4], tiny_vec
!(0u8, 0u8, 0u8, 0u8));
276 assert_eq
!(tiny_vec
![0u8; 4], tiny_vec
!([u8; 4] => 0, 0, 0, 0));
277 assert_eq
!(tiny_vec
![0; 4], tiny_vec
!(0, 0, 0, 0));
278 assert_eq
!(tiny_vec
![0; 4], tiny_vec
!([u8; 4] => 0, 0, 0, 0));
280 let expected2
= tiny_vec
![1.1; 3];
281 let actual2
= tiny_vec
!([f32; 3] => 1.1, 1.1, 1.1);
282 assert_eq
!(expected2
, actual2
);
286 fn TinyVec_macro_non_copy() {
287 // must use a variable here to avoid macro shenanigans
288 let s
= String
::new();
289 let _
: TinyVec
<[String
; 10]> = tiny_vec
!([String
; 10] => s
);
293 fn TinyVec_reserve() {
294 let mut tv
: TinyVec
<[i32; 4]> = Default
::default();
295 assert_eq
!(tv
.capacity(), 4);
296 tv
.extend_from_slice(&[1, 2]);
297 assert_eq
!(tv
.capacity(), 4);
299 assert_eq
!(tv
.capacity(), 4);
301 assert
!(tv
.capacity() >= 6);
302 tv
.extend_from_slice(&[3, 4, 5, 6]);
304 assert
!(tv
.capacity() >= 10);
308 fn TinyVec_reserve_exact() {
309 let mut tv
: TinyVec
<[i32; 4]> = Default
::default();
310 assert_eq
!(tv
.capacity(), 4);
312 tv
.extend_from_slice(&[1, 2]);
313 assert_eq
!(tv
.capacity(), 4);
315 assert_eq
!(tv
.capacity(), 4);
317 assert
!(tv
.capacity() >= 6);
318 tv
.extend_from_slice(&[3, 4, 5, 6]);
320 assert
!(tv
.capacity() >= 10);
324 fn TinyVec_move_to_heap_and_shrink() {
325 let mut tv
: TinyVec
<[i32; 4]> = Default
::default();
326 assert
!(tv
.is_inline());
327 tv
.move_to_the_heap();
328 assert
!(tv
.is_heap());
329 assert_eq
!(tv
.capacity(), 0);
333 assert
!(tv
.is_inline());
334 assert_eq
!(tv
.capacity(), 4);
336 tv
.move_to_the_heap_and_reserve(3);
337 assert
!(tv
.is_heap());
338 assert_eq
!(tv
.capacity(), 4);
340 assert_eq
!(tv
.capacity(), 4);
341 assert_eq
!(tv
.as_slice(), [1, 2, 3, 4]);
344 #[cfg(feature = "serde")]
346 fn TinyVec_ser_de_empty() {
347 let tv
: TinyVec
<[i32; 0]> = tiny_vec
![];
349 assert_tokens(&tv
, &[Token
::Seq { len: Some(0) }
, Token
::SeqEnd
]);
352 #[cfg(feature = "serde")]
354 fn TinyVec_ser_de() {
355 let tv
: TinyVec
<[i32; 4]> = tiny_vec
![1, 2, 3, 4];
360 Token
::Seq { len: Some(4) }
,
370 #[cfg(feature = "serde")]
372 fn TinyVec_ser_de_heap() {
373 let mut tv
: TinyVec
<[i32; 4]> = tiny_vec
![1, 2, 3, 4];
374 tv
.move_to_the_heap();
379 Token
::Seq { len: Some(4) }
,