(C++) NewickToString

January 7, 2018 · View on GitHub

 

 

 

 

 

(C++) NewickToString

 

NewickToString is a Newick code snippets to convert a Newick to std::string.

 


struct BinaryNewickVector {   enum { bracket_open  = -1 };   enum { bracket_close = -2 };   enum { comma         = -3 };   enum { new_line      = -4 };   enum { null          = -5 }; }; ///NewickToString converts a Newick std::vector<int> to a ///standard-format std::string. ///From http://www.richelbilderbeek.nl/CppNewickToString.htm const std::string NewickToString(const std::vector<int>& v) {   assert(v.size() > 2 && "A Newick must at least have one single value");   assert(v[0] == BinaryNewickVector::bracket_open     && "A std::vector<int> Newick must start with a bracket_open");   assert(v[v.size() - 1] == BinaryNewickVector::bracket_close     && "A std::vector<int> Newick must end with a bracket_close");   std::string s;   s.reserve(2 * v.size()); //Just a guess   const int sz = v.size();   for (int i=0; i!=sz; ++i)   {     const int x = v[i];     if (x >= 0)     {       s+=boost::lexical_cast<std::string>(x);       assert(i+1<sz && "Must not end with number");       const int next = v[i+1];       if (next > 0 || next == BinaryNewickVector::bracket_open)       {         s+=",";       }     }     else if (x==BinaryNewickVector::bracket_open)     {       s+="(";     }     else if (x==BinaryNewickVector::bracket_close)     {       s+=")";       //Final closing bracket?       if (i+1==sz) break;       const int next = v[i+1];       if (next > 0 || next == BinaryNewickVector::bracket_open)       {         s+=",";       }     }     else     {       assert(!"Should not get here"         && "A std::vector<int> Newick must consist of brackets and values only");     }   }   return s; }