From 6105f44a460e5b720fd03a272cadf4b120a62bd7 Mon Sep 17 00:00:00 2001 From: Gabriel Ozouf Date: Mon, 21 Sep 2020 15:35:44 +0200 Subject: [PATCH] [escher/toolbox_message_tree] Add indirection The children of a ToolboxMessageTree object can be stored as a simple pointer, representing an array of all the children stored consecutively, or as a double pointer, representing an array storing the addresses of all children. Change-Id: I10134684963aaafc635aaf9a2374d0f3c32d3d0c --- escher/include/escher/toolbox_message_tree.h | 38 +++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/escher/include/escher/toolbox_message_tree.h b/escher/include/escher/toolbox_message_tree.h index 835bccde5..1e17b83b0 100644 --- a/escher/include/escher/toolbox_message_tree.h +++ b/escher/include/escher/toolbox_message_tree.h @@ -10,7 +10,7 @@ public: label, text, (insertedText == (I18n::Message)0) ? label : insertedText, - nullptr, + static_cast(0), 0, stripInsertedText); }; @@ -24,7 +24,19 @@ public: N, true); } - const MessageTree * childAtIndex(int index) const override { return &m_children[index]; } + template + constexpr static ToolboxMessageTree Node(I18n::Message label, const ToolboxMessageTree * (&children)[N]) { + return ToolboxMessageTree( + label, + (I18n::Message)0, + (I18n::Message)0, + children, + N, + true); + } + const MessageTree * childAtIndex(int index) const override { + return m_childrenConsecutive ? m_children.m_direct + index : m_children.m_indirect[index]; + } I18n::Message text() const { return m_text; } I18n::Message insertedText() const { return m_insertedText; } bool stripInsertedText() const { return m_stripInsertedText; } @@ -34,12 +46,30 @@ private: m_children(children), m_text(text), m_insertedText(insertedText), - m_stripInsertedText(stripInsertedText) + m_stripInsertedText(stripInsertedText), + m_childrenConsecutive(true) {} - const ToolboxMessageTree * m_children; + constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree ** children, int numberOfChildren, bool stripInsertedText) : + MessageTree(label, numberOfChildren), + m_children(children), + m_text(text), + m_insertedText(insertedText), + m_stripInsertedText(stripInsertedText), + m_childrenConsecutive(false) + {} + + union Children { + public: + constexpr Children(const ToolboxMessageTree * children) : m_direct(children) {} + constexpr Children(const ToolboxMessageTree ** children) : m_indirect(children) {} + const ToolboxMessageTree * m_direct; + const ToolboxMessageTree ** m_indirect; + }; + const Children m_children; I18n::Message m_text; I18n::Message m_insertedText; bool m_stripInsertedText; + const bool m_childrenConsecutive; }; #endif