pub struct SlotTable { /* private fields */ }Implementations§
Source§impl SlotTable
impl SlotTable
pub fn new() -> Self
Sourcepub fn heap_bytes(&self) -> usize
pub fn heap_bytes(&self) -> usize
Returns approximate heap bytes used by this slot table.
pub fn debug_stats(&self) -> SlotTableDebugStats
pub fn current_group(&self) -> usize
pub fn group_key(&self, index: usize) -> Option<Key>
Sourcepub fn mark_range_as_gaps(
&mut self,
start: usize,
end: usize,
owner_index: Option<usize>,
) -> bool
pub fn mark_range_as_gaps( &mut self, start: usize, end: usize, owner_index: Option<usize>, ) -> bool
Mark a range of slots as gaps instead of truncating. This preserves sibling components while allowing structure changes. When encountering a Group, recursively marks the entire group structure as gaps.
pub fn get_group_scope(&self, index: usize) -> Option<usize>
pub fn set_group_scope(&mut self, index: usize, scope: usize)
pub fn start_recranpose_at_anchor( &mut self, anchor: AnchorId, owner: usize, ) -> Option<usize>
pub fn debug_dump_groups(&self) -> Vec<(usize, Key, Option<usize>, usize)>
pub fn debug_dump_all_slots(&self) -> Vec<(usize, String)>
pub fn debug_value_type_counts( &self, limit: usize, ) -> Vec<SlotValueTypeDebugStat>
pub fn start(&mut self, key: Key) -> usize
pub fn end(&mut self)
pub fn end_recompose(&mut self)
pub fn skip_current(&mut self)
pub fn node_ids_in_current_group(&self) -> Vec<NodeId> ⓘ
pub fn descendant_scopes_in_current_group( &self, current_scope: usize, ) -> Vec<RecomposeScope>
pub fn use_value_slot<T: 'static>(&mut self, init: impl FnOnce() -> T) -> usize
pub fn read_value<T: 'static>(&self, idx: usize) -> &T
pub fn read_value_mut<T: 'static>(&mut self, idx: usize) -> &mut T
pub fn write_value<T: 'static>(&mut self, idx: usize, value: T)
Sourcepub fn read_value_by_anchor<T: 'static>(&self, anchor: AnchorId) -> Option<&T>
pub fn read_value_by_anchor<T: 'static>(&self, anchor: AnchorId) -> Option<&T>
Read a value slot by its anchor ID. Provides stable access even if the slot’s position changes.
Sourcepub fn read_value_mut_by_anchor<T: 'static>(
&mut self,
anchor: AnchorId,
) -> Option<&mut T>
pub fn read_value_mut_by_anchor<T: 'static>( &mut self, anchor: AnchorId, ) -> Option<&mut T>
Read a mutable value slot by its anchor ID.
pub fn remember<T: 'static>(&mut self, init: impl FnOnce() -> T) -> Owned<T>
Sourcepub fn remember_with_anchor<T: 'static>(
&mut self,
init: impl FnOnce() -> T,
) -> (usize, AnchorId)
pub fn remember_with_anchor<T: 'static>( &mut self, init: impl FnOnce() -> T, ) -> (usize, AnchorId)
Remember a value and return both its index and anchor ID. The anchor provides stable access even if the slot’s position changes.
pub fn record_node(&mut self, id: NodeId, gen: u32)
pub fn peek_node(&self) -> Option<(NodeId, u32)>
pub fn read_node(&mut self) -> Option<NodeId>
pub fn advance_after_node_read(&mut self)
pub fn reset(&mut self)
Sourcepub fn step_back(&mut self)
pub fn step_back(&mut self)
Step the cursor back by one position. Used when we need to replace a slot that was just read but turned out to be incompatible.
Sourcepub fn trim_to_cursor(&mut self) -> bool
pub fn trim_to_cursor(&mut self) -> bool
Trim slots by marking unreachable slots as gaps.
Instead of blindly truncating at cursor position, this method:
- Marks slots from cursor to end of current group as gaps
- Keeps the group length unchanged (gaps are part of the group’s physical extent)
- Preserves sibling components outside the current group
This ensures effect states (LaunchedEffect, etc.) are preserved even when conditional rendering changes the composition structure.
Key insight: Gap slots remain part of the group’s physical length. The group’s
len field represents its physical extent in the slots array, not the count of
active slots. This allows gap slots to be found and reused in subsequent compositions.
Sourcepub fn drain_orphaned_node_ids_with(
&mut self,
visitor: impl FnMut(OrphanedNode),
)
pub fn drain_orphaned_node_ids_with( &mut self, visitor: impl FnMut(OrphanedNode), )
Drain orphaned node IDs collected during gap marking.
pub fn drain_orphaned_node_ids(&mut self) -> Vec<OrphanedNode>
Sourcepub fn compact(&mut self)
pub fn compact(&mut self)
Remove all Gap slots from the slot table, recalculate Group extents, and rebuild anchor positions. This reclaims memory that accumulated when groups shrank (e.g. recursive layout depth decrease, tab switching).
Only runs when needs_compact was set by mark_range_as_gaps.