From 612535e32873bc19f3758cf86124a937643213fb Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 2 Jul 2022 17:18:17 +0200 Subject: WIP: Optimize: Do not allocate in MessageBundle::get_ids() --- crates/core/tedge_api/src/plugin.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/crates/core/tedge_api/src/plugin.rs b/crates/core/tedge_api/src/plugin.rs index d57a41f7..24161a4a 100644 --- a/crates/core/tedge_api/src/plugin.rs +++ b/crates/core/tedge_api/src/plugin.rs @@ -373,14 +373,14 @@ pub trait Handle { #[derive(Debug)] #[doc(hidden)] -pub struct HandleTypes(Vec); +pub struct HandleTypes(&'static [MessageType]); impl HandleTypes { pub fn get_types(&self) -> &[MessageType] { &self.0 } - pub fn into_types(self) -> Vec { + pub fn into_types(self) -> &'static [MessageType] { self.0 } @@ -445,7 +445,7 @@ impl HandleTypes { where P: DoesHandle, { - HandleTypes(P::HandledMessages::get_ids()) + HandleTypes(P::HandledMessages::get_ids().as_slice()) } } @@ -454,7 +454,7 @@ impl HandleTypes { /// This trait is implemented on types that represent a bundle of different types of messages. pub trait MessageBundle { /// Get the names and ids of the types that are represented by this bundle - fn get_ids() -> Vec; + fn get_ids() -> std::slice::Iter<'static, MessageType>; } /// An extension for a Plugin implementing type @@ -594,8 +594,8 @@ macro_rules! impl_does_handle_tuple { impl_does_handle_tuple!(M10 M9 M8 M7 M6 M5 M4 M3 M2 M1); impl MessageBundle for () { - fn get_ids() -> Vec { - vec![] + fn get_ids() -> std::slice::Iter<'static, MessageType> { + [].iter() } } @@ -619,8 +619,9 @@ impl DoesHandle<()> for P { pub struct AnyMessages; impl MessageBundle for AnyMessages { - fn get_ids() -> Vec { - vec![MessageType::for_message::()] + fn get_ids() -> std::slice::Iter<'static, MessageType> { + static ary : [MessageType; 1] = [MessageType::for_message::()]; + ary.iter() } } @@ -665,11 +666,13 @@ macro_rules! impl_msg_bundle_tuple { }; ($cur:ident $($rest:tt)*) => { impl<$cur: Message + TypeUuid, $($rest: Message + TypeUuid),*> MessageBundle for ($cur,$($rest),*) { - fn get_ids() -> Vec { - vec![ + fn get_ids() -> std::slice::Iter<'static, MessageType> { + static ary: [MessageType; (1 + $crate::count!($($rest)*))] = [ MessageType::for_message::<$cur>(), $(MessageType::for_message::<$rest>()),* - ] + ]; + + ary.iter() } } -- cgit v1.2.3