znode ist eine header-only Klasse in modern c++ für generische Baumstrukturen. Zusammen mit dem
pugixml Parser bildet sie die Datenschicht für das
xtree widget-set .
Die Implementierung verwendet ausschließlich std::c++. Um die Klasse unabhängig vom verwendeten Zeichenkettentyp zu halten, wird dieser als template-parameter übergeben und es wurde ‚bridge-code‘ für diejenigen String-funktionen hinzugefügt, die in den verschiedenen Basis-Stringklassen untschiedlich implementiert sind, etwa
substr(), split(), is_empty(), find() ...
Dadurch kann die Verarbeitung von Baumstrukturen auch unabhängig vom Qt-Framework implementiert werden, für das
xtree widget-set wird der String-Parameter das templates entsprechend mit ‚QString‘ instanziiert.
Auch die Datenstruktur für die Nutzlast, in diesem Fall die XML-Attributwerte, wird als template parameter übergeben und ‚drangeerbt‘. Derzeit wird eine einfache std::map<StringType,StringType> verwendet, denkbar wären auch propertymaps mit std::variant oder array-Strukturen mit externem Index.
Es ergibt sich folgende Klassendefinition:
//! tree-klasse, besonderheit: der nutzlast & string-type sind templated.
template<typename str_t, typename payload_t>
class zbasic_node : public zid, public payload_t, public std::enable_shared_from_this<zbasic_node<str_t,payload_t>>
{
public:
using zweak_node = std::weak_ptr<zbasic_node>;
using zshared_node = std::shared_ptr<zbasic_node>;
using znode_list = std::vector<zshared_node>;
using zshared_cref = const std::shared_ptr<zbasic_node>&;
using str_cref = const str_t&;
using str_list = std::vector<str_t>;
using ziterator = znode_iterator<zbasic_node>;
protected:
zweak_node _parent;
znode_list _children;
...
};