tree.rs 21 KB

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