gpui: Arc GlobalElementId (#40979)
This shrinks it from roughly a ~kilobyte to 8 byte, removing a bunch of memmoves emitted by the compiler. Also `Arc`'s it instead of boxing as we do clone it a couple times here and there, making that also a fair bit cheaper Release Notes: - N/A *or* Added/Fixed/Improved ...
This commit is contained in:
@@ -1186,18 +1186,14 @@ impl BlockMapWriter<'_> {
|
||||
self.0.sync(wrap_snapshot, edits);
|
||||
}
|
||||
|
||||
pub fn remove_intersecting_replace_blocks<T>(
|
||||
pub fn remove_intersecting_replace_blocks(
|
||||
&mut self,
|
||||
ranges: impl IntoIterator<Item = Range<T>>,
|
||||
ranges: impl IntoIterator<Item = Range<usize>>,
|
||||
inclusive: bool,
|
||||
) where
|
||||
T: ToOffset,
|
||||
{
|
||||
) {
|
||||
let wrap_snapshot = self.0.wrap_snapshot.borrow();
|
||||
let mut blocks_to_remove = HashSet::default();
|
||||
for range in ranges {
|
||||
let range = range.start.to_offset(wrap_snapshot.buffer_snapshot())
|
||||
..range.end.to_offset(wrap_snapshot.buffer_snapshot());
|
||||
for block in self.blocks_intersecting_buffer_range(range, inclusive) {
|
||||
if matches!(block.placement, BlockPlacement::Replace(_)) {
|
||||
blocks_to_remove.insert(block.id);
|
||||
@@ -3570,8 +3566,12 @@ mod tests {
|
||||
|
||||
let mut writer = block_map.write(wraps_snapshot.clone(), Default::default());
|
||||
writer.remove_intersecting_replace_blocks(
|
||||
[buffer_snapshot.anchor_after(Point::new(1, 0))
|
||||
..buffer_snapshot.anchor_after(Point::new(1, 0))],
|
||||
[buffer_snapshot
|
||||
.anchor_after(Point::new(1, 0))
|
||||
.to_offset(&buffer_snapshot)
|
||||
..buffer_snapshot
|
||||
.anchor_after(Point::new(1, 0))
|
||||
.to_offset(&buffer_snapshot)],
|
||||
false,
|
||||
);
|
||||
let blocks_snapshot = block_map.read(wraps_snapshot, Default::default());
|
||||
|
||||
@@ -37,11 +37,11 @@ use crate::{
|
||||
util::FluentBuilder,
|
||||
};
|
||||
use derive_more::{Deref, DerefMut};
|
||||
pub(crate) use smallvec::SmallVec;
|
||||
use std::{
|
||||
any::{Any, type_name},
|
||||
fmt::{self, Debug, Display},
|
||||
mem, panic,
|
||||
sync::Arc,
|
||||
};
|
||||
|
||||
/// Implemented by types that participate in laying out and painting the contents of a window.
|
||||
@@ -272,8 +272,8 @@ impl<C: RenderOnce> IntoElement for Component<C> {
|
||||
}
|
||||
|
||||
/// A globally unique identifier for an element, used to track state across frames.
|
||||
#[derive(Deref, DerefMut, Default, Debug, Eq, PartialEq, Hash)]
|
||||
pub struct GlobalElementId(pub(crate) SmallVec<[ElementId; 32]>);
|
||||
#[derive(Deref, DerefMut, Clone, Default, Debug, Eq, PartialEq, Hash)]
|
||||
pub struct GlobalElementId(pub(crate) Arc<[ElementId]>);
|
||||
|
||||
impl Display for GlobalElementId {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
@@ -353,7 +353,7 @@ impl<E: Element> Drawable<E> {
|
||||
ElementDrawPhase::Start => {
|
||||
let global_id = self.element.id().map(|element_id| {
|
||||
window.element_id_stack.push(element_id);
|
||||
GlobalElementId(window.element_id_stack.clone())
|
||||
GlobalElementId(Arc::from(&*window.element_id_stack))
|
||||
});
|
||||
|
||||
let inspector_id;
|
||||
@@ -361,7 +361,7 @@ impl<E: Element> Drawable<E> {
|
||||
{
|
||||
inspector_id = self.element.source_location().map(|source| {
|
||||
let path = crate::InspectorElementPath {
|
||||
global_id: GlobalElementId(window.element_id_stack.clone()),
|
||||
global_id: GlobalElementId(Arc::from(&*window.element_id_stack)),
|
||||
source_location: source,
|
||||
};
|
||||
window.build_inspector_element_id(path)
|
||||
@@ -412,7 +412,7 @@ impl<E: Element> Drawable<E> {
|
||||
} => {
|
||||
if let Some(element_id) = self.element.id() {
|
||||
window.element_id_stack.push(element_id);
|
||||
debug_assert_eq!(global_id.as_ref().unwrap().0, window.element_id_stack);
|
||||
debug_assert_eq!(&*global_id.as_ref().unwrap().0, &*window.element_id_stack);
|
||||
}
|
||||
|
||||
let bounds = window.layout_bounds(layout_id);
|
||||
@@ -461,7 +461,7 @@ impl<E: Element> Drawable<E> {
|
||||
} => {
|
||||
if let Some(element_id) = self.element.id() {
|
||||
window.element_id_stack.push(element_id);
|
||||
debug_assert_eq!(global_id.as_ref().unwrap().0, window.element_id_stack);
|
||||
debug_assert_eq!(&*global_id.as_ref().unwrap().0, &*window.element_id_stack);
|
||||
}
|
||||
|
||||
window.next_frame.dispatch_tree.set_active_node(node_id);
|
||||
|
||||
@@ -39,7 +39,7 @@ mod conditional {
|
||||
impl Clone for InspectorElementPath {
|
||||
fn clone(&self) -> Self {
|
||||
Self {
|
||||
global_id: crate::GlobalElementId(self.global_id.0.clone()),
|
||||
global_id: self.global_id.clone(),
|
||||
source_location: self.source_location,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1848,7 +1848,8 @@ impl Window {
|
||||
f: impl FnOnce(&GlobalElementId, &mut Self) -> R,
|
||||
) -> R {
|
||||
self.element_id_stack.push(element_id);
|
||||
let global_id = GlobalElementId(self.element_id_stack.clone());
|
||||
let global_id = GlobalElementId(Arc::from(&*self.element_id_stack));
|
||||
|
||||
let result = f(&global_id, self);
|
||||
self.element_id_stack.pop();
|
||||
result
|
||||
@@ -2260,7 +2261,7 @@ impl Window {
|
||||
self.rendered_frame.accessed_element_states[range.start.accessed_element_states_index
|
||||
..range.end.accessed_element_states_index]
|
||||
.iter()
|
||||
.map(|(id, type_id)| (GlobalElementId(id.0.clone()), *type_id)),
|
||||
.map(|(id, type_id)| (id.clone(), *type_id)),
|
||||
);
|
||||
self.text_system
|
||||
.reuse_layouts(range.start.line_layout_index..range.end.line_layout_index);
|
||||
@@ -2328,7 +2329,7 @@ impl Window {
|
||||
self.rendered_frame.accessed_element_states[range.start.accessed_element_states_index
|
||||
..range.end.accessed_element_states_index]
|
||||
.iter()
|
||||
.map(|(id, type_id)| (GlobalElementId(id.0.clone()), *type_id)),
|
||||
.map(|(id, type_id)| (id.clone(), *type_id)),
|
||||
);
|
||||
self.next_frame.tab_stops.replay(
|
||||
&self.rendered_frame.tab_stops.insertion_history
|
||||
@@ -2650,10 +2651,8 @@ impl Window {
|
||||
{
|
||||
self.invalidator.debug_assert_paint_or_prepaint();
|
||||
|
||||
let key = (GlobalElementId(global_id.0.clone()), TypeId::of::<S>());
|
||||
self.next_frame
|
||||
.accessed_element_states
|
||||
.push((GlobalElementId(key.0.clone()), TypeId::of::<S>()));
|
||||
let key = (global_id.clone(), TypeId::of::<S>());
|
||||
self.next_frame.accessed_element_states.push(key.clone());
|
||||
|
||||
if let Some(any) = self
|
||||
.next_frame
|
||||
|
||||
Reference in New Issue
Block a user