mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
In a followup I'm looking to add a Microsoft demangler. Doing so needs a lot of the same utility classes and feature test macros which are already implemented in ItaniumDemangle.cpp. So move all of these things into header files so that they can be re-used by a new demangler. Differential Revision: https://reviews.llvm.org/D49399 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337217 91177308-0d34-0410-b5e6-96231b3b80d8
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
//===--- StringView.h -------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//
|
|
// This file contains a limited version of LLVM's StringView class. It is
|
|
// copied here so that LLVMDemangle need not take a dependency on LLVMSupport.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_DEMANGLE_STRINGVIEW_H
|
|
#define LLVM_DEMANGLE_STRINGVIEW_H
|
|
|
|
#include <algorithm>
|
|
|
|
class StringView {
|
|
const char *First;
|
|
const char *Last;
|
|
|
|
public:
|
|
template <size_t N>
|
|
StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {}
|
|
StringView(const char *First_, const char *Last_)
|
|
: First(First_), Last(Last_) {}
|
|
StringView() : First(nullptr), Last(nullptr) {}
|
|
|
|
StringView substr(size_t From, size_t To) {
|
|
if (To >= size())
|
|
To = size() - 1;
|
|
if (From >= size())
|
|
From = size() - 1;
|
|
return StringView(First + From, First + To);
|
|
}
|
|
|
|
StringView dropFront(size_t N) const {
|
|
if (N >= size())
|
|
N = size() - 1;
|
|
return StringView(First + N, Last);
|
|
}
|
|
|
|
bool startsWith(StringView Str) const {
|
|
if (Str.size() > size())
|
|
return false;
|
|
return std::equal(Str.begin(), Str.end(), begin());
|
|
}
|
|
|
|
const char &operator[](size_t Idx) const { return *(begin() + Idx); }
|
|
|
|
const char *begin() const { return First; }
|
|
const char *end() const { return Last; }
|
|
size_t size() const { return static_cast<size_t>(Last - First); }
|
|
bool empty() const { return First == Last; }
|
|
};
|
|
|
|
inline bool operator==(const StringView &LHS, const StringView &RHS) {
|
|
return LHS.size() == RHS.size() &&
|
|
std::equal(LHS.begin(), LHS.end(), RHS.begin());
|
|
}
|
|
|
|
#endif
|