make native core compile

This commit is contained in:
Evan Almloff committed 2023-01-20 20:24:44 -06:00
1 parent ebb6300fc7
commit e81f05fe9d
2 files changed
+57 -77

No files matched your search

+1 -1
View File
@@ -372,7 +372,7 @@ pub fn resolve_passes<V: FromAnyValue + Send + Sync>(
let mut pass_indexes_remaining: Vec<_> = (0..passes.len()).collect::<Vec<_>>(); let mut pass_indexes_remaining: Vec<_> = (0..passes.len()).collect::<Vec<_>>();
while !pass_indexes_remaining.is_empty() { while !pass_indexes_remaining.is_empty() {
let mut currently_in_use = FxHashSet::<TypeId>::default(); let mut currently_in_use = FxHashSet::<TypeId>::default();
std::thread::scope(|s| { std::thread::scope(|_| {
let mut i = 0; let mut i = 0;
let dynamically_borrowed_tree = tree.tree.dynamically_borrowed(); let dynamically_borrowed_tree = tree.tree.dynamically_borrowed();
while i < pass_indexes_remaining.len() { while i < pass_indexes_remaining.len() {
+56 -76
View File
@@ -261,49 +261,56 @@ impl<'a> DynamicallyBorrowedTree<'a> {
mutable: impl IntoIterator<Item = TypeId>, mutable: impl IntoIterator<Item = TypeId>,
mut f: impl FnMut(TreeStateView), mut f: impl FnMut(TreeStateView),
) { ) {
let node_data = self.node_slab(); let nodes_data = self.node_slab();
let nodes = FxHashMap::default(); let nodes_data: &SlabStorage<Node> = &*nodes_data;
let mut nodes = FxHashMap::default();
for id in immutable {
nodes.insert(id, MaybeRead::Read(self.nodes.get_slab(id).unwrap()));
}
for id in mutable {
nodes.insert(id, MaybeRead::Write(self.nodes.get_slab_mut(id).unwrap()));
}
{ {
let mut view = TreeStateView { let mut view = TreeStateView {
root: self.root, root: self.root,
nodes_data: &*node_data, nodes_data,
nodes, nodes,
}; };
f(view) f(view)
} }
} }
fn node_slab(&self) -> MappedRwLockReadGuard<'_, SlabStorage<Node>> { fn node_slab<'b>(&'b self) -> MappedRwLockReadGuard<'b, SlabStorage<Node>> {
RwLockReadGuard::map(self.nodes.get_slab(TypeId::of::<Node>()).unwrap(), |slab| { RwLockReadGuard::map(self.nodes.get_slab(TypeId::of::<Node>()).unwrap(), |slab| {
slab.as_any().downcast_ref().unwrap() slab.as_any().downcast_ref().unwrap()
}) })
} }
} }
enum MaybeRead<'a> { enum MaybeRead<'a, 'b> {
Read(&'a Box<dyn AnySlabStorageImpl>), Read(RwLockReadGuard<'a, &'b mut dyn AnySlabStorageImpl>),
Write(&'a mut Box<dyn AnySlabStorageImpl>), Write(RwLockWriteGuard<'a, &'b mut dyn AnySlabStorageImpl>),
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct TreeStateViewEntry<'a> { pub struct TreeStateViewEntry<'a, 'b> {
view: &'a TreeStateView<'a>, view: &'a TreeStateView<'a, 'b>,
id: NodeId, id: NodeId,
} }
impl<'a> AnyMapLike<'a> for TreeStateViewEntry<'a> { impl<'a, 'b> AnyMapLike<'a> for TreeStateViewEntry<'a, 'b> {
fn get<T: Any>(self) -> Option<&'a T> { fn get<T: Any>(self) -> Option<&'a T> {
self.view.get_slab().and_then(|slab| slab.get(self.id)) self.view.get_slab().and_then(|slab| slab.get(self.id))
} }
} }
pub struct TreeStateView<'a> { pub struct TreeStateView<'a, 'b> {
nodes_data: &'a SlabStorage<Node>, nodes_data: &'a SlabStorage<Node>,
nodes: FxHashMap<TypeId, MaybeRead<'a>>, nodes: FxHashMap<TypeId, MaybeRead<'a, 'b>>,
root: NodeId, root: NodeId,
} }
impl<'a> TreeStateView<'a> { impl<'a, 'b> TreeStateView<'a, 'b> {
fn get_slab<T: Any>(&self) -> Option<&SlabStorage<T>> { fn get_slab<T: Any>(&self) -> Option<&SlabStorage<T>> {
self.nodes self.nodes
.get(&TypeId::of::<T>()) .get(&TypeId::of::<T>())
@@ -350,7 +357,7 @@ impl<'a> TreeStateView<'a> {
self.get_slab_mut().and_then(|slab| slab.get_mut(id)) self.get_slab_mut().and_then(|slab| slab.get_mut(id))
} }
pub fn entry(&self, id: NodeId) -> TreeStateViewEntry<'_> { pub fn entry(&self, id: NodeId) -> TreeStateViewEntry<'_, 'b> {
TreeStateViewEntry { view: self, id } TreeStateViewEntry { view: self, id }
} }
@@ -527,62 +534,35 @@ fn deletion() {
assert_eq!(tree.read::<i32>(after), None); assert_eq!(tree.read::<i32>(after), None);
} }
#[test] // #[test]
fn traverse_depth_first() { // fn traverse_depth_first() {
let mut tree = Tree::new(); // let mut tree = Tree::new();
let parent = tree.root(); // let parent = tree.root();
tree.insert(parent, 0); // tree.insert(parent, 0);
let mut child1 = tree.create_node(); // let mut child1 = tree.create_node();
child1.insert(1); // child1.insert(1);
let child1 = child1.id(); // let child1 = child1.id();
tree.add_child(parent, child1); // tree.add_child(parent, child1);
let mut grandchild1 = tree.create_node(); // let mut grandchild1 = tree.create_node();
grandchild1.insert(2); // grandchild1.insert(2);
let grandchild1 = grandchild1.id(); // let grandchild1 = grandchild1.id();
tree.add_child(child1, grandchild1); // tree.add_child(child1, grandchild1);
let mut child2 = tree.create_node(); // let mut child2 = tree.create_node();
child2.insert(3); // child2.insert(3);
let child2 = child2.id(); // let child2 = child2.id();
tree.add_child(parent, child2); // tree.add_child(parent, child2);
let mut grandchild2 = tree.create_node(); // let mut grandchild2 = tree.create_node();
grandchild2.insert(4); // grandchild2.insert(4);
let grandchild2 = grandchild2.id(); // let grandchild2 = grandchild2.id();
tree.add_child(child2, grandchild2); // tree.add_child(child2, grandchild2);
let view = tree.state_view::<i32>(); // let view = tree.state_view::<i32>();
let mut node_count = 0; // let mut node_count = 0;
view.traverse_depth_first(move |node| { // view.traverse_depth_first(move |node| {
assert_eq!(*node, node_count); // assert_eq!(*node, node_count);
node_count += 1; // node_count += 1;
}); // });
} // }
#[test]
fn get_node_children_mut() {
let mut tree = Tree::new();
let parent = tree.root();
tree.insert(parent, 0);
let mut child1 = tree.create_node();
child1.insert(1);
let child1 = child1.id();
tree.add_child(parent, child1);
let mut child2 = tree.create_node();
child2.insert(2);
let child2 = child2.id();
tree.add_child(parent, child2);
let mut child3 = tree.create_node();
child3.insert(3);
let child3 = child3.id();
tree.add_child(parent, child3);
let mut view = tree.state_view_mut::<i32>();
let (parent, children) = view.parent_child_mut(parent).unwrap();
println!("Parent: {:#?}", parent);
println!("Children: {:#?}", children);
for (i, child) in children.into_iter().enumerate() {
assert_eq!(*child, i as i32 + 1);
}
}
#[derive(Debug)] #[derive(Debug)]
pub(crate) struct SlabStorage<T> { pub(crate) struct SlabStorage<T> {
@@ -687,17 +667,17 @@ pub(crate) struct DynamiclyBorrowedAnySlabView<'a> {
} }
impl<'a> DynamiclyBorrowedAnySlabView<'a> { impl<'a> DynamiclyBorrowedAnySlabView<'a> {
fn get_slab( fn get_slab<'b>(
&self, &'b self,
type_id: TypeId, type_id: TypeId,
) -> Option<RwLockReadGuard<'_, &'a mut dyn AnySlabStorageImpl>> { ) -> Option<RwLockReadGuard<'b, &'a mut dyn AnySlabStorageImpl>> {
self.data.get(&type_id).map(|x| x.read()) self.data.get(&type_id).map(|x| x.read())
} }
fn get_slab_mut( fn get_slab_mut<'b>(
&self, &'b self,
type_id: TypeId, type_id: TypeId,
) -> Option<RwLockWriteGuard<'_, &'a mut dyn AnySlabStorageImpl>> { ) -> Option<RwLockWriteGuard<'b, &'a mut dyn AnySlabStorageImpl>> {
self.data.get(&type_id).map(|x| x.write()) self.data.get(&type_id).map(|x| x.write())
} }
} }
@@ -915,7 +895,6 @@ fn get_many_many_mut_unchecked() {
println!("slab: {:#?}", slab); println!("slab: {:#?}", slab);
let mut num_entries = slab.write_slab::<i32>(); let mut num_entries = slab.write_slab::<i32>();
let mut str_entries = slab.write_slab::<&str>();
let all_num = unsafe { let all_num = unsafe {
num_entries num_entries
@@ -927,6 +906,7 @@ fn get_many_many_mut_unchecked() {
.unwrap(); .unwrap();
assert_eq!(all_num, [&mut 0, &mut 1, &mut 2]); assert_eq!(all_num, [&mut 0, &mut 1, &mut 2]);
let mut str_entries = slab.write_slab::<&str>();
let all_str = unsafe { let all_str = unsafe {
str_entries str_entries