tree.rs 21 KB

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