void parse (StringParser& p, T& out) { size_t start = p.pos (); std::istringstream stream (p.value ().substr (start)); std::istream& stream2 (stream); stream2 >> out; if (stream.fail ()) { stream.clear (); std::streampos pos = stream.tellg (); ASSERT (pos >= 0); throw ParseException (typeid (T), p.value (), start, start + (size_t) pos, "operator>> failed"); } stream.clear (); // Needed (for clearing EOF bit?), otherwise stream.tellg() fails (returns -1) std::streampos pos = stream.tellg (); ASSERT (pos >= 0); p.skip ((size_t) pos); }
void parse (StringParser& p, std::complex<F>& out) { size_t start = p.pos (); F real, imag; parse (p, real); size_t pos = p.pos (); p.skipWs (); size_t pos2 = p.pos (); char sign = p.read (); if (sign == '+' || sign == '-') { p.skipWs (); if (p.peek () == 'i' || p.peek () == 'I') { p.read (); imag = sign == '+' ? 1 : -1; } else { p.seek (pos2); parse (p, imag); p.skipWs (); char c = p.read (); if (c != 'i' && c != 'I') { throw ParseException (typeid (std::complex<F>), p.value (), start, p.pos () - 1, "Expected `i' oder `I' after imaginary part"); } } out = std::complex<F> (real, imag); } else { p.seek (pos); out = std::complex<F> (real, 0); } }
void parse (const std::string& s, T& out) { StringParser p (s); parse (p, out); p.skipWs (); if (!p.eof ()) throw ParseException (typeid (T), p.value (), 0, p.pos (), "Got garbage at end of string"); }