From bba94dcf88b368f3747fe63d18c61bdecc9493ee Mon Sep 17 00:00:00 2001 From: EdJoPaTo Date: Tue, 14 May 2024 15:21:33 +0200 Subject: [PATCH] perf(state): const get_open no need for additional logic, its read only anyway The only reason for this was to keep the API with less breaking changes. Performance is more important. --- src/lib.rs | 2 +- src/tree_state.rs | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 905caad..0ea3bc3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -303,7 +303,7 @@ where ); let symbol = if item.children.is_empty() { self.node_no_children_symbol - } else if state.opened.contains(identifier) { + } else if state.open.contains(identifier) { self.node_open_symbol } else { self.node_closed_symbol diff --git a/src/tree_state.rs b/src/tree_state.rs index 1a86c38..c1c274a 100644 --- a/src/tree_state.rs +++ b/src/tree_state.rs @@ -19,7 +19,7 @@ use crate::tree_item::TreeItem; #[derive(Debug, Default)] pub struct TreeState { pub(super) offset: usize, - pub(super) opened: HashSet>, + pub(super) open: HashSet>, pub(super) selected: Vec, pub(super) ensure_selected_in_view_on_next_render: bool, pub(super) last_biggest_index: usize, @@ -36,8 +36,14 @@ where } #[must_use] + #[deprecated = "Use self.get_open()"] pub fn get_all_opened(&self) -> Vec> { - self.opened.iter().cloned().collect() + self.open.iter().cloned().collect() + } + + #[must_use] + pub const fn get_open(&self) -> &HashSet> { + &self.open } #[must_use] @@ -51,7 +57,7 @@ where &self, items: &'a [TreeItem<'a, Identifier>], ) -> Vec> { - flatten(&self.opened, items, &[]) + flatten(&self.open, items, &[]) } /// Selects the given identifier. @@ -79,7 +85,7 @@ where if identifier.is_empty() { false } else { - self.opened.insert(identifier) + self.open.insert(identifier) } } @@ -87,7 +93,7 @@ where /// Returns `true` when it was open and has been closed. /// Returns `false` when it was already closed. pub fn close(&mut self, identifier: &[Identifier]) -> bool { - self.opened.remove(identifier) + self.open.remove(identifier) } /// Toggles a tree node open/close state. @@ -98,7 +104,7 @@ where pub fn toggle(&mut self, identifier: Vec) -> bool { if identifier.is_empty() { false - } else if self.opened.contains(&identifier) { + } else if self.open.contains(&identifier) { self.close(&identifier) } else { self.open(identifier) @@ -119,10 +125,10 @@ where /// /// Returns `true` when any node was closed. pub fn close_all(&mut self) -> bool { - if self.opened.is_empty() { + if self.open.is_empty() { false } else { - self.opened.clear(); + self.open.clear(); true } } @@ -253,7 +259,7 @@ where pub fn key_left(&mut self) -> bool { self.ensure_selected_in_view_on_next_render = true; // Reimplement self.close because of multiple different borrows - let mut changed = self.opened.remove(&self.selected); + let mut changed = self.open.remove(&self.selected); if !changed { // Select the parent by removing the leaf from selection let popped = self.selected.pop();