| 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 String 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; | 
| + } | 
| +}; |