1*c05d8e5dSAndroid Build Coastguard Worker //===--- StringView.h -------------------------------------------*- C++ -*-===// 2*c05d8e5dSAndroid Build Coastguard Worker // 3*c05d8e5dSAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*c05d8e5dSAndroid Build Coastguard Worker // 5*c05d8e5dSAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*c05d8e5dSAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*c05d8e5dSAndroid Build Coastguard Worker // 8*c05d8e5dSAndroid Build Coastguard Worker // 9*c05d8e5dSAndroid Build Coastguard Worker // This file is copied from llvm/lib/Demangle/StringView.h. 10*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 11*c05d8e5dSAndroid Build Coastguard Worker 12*c05d8e5dSAndroid Build Coastguard Worker #ifndef LIBCXX_DEMANGLE_STRINGVIEW_H 13*c05d8e5dSAndroid Build Coastguard Worker #define LIBCXX_DEMANGLE_STRINGVIEW_H 14*c05d8e5dSAndroid Build Coastguard Worker 15*c05d8e5dSAndroid Build Coastguard Worker #include <algorithm> 16*c05d8e5dSAndroid Build Coastguard Worker #include <cassert> 17*c05d8e5dSAndroid Build Coastguard Worker #include <cstring> 18*c05d8e5dSAndroid Build Coastguard Worker 19*c05d8e5dSAndroid Build Coastguard Worker namespace { 20*c05d8e5dSAndroid Build Coastguard Worker class StringView { 21*c05d8e5dSAndroid Build Coastguard Worker const char *First; 22*c05d8e5dSAndroid Build Coastguard Worker const char *Last; 23*c05d8e5dSAndroid Build Coastguard Worker 24*c05d8e5dSAndroid Build Coastguard Worker public: 25*c05d8e5dSAndroid Build Coastguard Worker template <size_t N> StringView(const char (& Str)[N])26*c05d8e5dSAndroid Build Coastguard Worker StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {} StringView(const char * First_,const char * Last_)27*c05d8e5dSAndroid Build Coastguard Worker StringView(const char *First_, const char *Last_) 28*c05d8e5dSAndroid Build Coastguard Worker : First(First_), Last(Last_) {} StringView(const char * First_,size_t Len)29*c05d8e5dSAndroid Build Coastguard Worker StringView(const char *First_, size_t Len) 30*c05d8e5dSAndroid Build Coastguard Worker : First(First_), Last(First_ + Len) {} StringView(const char * Str)31*c05d8e5dSAndroid Build Coastguard Worker StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {} StringView()32*c05d8e5dSAndroid Build Coastguard Worker StringView() : First(nullptr), Last(nullptr) {} 33*c05d8e5dSAndroid Build Coastguard Worker substr(size_t From)34*c05d8e5dSAndroid Build Coastguard Worker StringView substr(size_t From) const { 35*c05d8e5dSAndroid Build Coastguard Worker return StringView(begin() + From, size() - From); 36*c05d8e5dSAndroid Build Coastguard Worker } 37*c05d8e5dSAndroid Build Coastguard Worker substr(size_t From,size_t To)38*c05d8e5dSAndroid Build Coastguard Worker StringView substr(size_t From, size_t To) const { 39*c05d8e5dSAndroid Build Coastguard Worker if (To >= size()) 40*c05d8e5dSAndroid Build Coastguard Worker To = size() - 1; 41*c05d8e5dSAndroid Build Coastguard Worker if (From >= size()) 42*c05d8e5dSAndroid Build Coastguard Worker From = size() - 1; 43*c05d8e5dSAndroid Build Coastguard Worker return StringView(First + From, First + To); 44*c05d8e5dSAndroid Build Coastguard Worker } 45*c05d8e5dSAndroid Build Coastguard Worker 46*c05d8e5dSAndroid Build Coastguard Worker StringView dropFront(size_t N = 1) const { 47*c05d8e5dSAndroid Build Coastguard Worker if (N >= size()) 48*c05d8e5dSAndroid Build Coastguard Worker N = size() - 1; 49*c05d8e5dSAndroid Build Coastguard Worker return StringView(First + N, Last); 50*c05d8e5dSAndroid Build Coastguard Worker } 51*c05d8e5dSAndroid Build Coastguard Worker front()52*c05d8e5dSAndroid Build Coastguard Worker char front() const { 53*c05d8e5dSAndroid Build Coastguard Worker assert(!empty()); 54*c05d8e5dSAndroid Build Coastguard Worker return *begin(); 55*c05d8e5dSAndroid Build Coastguard Worker } 56*c05d8e5dSAndroid Build Coastguard Worker popFront()57*c05d8e5dSAndroid Build Coastguard Worker char popFront() { 58*c05d8e5dSAndroid Build Coastguard Worker assert(!empty()); 59*c05d8e5dSAndroid Build Coastguard Worker return *First++; 60*c05d8e5dSAndroid Build Coastguard Worker } 61*c05d8e5dSAndroid Build Coastguard Worker consumeFront(char C)62*c05d8e5dSAndroid Build Coastguard Worker bool consumeFront(char C) { 63*c05d8e5dSAndroid Build Coastguard Worker if (!startsWith(C)) 64*c05d8e5dSAndroid Build Coastguard Worker return false; 65*c05d8e5dSAndroid Build Coastguard Worker *this = dropFront(1); 66*c05d8e5dSAndroid Build Coastguard Worker return true; 67*c05d8e5dSAndroid Build Coastguard Worker } 68*c05d8e5dSAndroid Build Coastguard Worker consumeFront(StringView S)69*c05d8e5dSAndroid Build Coastguard Worker bool consumeFront(StringView S) { 70*c05d8e5dSAndroid Build Coastguard Worker if (!startsWith(S)) 71*c05d8e5dSAndroid Build Coastguard Worker return false; 72*c05d8e5dSAndroid Build Coastguard Worker *this = dropFront(S.size()); 73*c05d8e5dSAndroid Build Coastguard Worker return true; 74*c05d8e5dSAndroid Build Coastguard Worker } 75*c05d8e5dSAndroid Build Coastguard Worker startsWith(char C)76*c05d8e5dSAndroid Build Coastguard Worker bool startsWith(char C) const { return !empty() && *begin() == C; } 77*c05d8e5dSAndroid Build Coastguard Worker startsWith(StringView Str)78*c05d8e5dSAndroid Build Coastguard Worker bool startsWith(StringView Str) const { 79*c05d8e5dSAndroid Build Coastguard Worker if (Str.size() > size()) 80*c05d8e5dSAndroid Build Coastguard Worker return false; 81*c05d8e5dSAndroid Build Coastguard Worker return std::equal(Str.begin(), Str.end(), begin()); 82*c05d8e5dSAndroid Build Coastguard Worker } 83*c05d8e5dSAndroid Build Coastguard Worker 84*c05d8e5dSAndroid Build Coastguard Worker const char &operator[](size_t Idx) const { return *(begin() + Idx); } 85*c05d8e5dSAndroid Build Coastguard Worker begin()86*c05d8e5dSAndroid Build Coastguard Worker const char *begin() const { return First; } end()87*c05d8e5dSAndroid Build Coastguard Worker const char *end() const { return Last; } size()88*c05d8e5dSAndroid Build Coastguard Worker size_t size() const { return static_cast<size_t>(Last - First); } empty()89*c05d8e5dSAndroid Build Coastguard Worker bool empty() const { return First == Last; } 90*c05d8e5dSAndroid Build Coastguard Worker }; 91*c05d8e5dSAndroid Build Coastguard Worker 92*c05d8e5dSAndroid Build Coastguard Worker inline bool operator==(const StringView &LHS, const StringView &RHS) { 93*c05d8e5dSAndroid Build Coastguard Worker return LHS.size() == RHS.size() && 94*c05d8e5dSAndroid Build Coastguard Worker std::equal(LHS.begin(), LHS.end(), RHS.begin()); 95*c05d8e5dSAndroid Build Coastguard Worker } 96*c05d8e5dSAndroid Build Coastguard Worker } // namespace 97*c05d8e5dSAndroid Build Coastguard Worker 98*c05d8e5dSAndroid Build Coastguard Worker #endif 99