libcxxabi

libcxxabi mirror with random patches
git clone https://git.neptards.moe/neptards/libcxxabi.git
Log | Files | Refs

StringView.h (2544B)


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