tree.rs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. use parking_lot::{MappedRwLockReadGuard, RwLock, RwLockReadGuard, RwLockWriteGuard};
  2. use rustc_hash::{FxHashMap, FxHasher};
  3. use std::any::{Any, TypeId};
  4. use std::collections::VecDeque;
  5. use std::fmt::Debug;
  6. use std::hash::BuildHasherDefault;
  7. use crate::{AnyMapLike, Dependancy};
  8. #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Hash)]
  9. pub struct NodeId(pub usize);
  10. #[derive(PartialEq, Eq, Clone, Debug)]
  11. pub(crate) struct Node {
  12. parent: Option<NodeId>,
  13. children: Vec<NodeId>,
  14. height: u16,
  15. }
  16. #[derive(Debug)]
  17. pub(crate) struct Tree {
  18. nodes: AnySlab,
  19. root: NodeId,
  20. }
  21. impl Tree {
  22. pub fn new() -> Self {
  23. let mut nodes = AnySlab::default();
  24. let mut node = nodes.insert();
  25. node.insert(Node {
  26. parent: None,
  27. children: Vec::new(),
  28. height: 0,
  29. });
  30. let root = node.id();
  31. Self { nodes, root }
  32. }
  33. fn node_slab(&self) -> &SlabStorage<Node> {
  34. self.nodes.read_slab()
  35. }
  36. pub fn get_node_data(&self, id: NodeId) -> &Node {
  37. self.node_slab().get(id).unwrap()
  38. }
  39. fn node_slab_mut(&mut self) -> &mut SlabStorage<Node> {
  40. self.nodes.write_slab()
  41. }
  42. pub fn get_node_data_mut(&mut self, id: NodeId) -> &mut Node {
  43. self.node_slab_mut().get_mut(id).unwrap()
  44. }
  45. pub fn remove(&mut self, id: NodeId) {
  46. fn recurse(tree: &mut Tree, id: NodeId) {
  47. let children = { tree.get_node_data(id).children.clone() };
  48. for child in children {
  49. recurse(tree, child);
  50. }
  51. tree.nodes.remove(id);
  52. }
  53. {
  54. let node_data_mut = self.node_slab_mut();
  55. if let Some(parent) = node_data_mut.get(id).unwrap().parent {
  56. let parent = node_data_mut.get_mut(parent).unwrap();
  57. parent.children.retain(|&child| child != id);
  58. }
  59. }
  60. recurse(self, id);
  61. }
  62. fn set_height(&mut self, node: NodeId, height: u16) {
  63. let children = {
  64. let mut node = self.get_node_data_mut(node);
  65. node.height = height;
  66. node.children.clone()
  67. };
  68. for child in children {
  69. self.set_height(child, height + 1);
  70. }
  71. }
  72. pub fn create_node(&mut self) -> EntryBuilder<'_> {
  73. let mut node = self.nodes.insert();
  74. node.insert(Node {
  75. parent: None,
  76. children: Vec::new(),
  77. height: 0,
  78. });
  79. node
  80. }
  81. pub fn add_child(&mut self, parent: NodeId, new: NodeId) {
  82. let node_state = self.node_slab_mut();
  83. node_state.get_mut(new).unwrap().parent = Some(parent);
  84. let parent = node_state.get_mut(parent).unwrap();
  85. parent.children.push(new);
  86. let height = parent.height + 1;
  87. self.set_height(new, height);
  88. }
  89. pub fn replace(&mut self, old_id: NodeId, new_id: NodeId) {
  90. {
  91. let node_state = self.node_slab_mut();
  92. // update the parent's link to the child
  93. if let Some(parent_id) = node_state.get(old_id).unwrap().parent {
  94. let parent = node_state.get_mut(parent_id).unwrap();
  95. for id in &mut parent.children {
  96. if *id == old_id {
  97. *id = new_id;
  98. break;
  99. }
  100. }
  101. let height = parent.height + 1;
  102. self.set_height(new_id, height);
  103. }
  104. }
  105. // remove the old node
  106. self.remove(old_id);
  107. }
  108. pub fn insert_before(&mut self, old_id: NodeId, new_id: NodeId) {
  109. let node_state = self.node_slab_mut();
  110. let old_node = node_state.get(old_id).unwrap();
  111. let parent_id = old_node.parent.expect("tried to insert before root");
  112. node_state.get_mut(new_id).unwrap().parent = Some(parent_id);
  113. let parent = node_state.get_mut(parent_id).unwrap();
  114. let index = parent
  115. .children
  116. .iter()
  117. .position(|child| *child == old_id)
  118. .unwrap();
  119. parent.children.insert(index, new_id);
  120. let height = parent.height + 1;
  121. self.set_height(new_id, height);
  122. }
  123. pub fn insert_after(&mut self, old_id: NodeId, new_id: NodeId) {
  124. let node_state = self.node_slab_mut();
  125. let old_node = node_state.get(old_id).unwrap();
  126. let parent_id = old_node.parent.expect("tried to insert before root");
  127. node_state.get_mut(new_id).unwrap().parent = Some(parent_id);
  128. let parent = node_state.get_mut(parent_id).unwrap();
  129. let index = parent
  130. .children
  131. .iter()
  132. .position(|child| *child == old_id)
  133. .unwrap();
  134. parent.children.insert(index + 1, new_id);
  135. let height = parent.height + 1;
  136. self.set_height(new_id, height);
  137. }
  138. pub fn size(&self) -> usize {
  139. self.nodes.len()
  140. }
  141. pub fn dynamically_borrowed(&mut self) -> DynamicallyBorrowedTree<'_> {
  142. DynamicallyBorrowedTree {
  143. nodes: self.nodes.dynamically_borrowed(),
  144. }
  145. }
  146. pub fn get<T: Any>(&self, id: NodeId) -> Option<&T> {
  147. self.nodes.read_slab().get(id)
  148. }
  149. pub fn get_mut<T: Any>(&mut self, id: NodeId) -> Option<&mut T> {
  150. self.nodes.write_slab().get_mut(id)
  151. }
  152. pub fn contains(&self, id: NodeId) -> bool {
  153. self.nodes.contains(id)
  154. }
  155. pub fn root(&self) -> NodeId {
  156. self.root
  157. }
  158. pub fn parent_id(&self, id: NodeId) -> Option<NodeId> {
  159. self.get_node_data(id).parent
  160. }
  161. pub fn children_ids(&self, id: NodeId) -> Option<&[NodeId]> {
  162. Some(&self.get_node_data(id).children)
  163. }
  164. pub fn height(&self, id: NodeId) -> Option<u16> {
  165. Some(self.get_node_data(id).height)
  166. }
  167. }
  168. pub(crate) struct DynamicallyBorrowedTree<'a> {
  169. nodes: DynamiclyBorrowedAnySlabView<'a>,
  170. }
  171. impl<'a> DynamicallyBorrowedTree<'a> {
  172. pub fn view(
  173. &self,
  174. immutable: impl IntoIterator<Item = TypeId>,
  175. mutable: impl IntoIterator<Item = TypeId>,
  176. ) -> TreeStateView<'_, 'a> {
  177. let nodes_data = self.node_slab();
  178. let mut nodes = FxHashMap::default();
  179. for id in immutable {
  180. nodes.insert(id, MaybeRead::Read(self.nodes.get_slab(id).unwrap()));
  181. }
  182. for id in mutable {
  183. nodes.insert(id, MaybeRead::Write(self.nodes.get_slab_mut(id).unwrap()));
  184. }
  185. TreeStateView { nodes_data, nodes }
  186. }
  187. fn node_slab(&self) -> MappedRwLockReadGuard<SlabStorage<Node>> {
  188. RwLockReadGuard::map(self.nodes.get_slab(TypeId::of::<Node>()).unwrap(), |slab| {
  189. slab.as_any().downcast_ref().unwrap()
  190. })
  191. }
  192. }
  193. enum MaybeRead<'a, 'b> {
  194. Read(RwLockReadGuard<'a, &'b mut dyn AnySlabStorageImpl>),
  195. Write(RwLockWriteGuard<'a, &'b mut dyn AnySlabStorageImpl>),
  196. }
  197. #[derive(Clone, Copy)]
  198. pub struct TreeStateViewEntry<'a, 'b> {
  199. view: &'a TreeStateView<'a, 'b>,
  200. id: NodeId,
  201. }
  202. impl<'a, 'b> AnyMapLike<'a> for TreeStateViewEntry<'a, 'b> {
  203. fn get<T: Any>(self) -> Option<&'a T> {
  204. self.view.get_slab().and_then(|slab| slab.get(self.id))
  205. }
  206. }
  207. pub struct TreeStateView<'a, 'b> {
  208. nodes_data: MappedRwLockReadGuard<'a, SlabStorage<Node>>,
  209. nodes: FxHashMap<TypeId, MaybeRead<'a, 'b>>,
  210. }
  211. impl<'a, 'b> TreeStateView<'a, 'b> {
  212. fn get_slab<T: Any>(&self) -> Option<&SlabStorage<T>> {
  213. self.nodes
  214. .get(&TypeId::of::<T>())
  215. .and_then(|gaurd| match gaurd {
  216. MaybeRead::Read(gaurd) => gaurd.as_any().downcast_ref::<SlabStorage<T>>(),
  217. MaybeRead::Write(gaurd) => gaurd.as_any().downcast_ref::<SlabStorage<T>>(),
  218. })
  219. }
  220. fn get_slab_mut<T: Any>(&mut self) -> Option<&mut SlabStorage<T>> {
  221. self.nodes
  222. .get_mut(&TypeId::of::<T>())
  223. .and_then(|gaurd| match gaurd {
  224. MaybeRead::Read(_gaurd) => None,
  225. MaybeRead::Write(gaurd) => gaurd.as_any_mut().downcast_mut::<SlabStorage<T>>(),
  226. })
  227. }
  228. pub fn children_ids(&self, id: NodeId) -> Option<Vec<NodeId>> {
  229. self.nodes_data.get(id).map(|node| node.children.clone())
  230. }
  231. pub fn parent_id(&self, id: NodeId) -> Option<NodeId> {
  232. self.nodes_data.get(id).and_then(|node| node.parent)
  233. }
  234. pub fn height(&self, id: NodeId) -> Option<u16> {
  235. self.nodes_data.get(id).map(|n| n.height)
  236. }
  237. pub fn get<T: Dependancy>(&self, id: NodeId) -> Option<T::ElementBorrowed<'_>> {
  238. T::borrow_elements_from(self.entry(id))
  239. }
  240. pub fn get_single<T: Any>(&self, id: NodeId) -> Option<&T> {
  241. self.get_slab().and_then(|slab| slab.get(id))
  242. }
  243. pub fn get_mut<T: Any>(&mut self, id: NodeId) -> Option<&mut T> {
  244. self.get_slab_mut().and_then(|slab| slab.get_mut(id))
  245. }
  246. pub fn entry(&self, id: NodeId) -> TreeStateViewEntry<'_, 'b> {
  247. TreeStateViewEntry { view: self, id }
  248. }
  249. pub fn children<T: Dependancy>(&self, id: NodeId) -> Option<Vec<T::ElementBorrowed<'_>>> {
  250. let ids = self.children_ids(id);
  251. ids.and_then(|ids| {
  252. ids.iter()
  253. .map(|id| T::borrow_elements_from(self.entry(*id)))
  254. .collect()
  255. })
  256. }
  257. pub fn parent<T: Dependancy>(&self, id: NodeId) -> Option<T::ElementBorrowed<'_>> {
  258. T::borrow_elements_from(self.entry(id))
  259. }
  260. }
  261. #[test]
  262. fn creation() {
  263. let mut tree = Tree::new();
  264. let parent_id = tree.root;
  265. tree.insert(parent_id, 1i32);
  266. let mut child = tree.create_node();
  267. child.insert(0i32);
  268. let child_id = child.id();
  269. tree.add_child(parent_id, child_id);
  270. println!("Tree: {:#?}", tree);
  271. assert_eq!(tree.size(), 2);
  272. assert_eq!(tree.height(parent_id), Some(0));
  273. assert_eq!(tree.height(child_id), Some(1));
  274. assert_eq!(tree.parent_id(parent_id), None);
  275. assert_eq!(tree.parent_id(child_id).unwrap(), parent_id);
  276. assert_eq!(tree.children_ids(parent_id).unwrap(), &[child_id]);
  277. assert_eq!(*tree.read::<i32>(parent_id).unwrap(), 1);
  278. assert_eq!(*tree.read::<i32>(child_id).unwrap(), 0);
  279. }
  280. #[test]
  281. fn insertion() {
  282. let mut tree = Tree::new();
  283. let parent = tree.root();
  284. tree.insert(parent, 0);
  285. let mut child = tree.create_node();
  286. child.insert(2);
  287. let child = child.id();
  288. tree.add_child(parent, child);
  289. let mut before = tree.create_node();
  290. before.insert(1);
  291. let before = before.id();
  292. tree.insert_before(child, before);
  293. let mut after = tree.create_node();
  294. after.insert(3);
  295. let after = after.id();
  296. tree.insert_after(child, after);
  297. println!("Tree: {:#?}", tree);
  298. assert_eq!(tree.size(), 4);
  299. assert_eq!(tree.height(parent), Some(0));
  300. assert_eq!(tree.height(child), Some(1));
  301. assert_eq!(tree.height(before), Some(1));
  302. assert_eq!(tree.height(after), Some(1));
  303. assert_eq!(tree.parent_id(before).unwrap(), parent);
  304. assert_eq!(tree.parent_id(child).unwrap(), parent);
  305. assert_eq!(tree.parent_id(after).unwrap(), parent);
  306. assert_eq!(tree.children_ids(parent).unwrap(), &[before, child, after]);
  307. assert_eq!(*tree.read::<i32>(parent).unwrap(), 0);
  308. assert_eq!(*tree.read::<i32>(before).unwrap(), 1);
  309. assert_eq!(*tree.read::<i32>(child).unwrap(), 2);
  310. assert_eq!(*tree.read::<i32>(after).unwrap(), 3);
  311. }
  312. #[test]
  313. fn deletion() {
  314. let mut tree = Tree::new();
  315. let parent = tree.root();
  316. tree.insert(parent, 0);
  317. let mut child = tree.create_node();
  318. child.insert(2);
  319. let child = child.id();
  320. tree.add_child(parent, child);
  321. let mut before = tree.create_node();
  322. before.insert(1);
  323. let before = before.id();
  324. tree.insert_before(child, before);
  325. let mut after = tree.create_node();
  326. after.insert(3);
  327. let after = after.id();
  328. tree.insert_after(child, after);
  329. println!("Tree: {:#?}", tree);
  330. assert_eq!(tree.size(), 4);
  331. assert_eq!(tree.height(parent), Some(0));
  332. assert_eq!(tree.height(child), Some(1));
  333. assert_eq!(tree.height(before), Some(1));
  334. assert_eq!(tree.height(after), Some(1));
  335. assert_eq!(tree.parent_id(before).unwrap(), parent);
  336. assert_eq!(tree.parent_id(child).unwrap(), parent);
  337. assert_eq!(tree.parent_id(after).unwrap(), parent);
  338. assert_eq!(tree.children_ids(parent).unwrap(), &[before, child, after]);
  339. assert_eq!(*tree.read::<i32>(parent).unwrap(), 0);
  340. assert_eq!(*tree.read::<i32>(before).unwrap(), 1);
  341. assert_eq!(*tree.read::<i32>(child).unwrap(), 2);
  342. assert_eq!(*tree.read::<i32>(after).unwrap(), 3);
  343. tree.remove(child);
  344. println!("Tree: {:#?}", tree);
  345. assert_eq!(tree.size(), 3);
  346. assert_eq!(tree.height(parent), Some(0));
  347. assert_eq!(tree.height(before), Some(1));
  348. assert_eq!(tree.height(after), Some(1));
  349. assert_eq!(tree.parent_id(before).unwrap(), parent);
  350. assert_eq!(tree.parent_id(after).unwrap(), parent);
  351. assert_eq!(tree.children_ids(parent).unwrap(), &[before, after]);
  352. assert_eq!(*tree.read::<i32>(parent).unwrap(), 0);
  353. assert_eq!(*tree.read::<i32>(before).unwrap(), 1);
  354. assert_eq!(tree.read::<i32>(child), None);
  355. assert_eq!(*tree.read::<i32>(after).unwrap(), 3);
  356. tree.remove(before);
  357. println!("Tree: {:#?}", tree);
  358. assert_eq!(tree.size(), 2);
  359. assert_eq!(tree.height(parent), Some(0));
  360. assert_eq!(tree.height(after), Some(1));
  361. assert_eq!(tree.parent_id(after).unwrap(), parent);
  362. assert_eq!(tree.children_ids(parent).unwrap(), &[after]);
  363. assert_eq!(*tree.read::<i32>(parent).unwrap(), 0);
  364. assert_eq!(tree.read::<i32>(before), None);
  365. assert_eq!(*tree.read::<i32>(after).unwrap(), 3);
  366. tree.remove(after);
  367. println!("Tree: {:#?}", tree);
  368. assert_eq!(tree.size(), 1);
  369. assert_eq!(tree.height(parent), Some(0));
  370. assert_eq!(tree.children_ids(parent).unwrap(), &[]);
  371. assert_eq!(*tree.read::<i32>(parent).unwrap(), 0);
  372. assert_eq!(tree.read::<i32>(after), None);
  373. }
  374. #[derive(Debug)]
  375. pub(crate) struct SlabStorage<T> {
  376. data: Vec<Option<T>>,
  377. }
  378. impl<T> Default for SlabStorage<T> {
  379. fn default() -> Self {
  380. Self { data: Vec::new() }
  381. }
  382. }
  383. trait AnySlabStorageImpl: Any + Send + Sync {
  384. fn remove(&mut self, id: NodeId);
  385. fn as_any(&self) -> &dyn Any;
  386. fn as_any_mut(&mut self) -> &mut dyn Any;
  387. }
  388. impl<T> SlabStorage<T> {
  389. fn get(&self, id: NodeId) -> Option<&T> {
  390. self.data.get(id.0).and_then(|x| x.as_ref())
  391. }
  392. fn get_mut(&mut self, id: NodeId) -> Option<&mut T> {
  393. self.data.get_mut(id.0).and_then(|x| x.as_mut())
  394. }
  395. fn insert(&mut self, id: NodeId, value: T) {
  396. let idx = id.0;
  397. if idx >= self.data.len() {
  398. self.data.resize_with(idx + 1, || None);
  399. }
  400. self.data[idx] = Some(value);
  401. }
  402. }
  403. impl<T: 'static + Send + Sync> AnySlabStorageImpl for SlabStorage<T> {
  404. fn remove(&mut self, id: NodeId) {
  405. self.data[id.0].take();
  406. }
  407. fn as_any(&self) -> &dyn Any {
  408. self
  409. }
  410. fn as_any_mut(&mut self) -> &mut dyn Any {
  411. self
  412. }
  413. }
  414. pub(crate) struct DynamiclyBorrowedAnySlabView<'a> {
  415. data: hashbrown::HashMap<
  416. TypeId,
  417. RwLock<&'a mut dyn AnySlabStorageImpl>,
  418. BuildHasherDefault<FxHasher>,
  419. >,
  420. }
  421. impl<'a> DynamiclyBorrowedAnySlabView<'a> {
  422. fn get_slab<'b>(
  423. &'b self,
  424. type_id: TypeId,
  425. ) -> Option<RwLockReadGuard<'b, &'a mut dyn AnySlabStorageImpl>> {
  426. self.data.get(&type_id).map(|x| x.read())
  427. }
  428. fn get_slab_mut<'b>(
  429. &'b self,
  430. type_id: TypeId,
  431. ) -> Option<RwLockWriteGuard<'b, &'a mut dyn AnySlabStorageImpl>> {
  432. self.data.get(&type_id).map(|x| x.write())
  433. }
  434. }
  435. pub(crate) struct AnySlab {
  436. data: hashbrown::HashMap<TypeId, Box<dyn AnySlabStorageImpl>, BuildHasherDefault<FxHasher>>,
  437. filled: Vec<bool>,
  438. free: VecDeque<NodeId>,
  439. len: usize,
  440. }
  441. impl Debug for AnySlab {
  442. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  443. f.debug_struct("AnySlab")
  444. .field("data", &self.data.keys().collect::<Vec<_>>())
  445. .field("free", &self.free)
  446. .field("len", &self.len)
  447. .finish()
  448. }
  449. }
  450. impl Default for AnySlab {
  451. fn default() -> Self {
  452. Self::new()
  453. }
  454. }
  455. impl AnySlab {
  456. fn new() -> Self {
  457. Self {
  458. data: Default::default(),
  459. filled: Default::default(),
  460. free: VecDeque::new(),
  461. len: 0,
  462. }
  463. }
  464. fn try_read_slab<T: Any>(&self) -> Option<&SlabStorage<T>> {
  465. self.data
  466. .get(&TypeId::of::<T>())
  467. .map(|x| x.as_any().downcast_ref().unwrap())
  468. }
  469. fn read_slab<T: Any>(&self) -> &SlabStorage<T> {
  470. self.try_read_slab().unwrap()
  471. }
  472. fn try_write_slab<T: Any>(&mut self) -> Option<&mut SlabStorage<T>> {
  473. self.data
  474. .get_mut(&TypeId::of::<T>())
  475. .map(|x| x.as_any_mut().downcast_mut().unwrap())
  476. }
  477. fn write_slab<T: Any>(&mut self) -> &mut SlabStorage<T> {
  478. self.try_write_slab().unwrap()
  479. }
  480. fn get_or_insert_slab_mut<T: Any + Send + Sync>(&mut self) -> &mut SlabStorage<T> {
  481. self.data
  482. .entry(TypeId::of::<T>())
  483. .or_insert_with(|| Box::<SlabStorage<T>>::default())
  484. .as_any_mut()
  485. .downcast_mut()
  486. .unwrap()
  487. }
  488. fn insert(&mut self) -> EntryBuilder<'_> {
  489. let id = if let Some(id) = self.free.pop_front() {
  490. self.filled[id.0] = true;
  491. id
  492. } else {
  493. let id = self.len;
  494. self.filled.push(true);
  495. self.len += 1;
  496. NodeId(id)
  497. };
  498. EntryBuilder { id, inner: self }
  499. }
  500. fn remove(&mut self, id: NodeId) {
  501. for slab in self.data.values_mut() {
  502. slab.remove(id);
  503. }
  504. self.filled[id.0] = true;
  505. self.free.push_back(id);
  506. }
  507. fn len(&self) -> usize {
  508. self.len - self.free.len()
  509. }
  510. fn contains(&self, id: NodeId) -> bool {
  511. self.filled.get(id.0).copied().unwrap_or_default()
  512. }
  513. fn dynamically_borrowed(&mut self) -> DynamiclyBorrowedAnySlabView<'_> {
  514. DynamiclyBorrowedAnySlabView {
  515. data: self
  516. .data
  517. .iter_mut()
  518. .map(|(k, v)| (*k, RwLock::new(&mut **v)))
  519. .collect(),
  520. }
  521. }
  522. }
  523. pub struct EntryBuilder<'a> {
  524. id: NodeId,
  525. inner: &'a mut AnySlab,
  526. }
  527. impl EntryBuilder<'_> {
  528. pub fn insert<T: Any + Send + Sync>(&mut self, value: T) {
  529. self.inner
  530. .get_or_insert_slab_mut::<T>()
  531. .insert(self.id, value);
  532. }
  533. pub fn get<T: Any>(&self) -> Option<&T> {
  534. self.inner.read_slab().get(self.id)
  535. }
  536. pub fn get_mut<T: Any>(&mut self) -> Option<&mut T> {
  537. self.inner.write_slab().get_mut(self.id)
  538. }
  539. pub fn remove(self) {
  540. self.inner.remove(self.id);
  541. }
  542. pub fn id(&self) -> NodeId {
  543. self.id
  544. }
  545. }
  546. #[test]
  547. fn remove() {
  548. let mut slab = AnySlab::new();
  549. let mut node1 = slab.insert();
  550. node1.insert(0i32);
  551. let node1_id = node1.id();
  552. let mut node2 = slab.insert();
  553. node2.insert(0i32);
  554. assert_eq!(slab.len(), 2);
  555. slab.remove(node1_id);
  556. assert!(slab.read_slab::<i32>().get(node1_id).is_none());
  557. assert_eq!(slab.len(), 1);
  558. }
  559. #[test]
  560. fn get_many_mut_unchecked() {
  561. let mut slab = AnySlab::new();
  562. let mut parent = slab.insert();
  563. parent.insert(0i32);
  564. let parent = parent.id();
  565. let mut child = slab.insert();
  566. child.insert(1i32);
  567. let child = child.id();
  568. let mut grandchild = slab.insert();
  569. grandchild.insert(2i32);
  570. let grandchild = grandchild.id();
  571. assert_eq!(slab.len(), 3);
  572. println!("ids: {:#?}", [parent, child, grandchild]);
  573. {
  574. let i32_slab = slab.write_slab::<i32>();
  575. let all =
  576. unsafe { i32_slab.get_many_mut_unchecked([parent, child, grandchild].into_iter()) }
  577. .unwrap();
  578. assert_eq!(all, [&mut 0, &mut 1, &mut 2]);
  579. }
  580. {
  581. let i32_slab = slab.write_slab::<i32>();
  582. assert!(
  583. unsafe { i32_slab.get_many_mut_unchecked([NodeId(3), NodeId(100)].into_iter()) }
  584. .is_none()
  585. )
  586. }
  587. }
  588. #[test]
  589. fn get_many_many_mut_unchecked() {
  590. let mut slab = AnySlab::new();
  591. let mut parent = slab.insert();
  592. parent.insert(0i32);
  593. parent.insert("0");
  594. let parent = parent.id();
  595. let mut child = slab.insert();
  596. child.insert(1i32);
  597. child.insert("1");
  598. let child = child.id();
  599. let mut grandchild = slab.insert();
  600. grandchild.insert(2i32);
  601. grandchild.insert("2");
  602. let grandchild = grandchild.id();
  603. println!("ids: {:#?}", [parent, child, grandchild]);
  604. println!("slab: {:#?}", slab);
  605. let num_entries = slab.write_slab::<i32>();
  606. let all_num = unsafe {
  607. num_entries
  608. .as_any_mut()
  609. .downcast_mut::<SlabStorage<i32>>()
  610. .unwrap()
  611. .get_many_mut_unchecked([parent, child, grandchild].into_iter())
  612. }
  613. .unwrap();
  614. assert_eq!(all_num, [&mut 0, &mut 1, &mut 2]);
  615. let str_entries = slab.write_slab::<&str>();
  616. let all_str = unsafe {
  617. str_entries
  618. .as_any_mut()
  619. .downcast_mut::<SlabStorage<&str>>()
  620. .unwrap()
  621. .get_many_mut_unchecked([parent, child, grandchild].into_iter())
  622. }
  623. .unwrap();
  624. assert_eq!(all_str, [&mut "0", &mut "1", &mut "2"]);
  625. }