diff --git a/src/GraphMLWriter.hpp b/src/GraphMLWriter.hpp index eea1c1c83063ce01b9a6b1717751ea424fe27152..4179f219d169ca33f90b861f10d2e81bc926c1fd 100644 --- a/src/GraphMLWriter.hpp +++ b/src/GraphMLWriter.hpp @@ -7,6 +7,16 @@ #include <boost/fusion/include/for_each.hpp> #include <fstream> +namespace std +{ + // We need the definition of std::to_string that work on string + + std::string to_string(std::string s) + { + return s; + } +} + /*! \brief this class is a functor for "for_each" algorithm * * This class is a functor for "for_each" algorithm. For each @@ -68,23 +78,23 @@ struct vertex_prop if (cnt < n_attr) { // if it is a yFile extension property name, does not process it - if (attributes_names[t] == "x" || attributes_names[t] == "y" - || attributes_names[t] == "z" || attributes_names[t] == "shape" ) + if (attributes_names[cnt] == "x" || attributes_names[cnt] == "y" + || attributes_names[cnt] == "z" || attributes_names[cnt] == "shape" ) {cnt++; return ;} // Create a property string based on the type of the property if (typeid(T) == typeid(float)) - v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"float\"/>"; + v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"float\"/>"; else if (typeid(T) == typeid(double)) - v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"double\"/>"; + v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"double\"/>"; else if (typeid(T) == typeid(int)) - v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"int\"/>"; + v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"int\"/>"; else if (typeid(T) == typeid(long int)) - v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"long\"/>"; + v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"long\"/>"; else if (typeid(T) == typeid(bool)) - v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"boolean\"/>"; + v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"boolean\"/>"; else if (typeid(T) == typeid(std::string)) - v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"string\"/>"; + v_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"string\"/>"; } cnt++; @@ -275,7 +285,7 @@ struct edge_prop * \param n_prop number of properties * */ - edge_prop(std::string & v_prop) + edge_prop(std::string & e_prop) :e_prop(e_prop),attributes_names(NULL) { }; @@ -288,23 +298,23 @@ struct edge_prop if (cnt < n_attr) { // if it is a yFile extension property name, does not process it - if (attributes_names[t] == "x" || attributes_names[t] == "y" - || attributes_names[t] == "z" || attributes_names[t] == "shape" ) + if (attributes_names[cnt] == "x" || attributes_names[cnt] == "y" + || attributes_names[cnt] == "z" || attributes_names[cnt] == "shape" ) {cnt++; return ;} // Create a property string based on the type of the property if (typeid(T) == typeid(float)) - e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"float\"/>"; + e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"float\"/>"; else if (typeid(T) == typeid(double)) - e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"double\"/>"; + e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"double\"/>"; else if (typeid(T) == typeid(int)) - e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"int\"/>"; + e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"int\"/>"; else if (typeid(T) == typeid(long int)) - e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"long\"/>"; + e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"long\"/>"; else if (typeid(T) == typeid(bool)) - e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"boolean\"/>"; + e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"boolean\"/>"; else if (typeid(T) == typeid(std::string)) - e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[t] + " attr.type=\"string\"/>"; + e_prop += "<key id=\"v" + std::to_string(cnt) + "\" for=\"node\" attr.name=" + attributes_names[cnt] + " attr.type=\"string\"/>"; } cnt++; @@ -373,7 +383,7 @@ struct edge_node * \param n_prop number of properties * */ - edge_node(std::string & v_node, const typename G::V_container & n_obj) + edge_node(std::string & v_node, const typename G::E_container & n_obj) :vo(n_obj),e_node(e_node),attributes_names(NULL) { }; @@ -406,7 +416,7 @@ struct edge_node void end_node() { // close a node - v_node += "</node>"; + e_node += "</node>"; } //! It call the functor for each member @@ -429,17 +439,17 @@ struct edge_node { // Create a property string based on the type of the property if (typeid(decltype(vo.template get<T::value>())) == typeid(float)) - v_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; + e_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; else if (typeid(decltype(vo.template get<T::value>())) == typeid(double)) - v_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; + e_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; else if (typeid(decltype(vo.template get<T::value>())) == typeid(int)) - v_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; + e_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; else if (typeid(decltype(vo.template get<T::value>())) == typeid(long int)) - v_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; + e_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; else if (typeid(decltype(vo.template get<T::value>())) == typeid(bool)) - v_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; + e_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; else if (typeid(decltype(vo.template get<T::value>())) == typeid(std::string)) - v_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; + e_node += "<data key=\"key" + std::to_string(cnt) + "\">" + std::to_string(vo.template get<T::value>()) + "</>"; } } @@ -496,16 +506,16 @@ class GraphMLWriter std::string get_edge_properties_list() { //! edge property output string - std::string v_out; + std::string e_out(" "); // create a vertex property functor - edge_prop<Graph> vp(v_out); + edge_prop<Graph> ep(e_out); // Iterate through all the vertex and create the vertex list - boost::mpl::for_each< typename Graph::E_type::type >(vp); + boost::mpl::for_each< typename Graph::E_type::type >(ep); // return the edge properties string - return v_out; + return e_out; } std::string get_vertex_list() @@ -523,7 +533,7 @@ class GraphMLWriter vertex_node<Graph> vn(v_out,g.vertex(it.get())); // Iterate through all the vertex and create the vertex list - boost::mpl::for_each< typename Graph::V_type::type >(vn); + boost::mpl::for_each< boost::mpl::range_c<int,0,Graph::V_type::max_prop-1> >(vn); // increment the operator ++it; @@ -545,10 +555,10 @@ class GraphMLWriter while (it.isNext()) { // create an edge list functor - edge_node<Graph> en(v_out,g.edge(it)); + edge_node<Graph> en(v_out,g.edge(it.get())); // Iterate through all the vertex and create the vertex list - boost::mpl::for_each< typename Graph::E_type::type >(en); + boost::mpl::for_each< boost::mpl::range_c<int,0,Graph::V_type::max_prop-1> >(en); // increment the operator ++it;