From d82230a427847e17ed4ce105022a3c89b1d9bc6a Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 12 Oct 2023 20:18:53 -0500 Subject: less Arc in brigadier --- azalea-brigadier/src/builder/argument_builder.rs | 6 ++--- azalea-brigadier/src/command_dispatcher.rs | 31 +++++++++------------- azalea-brigadier/src/tree/mod.rs | 4 +-- .../tests/command_dispatcher_usages_test.rs | 8 +++--- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/azalea-brigadier/src/builder/argument_builder.rs b/azalea-brigadier/src/builder/argument_builder.rs index 10191463..9d3e8cad 100755 --- a/azalea-brigadier/src/builder/argument_builder.rs +++ b/azalea-brigadier/src/builder/argument_builder.rs @@ -21,7 +21,7 @@ pub struct ArgumentBuilder { arguments: CommandNode, command: Command, - requirement: Arc) -> bool + Send + Sync>, + requirement: Arc bool + Send + Sync>, target: Option>>>, forks: bool, @@ -96,13 +96,13 @@ impl ArgumentBuilder { /// # let mut subject = CommandDispatcher::::new(); /// # subject.register( /// literal("foo") - /// .requires(|s: Arc| s.opped) + /// .requires(|s: &CommandSource| s.opped) /// // ... /// # .executes(|ctx: &CommandContext| 42) /// # ); pub fn requires(mut self, requirement: F) -> Self where - F: Fn(Arc) -> bool + Send + Sync + 'static, + F: Fn(&S) -> bool + Send + Sync + 'static, { self.requirement = Arc::new(requirement); self diff --git a/azalea-brigadier/src/command_dispatcher.rs b/azalea-brigadier/src/command_dispatcher.rs index 42737fba..58210395 100755 --- a/azalea-brigadier/src/command_dispatcher.rs +++ b/azalea-brigadier/src/command_dispatcher.rs @@ -69,7 +69,7 @@ impl CommandDispatcher { let cursor = original_reader.cursor(); for child in node.read().get_relevant_nodes(&mut original_reader.clone()) { - if !child.read().can_use(source.clone()) { + if !child.read().can_use(&source) { continue; } let mut context = context_so_far.clone(); @@ -307,7 +307,7 @@ impl CommandDispatcher { pub fn get_all_usage( &self, node: &CommandNode, - source: Arc, + source: &S, restricted: bool, ) -> Vec { let mut result = vec![]; @@ -318,12 +318,12 @@ impl CommandDispatcher { fn get_all_usage_recursive( &self, node: &CommandNode, - source: Arc, + source: &S, result: &mut Vec, prefix: &str, restricted: bool, ) { - if restricted && !node.can_use(source.clone()) { + if restricted && !node.can_use(&source) { return; } if node.command.is_some() { @@ -345,7 +345,7 @@ impl CommandDispatcher { let child = child.read(); self.get_all_usage_recursive( &child, - Arc::clone(&source), + &source, result, if prefix.is_empty() { child.usage_text() @@ -366,14 +366,13 @@ impl CommandDispatcher { pub fn get_smart_usage( &self, node: &CommandNode, - source: Arc, + source: &S, ) -> Vec<(Arc>>, String)> { let mut result = Vec::new(); let optional = node.command.is_some(); for child in node.children.values() { - let usage = - self.get_smart_usage_recursive(&child.read(), source.clone(), optional, false); + let usage = self.get_smart_usage_recursive(&child.read(), source, optional, false); if let Some(usage) = usage { result.push((child.clone(), usage)); } @@ -385,11 +384,11 @@ impl CommandDispatcher { fn get_smart_usage_recursive( &self, node: &CommandNode, - source: Arc, + source: &S, optional: bool, deep: bool, ) -> Option { - if !node.can_use(source.clone()) { + if !node.can_use(&source) { return None; } @@ -418,14 +417,14 @@ impl CommandDispatcher { let children = node .children .values() - .filter(|child| child.read().can_use(source.clone())) + .filter(|child| child.read().can_use(&source)) .collect::>(); match children.len().cmp(&1) { Ordering::Less => {} Ordering::Equal => { let usage = self.get_smart_usage_recursive( &children[0].read(), - source.clone(), + source, child_optional, child_optional, ); @@ -436,12 +435,8 @@ impl CommandDispatcher { Ordering::Greater => { let mut child_usage = HashSet::new(); for child in &children { - let usage = self.get_smart_usage_recursive( - &child.read(), - source.clone(), - child_optional, - true, - ); + let usage = + self.get_smart_usage_recursive(&child.read(), source, child_optional, true); if let Some(usage) = usage { child_usage.insert(usage); } diff --git a/azalea-brigadier/src/tree/mod.rs b/azalea-brigadier/src/tree/mod.rs index 8ab3526e..be2efef1 100755 --- a/azalea-brigadier/src/tree/mod.rs +++ b/azalea-brigadier/src/tree/mod.rs @@ -31,7 +31,7 @@ pub struct CommandNode { pub arguments: HashMap>>>, pub command: Command, - pub requirement: Arc) -> bool + Send + Sync>, + pub requirement: Arc bool + Send + Sync>, pub redirect: Option>>>, pub forks: bool, pub modifier: Option>>, @@ -97,7 +97,7 @@ impl CommandNode { } } - pub fn can_use(&self, source: Arc) -> bool { + pub fn can_use(&self, source: &S) -> bool { (self.requirement)(source) } diff --git a/azalea-brigadier/tests/command_dispatcher_usages_test.rs b/azalea-brigadier/tests/command_dispatcher_usages_test.rs index d7baff89..0464dea7 100755 --- a/azalea-brigadier/tests/command_dispatcher_usages_test.rs +++ b/azalea-brigadier/tests/command_dispatcher_usages_test.rs @@ -81,21 +81,21 @@ fn get(subject: &CommandDispatcher<()>, command: &str) -> Arc::new(); - let results = subject.get_all_usage(&subject.root.read(), Arc::new(()), true); + let results = subject.get_all_usage(&subject.root.read(), &(), true); assert!(results.is_empty()); } #[test] fn test_smart_usage_no_commands() { let subject = CommandDispatcher::<()>::new(); - let results = subject.get_smart_usage(&subject.root.read(), Arc::new(())); + let results = subject.get_smart_usage(&subject.root.read(), &()); assert!(results.is_empty()); } #[test] fn test_all_usage_root() { let subject = setup(); - let results = subject.get_all_usage(&subject.root.read(), Arc::new(()), true); + let results = subject.get_all_usage(&subject.root.read(), &(), true); let actual = results.into_iter().collect::>(); let expected = vec![ @@ -112,7 +112,7 @@ fn test_all_usage_root() { #[test] fn test_smart_usage_root() { let subject = setup(); - let results = subject.get_smart_usage(&subject.root.read(), Arc::new(())); + let results = subject.get_smart_usage(&subject.root.read(), &()); let actual = results .into_iter() -- cgit v1.2.3