diff options
Diffstat (limited to 'llvm/lib/Demangle/StringView.h')
| -rw-r--r-- | llvm/lib/Demangle/StringView.h | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/llvm/lib/Demangle/StringView.h b/llvm/lib/Demangle/StringView.h index 6485e61630f..ca27b41d33b 100644 --- a/llvm/lib/Demangle/StringView.h +++ b/llvm/lib/Demangle/StringView.h @@ -14,6 +14,7 @@ #define LLVM_DEMANGLE_STRINGVIEW_H #include <algorithm> +#include <cassert> class StringView { const char *First; @@ -24,9 +25,16 @@ public: StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {} StringView(const char *First_, const char *Last_) : First(First_), Last(Last_) {} + StringView(const char *First_, size_t Len) + : First(First_), Last(First_ + Len) {} + StringView(const char *Str) : First(Str), Last(Str + strlen(Str)) {} StringView() : First(nullptr), Last(nullptr) {} - StringView substr(size_t From, size_t To) { + StringView substr(size_t From) const { + return StringView(begin() + From, size() - From); + } + + StringView substr(size_t From, size_t To) const { if (To >= size()) To = size() - 1; if (From >= size()) @@ -34,12 +42,38 @@ public: return StringView(First + From, First + To); } - StringView dropFront(size_t N) const { + StringView dropFront(size_t N = 1) const { if (N >= size()) N = size() - 1; return StringView(First + N, Last); } + char front() const { + assert(!empty()); + return *begin(); + } + + char popFront() { + assert(!empty()); + return *First++; + } + + bool consumeFront(char C) { + if (!startsWith(C)) + return false; + *this = dropFront(1); + return true; + } + + bool consumeFront(StringView S) { + if (!startsWith(S)) + return false; + *this = dropFront(S.size()); + return true; + } + + bool startsWith(char C) const { return !empty() && *begin() == C; } + bool startsWith(StringView Str) const { if (Str.size() > size()) return false; |

