#pragma once #include #include namespace qsg { using NodeType = QSGNode; template struct seq; template<> struct seq<> { static void append(NodeType* root) { } }; template struct seq { static void append(NodeType* root) { T::append(root); } }; template struct seq { static void append(NodeType* root) { T::append(root); seq::append(root); } }; template struct par; template struct par { static void append(NodeType* root) { const auto n = N; for (int i = 0; i < N; ++i) { root->appendChildNode(new T); } } }; template struct par { static void append(NodeType* root) { const auto n = N; for (int i = 0; i < N; ++i) { auto* const t = new T; U::append(t); root->appendChildNode(t); } } }; template struct ensure; template struct ensure { static Q_REQUIRED_RESULT Root* node(NodeType* root = nullptr) { if(root == nullptr) { root = new Root; } return static_cast(root); } }; template struct ensure { static Q_REQUIRED_RESULT Root* node(NodeType* root = nullptr) { if(root == nullptr) { root = new Root; Append::append(root); } return static_cast(root); } }; }