[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
This commit is contained in:
Gabriel Ozouf
2020-09-21 15:35:44 +02:00
committed by Émilie Feral
parent f777cad3f7
commit 6105f44a46

View File

@@ -10,7 +10,7 @@ public:
label,
text,
(insertedText == (I18n::Message)0) ? label : insertedText,
nullptr,
static_cast<ToolboxMessageTree *>(0),
0,
stripInsertedText);
};
@@ -24,7 +24,19 @@ public:
N,
true);
}
const MessageTree * childAtIndex(int index) const override { return &m_children[index]; }
template <int N>
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