summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@ifm.com>2022-07-02 17:18:17 +0200
committerMatthias Beyer <matthias.beyer@ifm.com>2022-08-30 13:54:48 +0200
commit612535e32873bc19f3758cf86124a937643213fb (patch)
treeac50f58869033ddd9fbc40d9f0825093c0418d52
parent1f488d0e916212fe14d34a74574f15ec7e4e7a18 (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.rs25
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()
}
}