diff options
author | Matthias Beyer <matthias.beyer@ifm.com> | 2022-07-02 17:18:17 +0200 |
---|---|---|
committer | Matthias Beyer <matthias.beyer@ifm.com> | 2022-08-30 13:54:48 +0200 |
commit | 612535e32873bc19f3758cf86124a937643213fb (patch) | |
tree | ac50f58869033ddd9fbc40d9f0825093c0418d52 | |
parent | 1f488d0e916212fe14d34a74574f15ec7e4e7a18 (diff) |
WIP: Optimize: Do not allocate in MessageBundle::get_ids()post-merge/no-allocation-in-receiverbundle-getids
-rw-r--r-- | crates/core/tedge_api/src/plugin.rs | 25 |
1 files 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<Msg: Message> { #[derive(Debug)] #[doc(hidden)] -pub struct HandleTypes(Vec<MessageType>); +pub struct HandleTypes(&'static [MessageType]); impl HandleTypes { pub fn get_types(&self) -> &[MessageType] { &self.0 } - pub fn into_types(self) -> Vec<MessageType> { + pub fn into_types(self) -> &'static [MessageType] { self.0 } @@ -445,7 +445,7 @@ impl HandleTypes { where P: DoesHandle<P::HandledMessages>, { - 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<MessageType>; + 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<MessageType> { - vec![] + fn get_ids() -> std::slice::Iter<'static, MessageType> { + [].iter() } } @@ -619,8 +619,9 @@ impl<P: Plugin> DoesHandle<()> for P { pub struct AnyMessages; impl MessageBundle for AnyMessages { - fn get_ids() -> Vec<MessageType> { - vec![MessageType::for_message::<crate::message::AnyMessage>()] + fn get_ids() -> std::slice::Iter<'static, MessageType> { + static ary : [MessageType; 1] = [MessageType::for_message::<crate::message::AnyMessage>()]; + 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<MessageType> { - 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() } } |