Detailed changes
@@ -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