/*************************************************************************** source::worx xtree Copyright © 2024-2025 c.holzheuer christoph.holzheuer@gmail.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. ***************************************************************************/ #ifndef ZNODE_FACTORY_H #define ZNODE_FACTORY_H #include #include class xtree; /* nodes: nackt also ungekaspselt? -> children() -> attributes() attributes: ja was seid ihr denn? als string gelesen, als string geschrieben, aber dazwischen? -> std::variant mit enum type{t_bool = 0 ...}; -> conversion mit boost::lexical_cast<> bzw. std::to_string() und std::stoi(), std::stod() -> beim parsen konvertieren? contains '.'? is_number? -> betrifft tag_values und tag_attributes -> vorher definieren? attribute 'voltage' == double, oder gar mehr: unit V, double, range -> über xs:double? model: muss ich wirklich jeden attibute node einzeln angeben? */ namespace znode { template class znode_factory { public: using str_cref = const str_t&; using zshared_node = std::shared_ptr>; znode_factory() = default; virtual ~znode_factory() = default; zshared_node load_tree( const std::string& filename ) { pugi::xml_document tree_document; // load document pugi::xml_parse_result result = tree_document.load_file( filename.c_str() ); if( !result ) { throw XQException( "znode_factory::load_tree: parse error: ", result.description() ); } //MemberFunc func = &znode_factory::process_node; //xtreewalker parser(this,func); //_current_depth = -1; //tree_document.traverse(parser); //zbasic_node* root_node = new zbasic_node*("root!"); zshared_node root_node = zbasic_node::make_node("root!"); //T root_node = T::make_node( "root!" ); // prepare root == model !? pugi::xml_node tmp_node = tree_document.first_child(); while(tmp_node) { //qDebug() << " --- znode_factory building: " << tmp_node.name(); create_node( tmp_node, root_node ); tmp_node = tmp_node.next_sibling(); } //znode::zmeas_para* xxx = new znode::zmeas_para("mookoo!"); //xxx->apply_command(42); // _root_node->apply_command(42); //size_t idx = _root_node->add_child( xxx); //qDebug() << " jo: " << _root_node->child(idx)->tag_name(); return root_node; } protected: void create_node(const pugi::xml_node& xml_node, zshared_node parent) { //T* new_node = new T( node.name(), node.child_value(), parent ); //parent->add_child( new_node ); //zbasic_node* new_node = new zbasic_node( node.name(), node.child_value(), parent ); zshared_node new_node = zbasic_node::make_node( xml_node.name(), xml_node.child_value(), parent ); parent->add_child( new_node ); if( !xml_node.attributes().empty() ) { for (pugi::xml_attribute attr: xml_node.attributes()) new_node->set_attribute( attr.name(), attr.value() ); } if( !xml_node.children().empty() && std::string( xml_node.child_value() ).empty() ) { for (pugi::xml_node child : xml_node.children()) create_node( child, new_node ); } } }; } #endif // ZNODE_FACTORY_H