Exemple #1
0
 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);
 }
Exemple #2
0
 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);
   }
 }
Exemple #3
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");
 }