slab.rs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. #![warn(rust_2018_idioms)]
  2. use slab::*;
  3. use std::panic::{catch_unwind, resume_unwind, AssertUnwindSafe};
  4. #[test]
  5. fn insert_get_remove_one() {
  6. let mut slab = Slab::new();
  7. assert!(slab.is_empty());
  8. let key = slab.insert(10);
  9. assert_eq!(slab[key], 10);
  10. assert_eq!(slab.get(key), Some(&10));
  11. assert!(!slab.is_empty());
  12. assert!(slab.contains(key));
  13. assert_eq!(slab.remove(key), 10);
  14. assert!(!slab.contains(key));
  15. assert!(slab.get(key).is_none());
  16. }
  17. #[test]
  18. fn insert_get_many() {
  19. let mut slab = Slab::with_capacity(10);
  20. for i in 0..10 {
  21. let key = slab.insert(i + 10);
  22. assert_eq!(slab[key], i + 10);
  23. }
  24. assert_eq!(slab.capacity(), 10);
  25. // Storing another one grows the slab
  26. let key = slab.insert(20);
  27. assert_eq!(slab[key], 20);
  28. // Capacity grows by 2x
  29. assert_eq!(slab.capacity(), 20);
  30. }
  31. #[test]
  32. fn insert_get_remove_many() {
  33. let mut slab = Slab::with_capacity(10);
  34. let mut keys = vec![];
  35. for i in 0..10 {
  36. for j in 0..10 {
  37. let val = (i * 10) + j;
  38. let key = slab.insert(val);
  39. keys.push((key, val));
  40. assert_eq!(slab[key], val);
  41. }
  42. for (key, val) in keys.drain(..) {
  43. assert_eq!(val, slab.remove(key));
  44. }
  45. }
  46. assert_eq!(10, slab.capacity());
  47. }
  48. #[test]
  49. fn insert_with_vacant_entry() {
  50. let mut slab = Slab::with_capacity(1);
  51. let key;
  52. {
  53. let entry = slab.vacant_entry();
  54. key = entry.key();
  55. entry.insert(123);
  56. }
  57. assert_eq!(123, slab[key]);
  58. }
  59. #[test]
  60. fn get_vacant_entry_without_using() {
  61. let mut slab = Slab::<usize>::with_capacity(1);
  62. let key = slab.vacant_entry().key();
  63. assert_eq!(key, slab.vacant_entry().key());
  64. }
  65. #[test]
  66. #[should_panic(expected = "invalid key")]
  67. fn invalid_get_panics() {
  68. let slab = Slab::<usize>::with_capacity(1);
  69. let _ = &slab[0];
  70. }
  71. #[test]
  72. #[should_panic(expected = "invalid key")]
  73. fn invalid_get_mut_panics() {
  74. let mut slab = Slab::<usize>::new();
  75. let _ = &mut slab[0];
  76. }
  77. #[test]
  78. #[should_panic(expected = "invalid key")]
  79. fn double_remove_panics() {
  80. let mut slab = Slab::<usize>::with_capacity(1);
  81. let key = slab.insert(123);
  82. slab.remove(key);
  83. slab.remove(key);
  84. }
  85. #[test]
  86. #[should_panic(expected = "invalid key")]
  87. fn invalid_remove_panics() {
  88. let mut slab = Slab::<usize>::with_capacity(1);
  89. slab.remove(0);
  90. }
  91. #[test]
  92. fn slab_get_mut() {
  93. let mut slab = Slab::new();
  94. let key = slab.insert(1);
  95. slab[key] = 2;
  96. assert_eq!(slab[key], 2);
  97. *slab.get_mut(key).unwrap() = 3;
  98. assert_eq!(slab[key], 3);
  99. }
  100. #[test]
  101. fn key_of_tagged() {
  102. let mut slab = Slab::new();
  103. slab.insert(0);
  104. assert_eq!(slab.key_of(&slab[0]), 0);
  105. }
  106. #[test]
  107. fn key_of_layout_optimizable() {
  108. // Entry<&str> doesn't need a discriminant tag because it can use the
  109. // nonzero-ness of ptr and store Vacant's next at the same offset as len
  110. let mut slab = Slab::new();
  111. slab.insert("foo");
  112. slab.insert("bar");
  113. let third = slab.insert("baz");
  114. slab.insert("quux");
  115. assert_eq!(slab.key_of(&slab[third]), third);
  116. }
  117. #[test]
  118. fn key_of_zst() {
  119. let mut slab = Slab::new();
  120. slab.insert(());
  121. let second = slab.insert(());
  122. slab.insert(());
  123. assert_eq!(slab.key_of(&slab[second]), second);
  124. }
  125. #[test]
  126. fn reserve_does_not_allocate_if_available() {
  127. let mut slab = Slab::with_capacity(10);
  128. let mut keys = vec![];
  129. for i in 0..6 {
  130. keys.push(slab.insert(i));
  131. }
  132. for key in 0..4 {
  133. slab.remove(key);
  134. }
  135. assert!(slab.capacity() - slab.len() == 8);
  136. slab.reserve(8);
  137. assert_eq!(10, slab.capacity());
  138. }
  139. #[test]
  140. fn reserve_exact_does_not_allocate_if_available() {
  141. let mut slab = Slab::with_capacity(10);
  142. let mut keys = vec![];
  143. for i in 0..6 {
  144. keys.push(slab.insert(i));
  145. }
  146. for key in 0..4 {
  147. slab.remove(key);
  148. }
  149. assert!(slab.capacity() - slab.len() == 8);
  150. slab.reserve_exact(8);
  151. assert_eq!(10, slab.capacity());
  152. }
  153. #[test]
  154. #[should_panic(expected = "capacity overflow")]
  155. fn reserve_does_panic_with_capacity_overflow() {
  156. let mut slab = Slab::with_capacity(10);
  157. slab.insert(true);
  158. slab.reserve(std::usize::MAX);
  159. }
  160. #[test]
  161. #[should_panic(expected = "capacity overflow")]
  162. fn reserve_exact_does_panic_with_capacity_overflow() {
  163. let mut slab = Slab::with_capacity(10);
  164. slab.insert(true);
  165. slab.reserve_exact(std::usize::MAX);
  166. }
  167. #[test]
  168. fn retain() {
  169. let mut slab = Slab::with_capacity(2);
  170. let key1 = slab.insert(0);
  171. let key2 = slab.insert(1);
  172. slab.retain(|key, x| {
  173. assert_eq!(key, *x);
  174. *x % 2 == 0
  175. });
  176. assert_eq!(slab.len(), 1);
  177. assert_eq!(slab[key1], 0);
  178. assert!(!slab.contains(key2));
  179. // Ensure consistency is retained
  180. let key = slab.insert(123);
  181. assert_eq!(key, key2);
  182. assert_eq!(2, slab.len());
  183. assert_eq!(2, slab.capacity());
  184. // Inserting another element grows
  185. let key = slab.insert(345);
  186. assert_eq!(key, 2);
  187. assert_eq!(4, slab.capacity());
  188. }
  189. #[test]
  190. fn into_iter() {
  191. let mut slab = Slab::new();
  192. for i in 0..8 {
  193. slab.insert(i);
  194. }
  195. slab.remove(0);
  196. slab.remove(4);
  197. slab.remove(5);
  198. slab.remove(7);
  199. let vals: Vec<_> = slab
  200. .into_iter()
  201. .inspect(|&(key, val)| assert_eq!(key, val))
  202. .map(|(_, val)| val)
  203. .collect();
  204. assert_eq!(vals, vec![1, 2, 3, 6]);
  205. }
  206. #[test]
  207. fn into_iter_rev() {
  208. let mut slab = Slab::new();
  209. for i in 0..4 {
  210. slab.insert(i);
  211. }
  212. let mut iter = slab.into_iter();
  213. assert_eq!(iter.next_back(), Some((3, 3)));
  214. assert_eq!(iter.next_back(), Some((2, 2)));
  215. assert_eq!(iter.next(), Some((0, 0)));
  216. assert_eq!(iter.next_back(), Some((1, 1)));
  217. assert_eq!(iter.next_back(), None);
  218. assert_eq!(iter.next(), None);
  219. }
  220. #[test]
  221. fn iter() {
  222. let mut slab = Slab::new();
  223. for i in 0..4 {
  224. slab.insert(i);
  225. }
  226. let vals: Vec<_> = slab
  227. .iter()
  228. .enumerate()
  229. .map(|(i, (key, val))| {
  230. assert_eq!(i, key);
  231. *val
  232. })
  233. .collect();
  234. assert_eq!(vals, vec![0, 1, 2, 3]);
  235. slab.remove(1);
  236. let vals: Vec<_> = slab.iter().map(|(_, r)| *r).collect();
  237. assert_eq!(vals, vec![0, 2, 3]);
  238. }
  239. #[test]
  240. fn iter_rev() {
  241. let mut slab = Slab::new();
  242. for i in 0..4 {
  243. slab.insert(i);
  244. }
  245. slab.remove(0);
  246. let vals = slab.iter().rev().collect::<Vec<_>>();
  247. assert_eq!(vals, vec![(3, &3), (2, &2), (1, &1)]);
  248. }
  249. #[test]
  250. fn iter_mut() {
  251. let mut slab = Slab::new();
  252. for i in 0..4 {
  253. slab.insert(i);
  254. }
  255. for (i, (key, e)) in slab.iter_mut().enumerate() {
  256. assert_eq!(i, key);
  257. *e += 1;
  258. }
  259. let vals: Vec<_> = slab.iter().map(|(_, r)| *r).collect();
  260. assert_eq!(vals, vec![1, 2, 3, 4]);
  261. slab.remove(2);
  262. for (_, e) in slab.iter_mut() {
  263. *e += 1;
  264. }
  265. let vals: Vec<_> = slab.iter().map(|(_, r)| *r).collect();
  266. assert_eq!(vals, vec![2, 3, 5]);
  267. }
  268. #[test]
  269. fn iter_mut_rev() {
  270. let mut slab = Slab::new();
  271. for i in 0..4 {
  272. slab.insert(i);
  273. }
  274. slab.remove(2);
  275. {
  276. let mut iter = slab.iter_mut();
  277. assert_eq!(iter.next(), Some((0, &mut 0)));
  278. let mut prev_key = !0;
  279. for (key, e) in iter.rev() {
  280. *e += 10;
  281. assert!(prev_key > key);
  282. prev_key = key;
  283. }
  284. }
  285. assert_eq!(slab[0], 0);
  286. assert_eq!(slab[1], 11);
  287. assert_eq!(slab[3], 13);
  288. assert!(!slab.contains(2));
  289. }
  290. #[test]
  291. fn from_iterator_sorted() {
  292. let mut slab = (0..5).map(|i| (i, i)).collect::<Slab<_>>();
  293. assert_eq!(slab.len(), 5);
  294. assert_eq!(slab[0], 0);
  295. assert_eq!(slab[2], 2);
  296. assert_eq!(slab[4], 4);
  297. assert_eq!(slab.vacant_entry().key(), 5);
  298. }
  299. #[test]
  300. fn from_iterator_new_in_order() {
  301. // all new keys come in increasing order, but existing keys are overwritten
  302. let mut slab = [(0, 'a'), (1, 'a'), (1, 'b'), (0, 'b'), (9, 'a'), (0, 'c')]
  303. .iter()
  304. .cloned()
  305. .collect::<Slab<_>>();
  306. assert_eq!(slab.len(), 3);
  307. assert_eq!(slab[0], 'c');
  308. assert_eq!(slab[1], 'b');
  309. assert_eq!(slab[9], 'a');
  310. assert_eq!(slab.get(5), None);
  311. assert_eq!(slab.vacant_entry().key(), 8);
  312. }
  313. #[test]
  314. fn from_iterator_unordered() {
  315. let mut slab = vec![(1, "one"), (50, "fifty"), (3, "three"), (20, "twenty")]
  316. .into_iter()
  317. .collect::<Slab<_>>();
  318. assert_eq!(slab.len(), 4);
  319. assert_eq!(slab.vacant_entry().key(), 0);
  320. let mut iter = slab.iter();
  321. assert_eq!(iter.next(), Some((1, &"one")));
  322. assert_eq!(iter.next(), Some((3, &"three")));
  323. assert_eq!(iter.next(), Some((20, &"twenty")));
  324. assert_eq!(iter.next(), Some((50, &"fifty")));
  325. assert_eq!(iter.next(), None);
  326. }
  327. // https://github.com/tokio-rs/slab/issues/100
  328. #[test]
  329. fn from_iterator_issue_100() {
  330. let mut slab: slab::Slab<()> = vec![(1, ())].into_iter().collect();
  331. assert_eq!(slab.len(), 1);
  332. assert_eq!(slab.insert(()), 0);
  333. assert_eq!(slab.insert(()), 2);
  334. assert_eq!(slab.insert(()), 3);
  335. let mut slab: slab::Slab<()> = vec![(1, ()), (2, ())].into_iter().collect();
  336. assert_eq!(slab.len(), 2);
  337. assert_eq!(slab.insert(()), 0);
  338. assert_eq!(slab.insert(()), 3);
  339. assert_eq!(slab.insert(()), 4);
  340. let mut slab: slab::Slab<()> = vec![(1, ()), (3, ())].into_iter().collect();
  341. assert_eq!(slab.len(), 2);
  342. assert_eq!(slab.insert(()), 2);
  343. assert_eq!(slab.insert(()), 0);
  344. assert_eq!(slab.insert(()), 4);
  345. let mut slab: slab::Slab<()> = vec![(0, ()), (2, ()), (3, ()), (5, ())]
  346. .into_iter()
  347. .collect();
  348. assert_eq!(slab.len(), 4);
  349. assert_eq!(slab.insert(()), 4);
  350. assert_eq!(slab.insert(()), 1);
  351. assert_eq!(slab.insert(()), 6);
  352. }
  353. #[test]
  354. fn clear() {
  355. let mut slab = Slab::new();
  356. for i in 0..4 {
  357. slab.insert(i);
  358. }
  359. // clear full
  360. slab.clear();
  361. assert!(slab.is_empty());
  362. assert_eq!(0, slab.len());
  363. assert_eq!(4, slab.capacity());
  364. for i in 0..2 {
  365. slab.insert(i);
  366. }
  367. let vals: Vec<_> = slab.iter().map(|(_, r)| *r).collect();
  368. assert_eq!(vals, vec![0, 1]);
  369. // clear half-filled
  370. slab.clear();
  371. assert!(slab.is_empty());
  372. }
  373. #[test]
  374. fn shrink_to_fit_empty() {
  375. let mut slab = Slab::<bool>::with_capacity(20);
  376. slab.shrink_to_fit();
  377. assert_eq!(slab.capacity(), 0);
  378. }
  379. #[test]
  380. fn shrink_to_fit_no_vacant() {
  381. let mut slab = Slab::with_capacity(20);
  382. slab.insert(String::new());
  383. slab.shrink_to_fit();
  384. assert!(slab.capacity() < 10);
  385. }
  386. #[test]
  387. fn shrink_to_fit_doesnt_move() {
  388. let mut slab = Slab::with_capacity(8);
  389. slab.insert("foo");
  390. let bar = slab.insert("bar");
  391. slab.insert("baz");
  392. let quux = slab.insert("quux");
  393. slab.remove(quux);
  394. slab.remove(bar);
  395. slab.shrink_to_fit();
  396. assert_eq!(slab.len(), 2);
  397. assert!(slab.capacity() >= 3);
  398. assert_eq!(slab.get(0), Some(&"foo"));
  399. assert_eq!(slab.get(2), Some(&"baz"));
  400. assert_eq!(slab.vacant_entry().key(), bar);
  401. }
  402. #[test]
  403. fn shrink_to_fit_doesnt_recreate_list_when_nothing_can_be_done() {
  404. let mut slab = Slab::with_capacity(16);
  405. for i in 0..4 {
  406. slab.insert(Box::new(i));
  407. }
  408. slab.remove(0);
  409. slab.remove(2);
  410. slab.remove(1);
  411. assert_eq!(slab.vacant_entry().key(), 1);
  412. slab.shrink_to_fit();
  413. assert_eq!(slab.len(), 1);
  414. assert!(slab.capacity() >= 4);
  415. assert_eq!(slab.vacant_entry().key(), 1);
  416. }
  417. #[test]
  418. fn compact_empty() {
  419. let mut slab = Slab::new();
  420. slab.compact(|_, _, _| panic!());
  421. assert_eq!(slab.len(), 0);
  422. assert_eq!(slab.capacity(), 0);
  423. slab.reserve(20);
  424. slab.compact(|_, _, _| panic!());
  425. assert_eq!(slab.len(), 0);
  426. assert_eq!(slab.capacity(), 0);
  427. slab.insert(0);
  428. slab.insert(1);
  429. slab.insert(2);
  430. slab.remove(1);
  431. slab.remove(2);
  432. slab.remove(0);
  433. slab.compact(|_, _, _| panic!());
  434. assert_eq!(slab.len(), 0);
  435. assert_eq!(slab.capacity(), 0);
  436. }
  437. #[test]
  438. fn compact_no_moves_needed() {
  439. let mut slab = Slab::new();
  440. for i in 0..10 {
  441. slab.insert(i);
  442. }
  443. slab.remove(8);
  444. slab.remove(9);
  445. slab.remove(6);
  446. slab.remove(7);
  447. slab.compact(|_, _, _| panic!());
  448. assert_eq!(slab.len(), 6);
  449. for ((index, &value), want) in slab.iter().zip(0..6) {
  450. assert!(index == value);
  451. assert_eq!(index, want);
  452. }
  453. assert!(slab.capacity() >= 6 && slab.capacity() < 10);
  454. }
  455. #[test]
  456. fn compact_moves_successfully() {
  457. let mut slab = Slab::with_capacity(20);
  458. for i in 0..10 {
  459. slab.insert(i);
  460. }
  461. for &i in &[0, 5, 9, 6, 3] {
  462. slab.remove(i);
  463. }
  464. let mut moved = 0;
  465. slab.compact(|&mut v, from, to| {
  466. assert!(from > to);
  467. assert!(from >= 5);
  468. assert!(to < 5);
  469. assert_eq!(from, v);
  470. moved += 1;
  471. true
  472. });
  473. assert_eq!(slab.len(), 5);
  474. assert_eq!(moved, 2);
  475. assert_eq!(slab.vacant_entry().key(), 5);
  476. assert!(slab.capacity() >= 5 && slab.capacity() < 20);
  477. let mut iter = slab.iter();
  478. assert_eq!(iter.next(), Some((0, &8)));
  479. assert_eq!(iter.next(), Some((1, &1)));
  480. assert_eq!(iter.next(), Some((2, &2)));
  481. assert_eq!(iter.next(), Some((3, &7)));
  482. assert_eq!(iter.next(), Some((4, &4)));
  483. assert_eq!(iter.next(), None);
  484. }
  485. #[test]
  486. fn compact_doesnt_move_if_closure_errors() {
  487. let mut slab = Slab::with_capacity(20);
  488. for i in 0..10 {
  489. slab.insert(i);
  490. }
  491. for &i in &[9, 3, 1, 4, 0] {
  492. slab.remove(i);
  493. }
  494. slab.compact(|&mut v, from, to| {
  495. assert!(from > to);
  496. assert_eq!(from, v);
  497. v != 6
  498. });
  499. assert_eq!(slab.len(), 5);
  500. assert!(slab.capacity() >= 7 && slab.capacity() < 20);
  501. assert_eq!(slab.vacant_entry().key(), 3);
  502. let mut iter = slab.iter();
  503. assert_eq!(iter.next(), Some((0, &8)));
  504. assert_eq!(iter.next(), Some((1, &7)));
  505. assert_eq!(iter.next(), Some((2, &2)));
  506. assert_eq!(iter.next(), Some((5, &5)));
  507. assert_eq!(iter.next(), Some((6, &6)));
  508. assert_eq!(iter.next(), None);
  509. }
  510. #[test]
  511. fn compact_handles_closure_panic() {
  512. let mut slab = Slab::new();
  513. for i in 0..10 {
  514. slab.insert(i);
  515. }
  516. for i in 1..6 {
  517. slab.remove(i);
  518. }
  519. let result = catch_unwind(AssertUnwindSafe(|| {
  520. slab.compact(|&mut v, from, to| {
  521. assert!(from > to);
  522. assert_eq!(from, v);
  523. if v == 7 {
  524. panic!("test");
  525. }
  526. true
  527. })
  528. }));
  529. match result {
  530. Err(ref payload) if payload.downcast_ref() == Some(&"test") => {}
  531. Err(bug) => resume_unwind(bug),
  532. Ok(()) => unreachable!(),
  533. }
  534. assert_eq!(slab.len(), 5 - 1);
  535. assert_eq!(slab.vacant_entry().key(), 3);
  536. let mut iter = slab.iter();
  537. assert_eq!(iter.next(), Some((0, &0)));
  538. assert_eq!(iter.next(), Some((1, &9)));
  539. assert_eq!(iter.next(), Some((2, &8)));
  540. assert_eq!(iter.next(), Some((6, &6)));
  541. assert_eq!(iter.next(), None);
  542. }
  543. #[test]
  544. fn fully_consumed_drain() {
  545. let mut slab = Slab::new();
  546. for i in 0..3 {
  547. slab.insert(i);
  548. }
  549. {
  550. let mut drain = slab.drain();
  551. assert_eq!(Some(0), drain.next());
  552. assert_eq!(Some(1), drain.next());
  553. assert_eq!(Some(2), drain.next());
  554. assert_eq!(None, drain.next());
  555. }
  556. assert!(slab.is_empty());
  557. }
  558. #[test]
  559. fn partially_consumed_drain() {
  560. let mut slab = Slab::new();
  561. for i in 0..3 {
  562. slab.insert(i);
  563. }
  564. {
  565. let mut drain = slab.drain();
  566. assert_eq!(Some(0), drain.next());
  567. }
  568. assert!(slab.is_empty())
  569. }
  570. #[test]
  571. fn drain_rev() {
  572. let mut slab = Slab::new();
  573. for i in 0..10 {
  574. slab.insert(i);
  575. }
  576. slab.remove(9);
  577. let vals: Vec<u64> = slab.drain().rev().collect();
  578. assert_eq!(vals, (0..9).rev().collect::<Vec<u64>>());
  579. }
  580. #[test]
  581. fn try_remove() {
  582. let mut slab = Slab::new();
  583. let key = slab.insert(1);
  584. assert_eq!(slab.try_remove(key), Some(1));
  585. assert_eq!(slab.try_remove(key), None);
  586. assert_eq!(slab.get(key), None);
  587. }