tinyvec.rs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. #![cfg(feature = "alloc")]
  2. #![allow(bad_style)]
  3. #![allow(clippy::redundant_clone)]
  4. #[cfg(feature = "serde")]
  5. use serde_test::{assert_tokens, Token};
  6. use std::iter::FromIterator;
  7. use tinyvec::*;
  8. #[test]
  9. fn TinyVec_swap_remove() {
  10. let mut tv: TinyVec<[i32; 10]> = Default::default();
  11. tv.push(1);
  12. tv.push(2);
  13. tv.push(3);
  14. tv.push(4);
  15. assert_eq!(tv.swap_remove(3), 4);
  16. assert_eq!(&tv[..], &[1, 2, 3][..]);
  17. assert_eq!(tv.swap_remove(0), 1);
  18. assert_eq!(&tv[..], &[3, 2][..]);
  19. assert_eq!(tv.swap_remove(0), 3);
  20. assert_eq!(&tv[..], &[2][..]);
  21. assert_eq!(tv.swap_remove(0), 2);
  22. assert_eq!(&tv[..], &[][..]);
  23. }
  24. #[test]
  25. fn TinyVec_capacity() {
  26. let mut tv: TinyVec<[i32; 1]> = Default::default();
  27. assert_eq!(tv.capacity(), 1);
  28. tv.move_to_the_heap();
  29. tv.extend_from_slice(&[1, 2, 3, 4]);
  30. assert_eq!(tv.capacity(), 4);
  31. }
  32. #[test]
  33. fn TinyVec_drain() {
  34. let mut tv: TinyVec<[i32; 10]> = Default::default();
  35. tv.push(1);
  36. tv.push(2);
  37. tv.push(3);
  38. assert_eq!(Vec::from_iter(tv.clone().drain(..)), vec![1, 2, 3]);
  39. assert_eq!(Vec::from_iter(tv.clone().drain(..2)), vec![1, 2]);
  40. assert_eq!(Vec::from_iter(tv.clone().drain(..3)), vec![1, 2, 3]);
  41. assert_eq!(Vec::from_iter(tv.clone().drain(..=1)), vec![1, 2]);
  42. assert_eq!(Vec::from_iter(tv.clone().drain(..=2)), vec![1, 2, 3]);
  43. assert_eq!(Vec::from_iter(tv.clone().drain(0..)), vec![1, 2, 3]);
  44. assert_eq!(Vec::from_iter(tv.clone().drain(1..)), vec![2, 3]);
  45. assert_eq!(Vec::from_iter(tv.clone().drain(0..2)), vec![1, 2]);
  46. assert_eq!(Vec::from_iter(tv.clone().drain(0..3)), vec![1, 2, 3]);
  47. assert_eq!(Vec::from_iter(tv.clone().drain(1..2)), vec![2]);
  48. assert_eq!(Vec::from_iter(tv.clone().drain(1..3)), vec![2, 3]);
  49. assert_eq!(Vec::from_iter(tv.clone().drain(0..=1)), vec![1, 2]);
  50. assert_eq!(Vec::from_iter(tv.clone().drain(0..=2)), vec![1, 2, 3]);
  51. assert_eq!(Vec::from_iter(tv.clone().drain(1..=1)), vec![2]);
  52. assert_eq!(Vec::from_iter(tv.clone().drain(1..=2)), vec![2, 3]);
  53. }
  54. #[test]
  55. fn TinyVec_splice() {
  56. let mut tv: TinyVec<[i32; 10]> = Default::default();
  57. tv.push(1);
  58. tv.push(2);
  59. tv.push(3);
  60. // splice returns the same things as drain
  61. assert_eq!(Vec::from_iter(tv.clone().splice(.., None)), vec![1, 2, 3]);
  62. assert_eq!(Vec::from_iter(tv.clone().splice(..2, None)), vec![1, 2]);
  63. assert_eq!(Vec::from_iter(tv.clone().splice(..3, None)), vec![1, 2, 3]);
  64. assert_eq!(Vec::from_iter(tv.clone().splice(..=1, None)), vec![1, 2]);
  65. assert_eq!(Vec::from_iter(tv.clone().splice(..=2, None)), vec![1, 2, 3]);
  66. assert_eq!(Vec::from_iter(tv.clone().splice(0.., None)), vec![1, 2, 3]);
  67. assert_eq!(Vec::from_iter(tv.clone().splice(1.., None)), vec![2, 3]);
  68. assert_eq!(Vec::from_iter(tv.clone().splice(0..2, None)), vec![1, 2]);
  69. assert_eq!(Vec::from_iter(tv.clone().splice(0..3, None)), vec![1, 2, 3]);
  70. assert_eq!(Vec::from_iter(tv.clone().splice(1..2, None)), vec![2]);
  71. assert_eq!(Vec::from_iter(tv.clone().splice(1..3, None)), vec![2, 3]);
  72. assert_eq!(Vec::from_iter(tv.clone().splice(0..=1, None)), vec![1, 2]);
  73. assert_eq!(Vec::from_iter(tv.clone().splice(0..=2, None)), vec![1, 2, 3]);
  74. assert_eq!(Vec::from_iter(tv.clone().splice(1..=1, None)), vec![2]);
  75. assert_eq!(Vec::from_iter(tv.clone().splice(1..=2, None)), vec![2, 3]);
  76. // splice removes the same things as drain
  77. let mut tv2 = tv.clone();
  78. tv2.splice(.., None);
  79. assert_eq!(tv2, tiny_vec![]);
  80. let mut tv2 = tv.clone();
  81. tv2.splice(..2, None);
  82. assert_eq!(tv2, tiny_vec![3]);
  83. let mut tv2 = tv.clone();
  84. tv2.splice(..3, None);
  85. assert_eq!(tv2, tiny_vec![]);
  86. let mut tv2 = tv.clone();
  87. tv2.splice(..=1, None);
  88. assert_eq!(tv2, tiny_vec![3]);
  89. let mut tv2 = tv.clone();
  90. tv2.splice(..=2, None);
  91. assert_eq!(tv2, tiny_vec![]);
  92. let mut tv2 = tv.clone();
  93. tv2.splice(0.., None);
  94. assert_eq!(tv2, tiny_vec![]);
  95. let mut tv2 = tv.clone();
  96. tv2.splice(1.., None);
  97. assert_eq!(tv2, tiny_vec![1]);
  98. let mut tv2 = tv.clone();
  99. tv2.splice(0..2, None);
  100. assert_eq!(tv2, tiny_vec![3]);
  101. let mut tv2 = tv.clone();
  102. tv2.splice(0..3, None);
  103. assert_eq!(tv2, tiny_vec![]);
  104. let mut tv2 = tv.clone();
  105. tv2.splice(1..2, None);
  106. assert_eq!(tv2, tiny_vec![1, 3]);
  107. let mut tv2 = tv.clone();
  108. tv2.splice(1..3, None);
  109. assert_eq!(tv2, tiny_vec![1]);
  110. let mut tv2 = tv.clone();
  111. tv2.splice(0..=1, None);
  112. assert_eq!(tv2, tiny_vec![3]);
  113. let mut tv2 = tv.clone();
  114. tv2.splice(0..=2, None);
  115. assert_eq!(tv2, tiny_vec![]);
  116. let mut tv2 = tv.clone();
  117. tv2.splice(1..=1, None);
  118. assert_eq!(tv2, tiny_vec![1, 3]);
  119. let mut tv2 = tv.clone();
  120. tv2.splice(1..=2, None);
  121. assert_eq!(tv2, tiny_vec![1]);
  122. // splice adds the elements correctly
  123. let mut tv2 = tv.clone();
  124. tv2.splice(.., 4..=6);
  125. assert_eq!(tv2, tiny_vec![4, 5, 6]);
  126. let mut tv2 = tv.clone();
  127. tv2.splice(..2, 4..=6);
  128. assert_eq!(tv2, tiny_vec![4, 5, 6, 3]);
  129. let mut tv2 = tv.clone();
  130. tv2.splice(..3, 4..=6);
  131. assert_eq!(tv2, tiny_vec![4, 5, 6]);
  132. let mut tv2 = tv.clone();
  133. tv2.splice(..=1, 4..=6);
  134. assert_eq!(tv2, tiny_vec![4, 5, 6, 3]);
  135. let mut tv2 = tv.clone();
  136. tv2.splice(..=2, 4..=6);
  137. assert_eq!(tv2, tiny_vec![4, 5, 6]);
  138. let mut tv2 = tv.clone();
  139. tv2.splice(0.., 4..=6);
  140. assert_eq!(tv2, tiny_vec![4, 5, 6]);
  141. let mut tv2 = tv.clone();
  142. tv2.splice(1.., 4..=6);
  143. assert_eq!(tv2, tiny_vec![1, 4, 5, 6]);
  144. let mut tv2 = tv.clone();
  145. tv2.splice(0..2, 4..=6);
  146. assert_eq!(tv2, tiny_vec![4, 5, 6, 3]);
  147. let mut tv2 = tv.clone();
  148. tv2.splice(0..3, 4..=6);
  149. assert_eq!(tv2, tiny_vec![4, 5, 6]);
  150. let mut tv2 = tv.clone();
  151. tv2.splice(1..2, 4..=6);
  152. assert_eq!(tv2, tiny_vec![1, 4, 5, 6, 3]);
  153. let mut tv2 = tv.clone();
  154. tv2.splice(1..3, 4..=6);
  155. assert_eq!(tv2, tiny_vec![1, 4, 5, 6]);
  156. let mut tv2 = tv.clone();
  157. tv2.splice(0..=1, 4..=6);
  158. assert_eq!(tv2, tiny_vec![4, 5, 6, 3]);
  159. let mut tv2 = tv.clone();
  160. tv2.splice(0..=2, 4..=6);
  161. assert_eq!(tv2, tiny_vec![4, 5, 6]);
  162. let mut tv2 = tv.clone();
  163. tv2.splice(1..=1, 4..=6);
  164. assert_eq!(tv2, tiny_vec![1, 4, 5, 6, 3]);
  165. let mut tv2 = tv.clone();
  166. tv2.splice(1..=2, 4..=6);
  167. assert_eq!(tv2, tiny_vec![1, 4, 5, 6]);
  168. // splice adds the elements correctly when the replacement is smaller
  169. let mut tv2 = tv.clone();
  170. tv2.splice(.., Some(4));
  171. assert_eq!(tv2, tiny_vec![4]);
  172. let mut tv2 = tv.clone();
  173. tv2.splice(..2, Some(4));
  174. assert_eq!(tv2, tiny_vec![4, 3]);
  175. let mut tv2 = tv.clone();
  176. tv2.splice(1.., Some(4));
  177. assert_eq!(tv2, tiny_vec![1, 4]);
  178. let mut tv2 = tv.clone();
  179. tv2.splice(1..=1, Some(4));
  180. assert_eq!(tv2, tiny_vec![1, 4, 3]);
  181. }
  182. #[test]
  183. fn TinyVec_resize() {
  184. let mut tv: TinyVec<[i32; 10]> = Default::default();
  185. tv.resize(20, 5);
  186. assert_eq!(&tv[..], &[5; 20]);
  187. }
  188. #[test]
  189. fn TinyVec_from_slice_impl() {
  190. let bigger_slice: [u8; 11] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  191. let tinyvec: TinyVec<[u8; 10]> = TinyVec::Heap((&bigger_slice[..]).into());
  192. assert_eq!(TinyVec::from(&bigger_slice[..]), tinyvec);
  193. let smaller_slice: [u8; 5] = [0, 1, 2, 3, 4];
  194. let tinyvec: TinyVec<[u8; 10]> = TinyVec::Inline(ArrayVec::from_array_len(
  195. [0, 1, 2, 3, 4, 0, 0, 0, 0, 0],
  196. 5,
  197. ));
  198. assert_eq!(TinyVec::from(&smaller_slice[..]), tinyvec);
  199. let same_size: [u8; 4] = [0, 1, 2, 3];
  200. let tinyvec: TinyVec<[u8; 4]> =
  201. TinyVec::Inline(ArrayVec::from_array_len(same_size, 4));
  202. assert_eq!(TinyVec::from(&same_size[..]), tinyvec);
  203. }
  204. #[test]
  205. fn TinyVec_from_array() {
  206. let array = [9, 8, 7, 6, 5, 4, 3, 2, 1];
  207. let tv = TinyVec::from(array);
  208. assert_eq!(&array, &tv[..]);
  209. }
  210. #[test]
  211. fn TinyVec_macro() {
  212. let mut expected: TinyVec<[i32; 4]> = Default::default();
  213. expected.push(1);
  214. expected.push(2);
  215. expected.push(3);
  216. let actual = tiny_vec!(1, 2, 3);
  217. assert_eq!(expected, actual);
  218. assert_eq!(tiny_vec![0u8; 4], tiny_vec!(0u8, 0u8, 0u8, 0u8));
  219. assert_eq!(tiny_vec![0u8; 4], tiny_vec!([u8; 4] => 0, 0, 0, 0));
  220. assert_eq!(tiny_vec![0; 4], tiny_vec!(0, 0, 0, 0));
  221. assert_eq!(tiny_vec![0; 4], tiny_vec!([u8; 4] => 0, 0, 0, 0));
  222. let expected2 = tiny_vec![1.1; 3];
  223. let actual2 = tiny_vec!([f32; 3] => 1.1, 1.1, 1.1);
  224. assert_eq!(expected2, actual2);
  225. }
  226. #[test]
  227. fn TinyVec_macro_non_copy() {
  228. // must use a variable here to avoid macro shenanigans
  229. let s = String::new();
  230. let _: TinyVec<[String; 10]> = tiny_vec!([String; 10] => s);
  231. }
  232. #[test]
  233. fn TinyVec_reserve() {
  234. let mut tv: TinyVec<[i32; 4]> = Default::default();
  235. assert_eq!(tv.capacity(), 4);
  236. tv.extend_from_slice(&[1, 2]);
  237. assert_eq!(tv.capacity(), 4);
  238. tv.reserve(2);
  239. assert_eq!(tv.capacity(), 4);
  240. tv.reserve(4);
  241. assert!(tv.capacity() >= 6);
  242. tv.extend_from_slice(&[3, 4, 5, 6]);
  243. tv.reserve(4);
  244. assert!(tv.capacity() >= 10);
  245. }
  246. #[cfg(feature = "rustc_1_57")]
  247. #[test]
  248. fn TinyVec_try_reserve() {
  249. let mut tv: TinyVec<[i32; 4]> = Default::default();
  250. assert_eq!(tv.capacity(), 4);
  251. tv.extend_from_slice(&[1, 2]);
  252. assert_eq!(tv.capacity(), 4);
  253. assert!(tv.try_reserve(2).is_ok());
  254. assert_eq!(tv.capacity(), 4);
  255. assert!(tv.try_reserve(4).is_ok());
  256. assert!(tv.capacity() >= 6);
  257. tv.extend_from_slice(&[3, 4, 5, 6]);
  258. assert!(tv.try_reserve(4).is_ok());
  259. assert!(tv.capacity() >= 10);
  260. }
  261. #[test]
  262. fn TinyVec_reserve_exact() {
  263. let mut tv: TinyVec<[i32; 4]> = Default::default();
  264. assert_eq!(tv.capacity(), 4);
  265. tv.extend_from_slice(&[1, 2]);
  266. assert_eq!(tv.capacity(), 4);
  267. tv.reserve_exact(2);
  268. assert_eq!(tv.capacity(), 4);
  269. tv.reserve_exact(4);
  270. assert!(tv.capacity() >= 6);
  271. tv.extend_from_slice(&[3, 4, 5, 6]);
  272. tv.reserve_exact(4);
  273. assert!(tv.capacity() >= 10);
  274. }
  275. #[cfg(feature = "rustc_1_57")]
  276. #[test]
  277. fn TinyVec_try_reserve_exact() {
  278. let mut tv: TinyVec<[i32; 4]> = Default::default();
  279. assert_eq!(tv.capacity(), 4);
  280. tv.extend_from_slice(&[1, 2]);
  281. assert_eq!(tv.capacity(), 4);
  282. assert!(tv.try_reserve_exact(2).is_ok());
  283. assert_eq!(tv.capacity(), 4);
  284. assert!(tv.try_reserve_exact(4).is_ok());
  285. assert!(tv.capacity() >= 6);
  286. tv.extend_from_slice(&[3, 4, 5, 6]);
  287. assert!(tv.try_reserve_exact(4).is_ok());
  288. assert!(tv.capacity() >= 10);
  289. }
  290. #[test]
  291. fn TinyVec_move_to_heap_and_shrink() {
  292. let mut tv: TinyVec<[i32; 4]> = Default::default();
  293. assert!(tv.is_inline());
  294. tv.move_to_the_heap();
  295. assert!(tv.is_heap());
  296. assert_eq!(tv.capacity(), 0);
  297. tv.push(1);
  298. tv.shrink_to_fit();
  299. assert!(tv.is_inline());
  300. assert_eq!(tv.capacity(), 4);
  301. tv.move_to_the_heap_and_reserve(3);
  302. assert!(tv.is_heap());
  303. assert_eq!(tv.capacity(), 4);
  304. tv.extend(2..=4);
  305. assert_eq!(tv.capacity(), 4);
  306. assert_eq!(tv.as_slice(), [1, 2, 3, 4]);
  307. }
  308. #[cfg(feature = "rustc_1_57")]
  309. #[test]
  310. fn TinyVec_try_move_to_heap_and_shrink() {
  311. let mut tv: TinyVec<[i32; 4]> = Default::default();
  312. assert!(tv.is_inline());
  313. assert!(tv.try_move_to_the_heap().is_ok());
  314. assert!(tv.is_heap());
  315. assert_eq!(tv.capacity(), 0);
  316. assert!(tv.try_reserve_exact(1).is_ok());
  317. assert_eq!(tv.capacity(), 1);
  318. tv.push(1);
  319. tv.shrink_to_fit();
  320. assert!(tv.is_inline());
  321. assert_eq!(tv.capacity(), 4);
  322. assert!(tv.try_move_to_the_heap_and_reserve(3).is_ok());
  323. assert!(tv.is_heap());
  324. assert_eq!(tv.capacity(), 4);
  325. tv.extend(2..=4);
  326. assert_eq!(tv.capacity(), 4);
  327. assert_eq!(tv.as_slice(), [1, 2, 3, 4]);
  328. }
  329. #[cfg(feature = "serde")]
  330. #[test]
  331. fn TinyVec_ser_de_empty() {
  332. let tv: TinyVec<[i32; 0]> = tiny_vec![];
  333. assert_tokens(&tv, &[Token::Seq { len: Some(0) }, Token::SeqEnd]);
  334. }
  335. #[cfg(feature = "serde")]
  336. #[test]
  337. fn TinyVec_ser_de() {
  338. let tv: TinyVec<[i32; 4]> = tiny_vec![1, 2, 3, 4];
  339. assert_tokens(
  340. &tv,
  341. &[
  342. Token::Seq { len: Some(4) },
  343. Token::I32(1),
  344. Token::I32(2),
  345. Token::I32(3),
  346. Token::I32(4),
  347. Token::SeqEnd,
  348. ],
  349. );
  350. }
  351. #[cfg(feature = "serde")]
  352. #[test]
  353. fn TinyVec_ser_de_heap() {
  354. let mut tv: TinyVec<[i32; 4]> = tiny_vec![1, 2, 3, 4];
  355. tv.move_to_the_heap();
  356. assert_tokens(
  357. &tv,
  358. &[
  359. Token::Seq { len: Some(4) },
  360. Token::I32(1),
  361. Token::I32(2),
  362. Token::I32(3),
  363. Token::I32(4),
  364. Token::SeqEnd,
  365. ],
  366. );
  367. }
  368. #[test]
  369. fn TinyVec_pretty_debug() {
  370. let tv: TinyVec<[i32; 6]> = tiny_vec![1, 2, 3];
  371. let s = format!("{:#?}", tv);
  372. let expected = format!("{:#?}", tv.as_slice());
  373. assert_eq!(s, expected);
  374. }
  375. #[cfg(feature = "std")]
  376. #[test]
  377. fn TinyVec_std_io_write() {
  378. use std::io::Write;
  379. let mut tv: TinyVec<[u8; 3]> = TinyVec::new();
  380. tv.write_all(b"foo").ok();
  381. assert!(tv.is_inline());
  382. assert_eq!(tv, tiny_vec![b'f', b'o', b'o']);
  383. tv.write_all(b"bar").ok();
  384. assert!(tv.is_heap());
  385. assert_eq!(tv, tiny_vec![b'f', b'o', b'o', b'b', b'a', b'r']);
  386. }