| Index: compiled/StringScanner.h | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/compiled/StringScanner.h | 
| @@ -0,0 +1,52 @@ | 
| +#pragma once | 
| + | 
| +#include "String.h" | 
| + | 
| +class StringScanner | 
| +{ | 
| +private: | 
| +  const DependentString mStr; | 
| +  String::size_type mPos; | 
| +  String::size_type mEnd; | 
| +  String::value_type mTerminator; | 
| +public: | 
| +  StringScanner(const String& str, String::size_type pos = 0, | 
| +        String::value_type terminator = u'\0') | 
| +      : mStr(str), mPos(pos), mEnd(str.length()), mTerminator(terminator) {} | 
| + | 
| +  bool done() | 
| +  { | 
| +    return mPos >= mEnd; | 
| +  } | 
| + | 
| +  String::size_type position() | 
| +  { | 
| +    return mPos - 1; | 
| +  } | 
| + | 
| +  String::value_type next() | 
| +  { | 
| +    String::value_type result = done() ? mTerminator : mStr[mPos]; | 
| +    mPos++; | 
| +    return result; | 
| +  } | 
| + | 
| +  bool skipOne(String::value_type ch) | 
| +  { | 
| +    if (!done() && mStr[mPos] == ch) | 
| +    { | 
| +      mPos++; | 
| +      return true; | 
| +    } | 
| + | 
| +    return false; | 
| +  } | 
| + | 
| +  bool skip(String::value_type ch) | 
| +  { | 
| +    String::size_type oldPos = mPos; | 
| +    while (!done() && mStr[mPos] == ch) | 
| +      mPos++; | 
| +    return oldPos != mPos; | 
| +  } | 
| +}; | 
|  |