xref: /aosp_15_r20/external/libcxxabi/src/demangle/StringView.h (revision c05d8e5dc3e10f6ce4317e8bc22cc4a25f55fa94)
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