Use BTreeSet instead of HashSet in copy_area()
I kind of forgot about BTreeSets, and kept a separate HashSet and sorted index of the set's keys.async
parent
e97cf98b3b
commit
55948dd7c2
|
@ -30,7 +30,7 @@ use melib::text_processing::wcwidth;
|
||||||
|
|
||||||
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::HashMap;
|
||||||
use std::convert::From;
|
use std::convert::From;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::ops::{Deref, DerefMut, Index, IndexMut};
|
use std::ops::{Deref, DerefMut, Index, IndexMut};
|
||||||
|
@ -1716,34 +1716,27 @@ pub fn copy_area(grid_dest: &mut CellBuffer, grid_src: &CellBuffer, dest: Area,
|
||||||
let mut tag_offset: usize = tag_associations
|
let mut tag_offset: usize = tag_associations
|
||||||
.binary_search_by(|probe| probe.0.cmp(&start_idx))
|
.binary_search_by(|probe| probe.0.cmp(&start_idx))
|
||||||
.unwrap_or_else(|i| i);
|
.unwrap_or_else(|i| i);
|
||||||
let mut stack: HashSet<u64> = HashSet::default();
|
let mut stack: std::collections::BTreeSet<&FormatTag> = std::collections::BTreeSet::default();
|
||||||
let mut sorted_stack: SmallVec<[u64; 64]> = SmallVec::new();
|
|
||||||
for y in get_y(upper_left!(dest))..=get_y(bottom_right!(dest)) {
|
for y in get_y(upper_left!(dest))..=get_y(bottom_right!(dest)) {
|
||||||
'for_x: for x in get_x(upper_left!(dest))..=get_x(bottom_right!(dest)) {
|
'for_x: for x in get_x(upper_left!(dest))..=get_x(bottom_right!(dest)) {
|
||||||
let idx = grid_src.pos_to_index(src_x, src_y).unwrap();
|
let idx = grid_src.pos_to_index(src_x, src_y).unwrap();
|
||||||
let resort_stack = tag_offset < tag_associations.len() && tag_associations[tag_offset].0 <= idx;
|
|
||||||
while tag_offset < tag_associations.len() && tag_associations[tag_offset].0 <= idx {
|
while tag_offset < tag_associations.len() && tag_associations[tag_offset].0 <= idx {
|
||||||
if tag_associations[tag_offset].2 {
|
if tag_associations[tag_offset].2 {
|
||||||
stack.insert(tag_associations[tag_offset].1);
|
stack.insert(&grid_src.tag_table()[&tag_associations[tag_offset].1]);
|
||||||
} else {
|
} else {
|
||||||
stack.remove(&tag_associations[tag_offset].1);
|
stack.remove(&grid_src.tag_table()[&tag_associations[tag_offset].1]);
|
||||||
}
|
}
|
||||||
tag_offset += 1;
|
tag_offset += 1;
|
||||||
}
|
}
|
||||||
if resort_stack {
|
|
||||||
sorted_stack.clear();
|
|
||||||
sorted_stack.extend(stack.iter().cloned());
|
|
||||||
sorted_stack.sort_by_key(|h| grid_src.tag_table()[h].priority);
|
|
||||||
}
|
|
||||||
grid_dest[(x, y)] = grid_src[(src_x, src_y)];
|
grid_dest[(x, y)] = grid_src[(src_x, src_y)];
|
||||||
for t in &sorted_stack {
|
for t in &stack {
|
||||||
if let Some(fg) = grid_src.tag_table()[&t].fg {
|
if let Some(fg) = t.fg {
|
||||||
grid_dest[(x, y)].set_fg(fg).set_keep_fg(true);
|
grid_dest[(x, y)].set_fg(fg).set_keep_fg(true);
|
||||||
}
|
}
|
||||||
if let Some(bg) = grid_src.tag_table()[&t].bg {
|
if let Some(bg) = t.bg {
|
||||||
grid_dest[(x, y)].set_bg(bg).set_keep_bg(true);
|
grid_dest[(x, y)].set_bg(bg).set_keep_bg(true);
|
||||||
}
|
}
|
||||||
if let Some(attrs) = grid_src.tag_table()[&t].attrs {
|
if let Some(attrs) = t.attrs {
|
||||||
grid_dest[(x, y)].attrs |= attrs;
|
grid_dest[(x, y)].attrs |= attrs;
|
||||||
grid_dest[(x, y)].set_keep_attrs(true);
|
grid_dest[(x, y)].set_keep_attrs(true);
|
||||||
}
|
}
|
||||||
|
@ -2825,3 +2818,15 @@ pub struct FormatTag {
|
||||||
pub attrs: Option<Attr>,
|
pub attrs: Option<Attr>,
|
||||||
pub priority: u8,
|
pub priority: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl core::cmp::Ord for FormatTag {
|
||||||
|
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
|
||||||
|
self.priority.cmp(&other.priority)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl core::cmp::PartialOrd for FormatTag {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
|
||||||
|
Some(self.cmp(&other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue