arena.rs 907 B

12345678910111213141516171819202122232425262728293031323334353637
  1. use crate::{nodes::VNode, virtual_dom::VirtualDom};
  2. #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
  3. #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
  4. pub struct ElementId(pub usize);
  5. pub struct ElementPath {
  6. pub template: *mut VNode<'static>,
  7. pub element: usize,
  8. }
  9. impl ElementPath {
  10. pub fn null() -> Self {
  11. Self {
  12. template: std::ptr::null_mut(),
  13. element: 0,
  14. }
  15. }
  16. }
  17. impl VirtualDom {
  18. pub fn next_element(&mut self, template: &VNode) -> ElementId {
  19. let entry = self.elements.vacant_entry();
  20. let id = entry.key();
  21. entry.insert(ElementPath {
  22. template: template as *const _ as *mut _,
  23. element: id,
  24. });
  25. ElementId(id)
  26. }
  27. pub fn cleanup_element(&mut self, id: ElementId) {
  28. self.elements.remove(id.0);
  29. }
  30. }