17ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===--- StringRef.h - Constant String Reference Wrapper --------*- C++ -*-===// 27ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 37ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// The LLVM Compiler Infrastructure 47ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 57ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// This file is distributed under the University of Illinois Open Source 67ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// License. See LICENSE.TXT for details. 77ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens// 87ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens//===----------------------------------------------------------------------===// 97ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#ifndef LLVM_ADT_STRINGREF_H 117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#define LLVM_ADT_STRINGREF_H 127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 132df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/STLExtras.h" 147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/ADT/iterator_range.h" 157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include "llvm/Support/Compiler.h" 167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <algorithm> 177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <cassert> 187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <cstring> 197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <limits> 207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <string> 217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#include <utility> 227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capensnamespace llvm { 247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <typename T> 257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens class SmallVectorImpl; 267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens class APInt; 277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens class hash_code; 287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens class StringRef; 297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Helper functions for StringRef::getAsInteger. 317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool getAsUnsignedInteger(StringRef Str, unsigned Radix, 327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens unsigned long long &Result); 337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool getAsSignedInteger(StringRef Str, unsigned Radix, long long &Result); 357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool consumeUnsignedInteger(StringRef &Str, unsigned Radix, 372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned long long &Result); 382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool consumeSignedInteger(StringRef &Str, unsigned Radix, long long &Result); 392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// StringRef - Represent a constant reference to a string, i.e. a character 417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// array and a length, which need not be null terminated. 427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// This class does not own the string data, it is expected to be used in 447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// situations where the character data resides in some other buffer, whose 457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// lifetime extends past that of the StringRef. For this reason, it is not in 467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// general safe to store a StringRef. 477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens class StringRef { 487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens public: 497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef const char *iterator; 507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef const char *const_iterator; 517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static const size_t npos = ~size_t(0); 527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typedef size_t size_type; 537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens private: 557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// The start of the string, in an external buffer. 562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens const char *Data = nullptr; 577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// The length of the string. 592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t Length = 0; 607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Workaround memcmp issue with null pointers (undefined behavior) 627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // by providing a specialized version 637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static int compareMemory(const char *Lhs, const char *Rhs, size_t Length) { 657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Length == 0) { return 0; } 667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return ::memcmp(Lhs,Rhs,Length); 677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens public: 707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name Constructors 717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Construct an empty string ref. 742df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /*implicit*/ StringRef() = default; 752df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 762df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Disable conversion from nullptr. This prevents things like 772df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// if (S == nullptr) 782df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef(std::nullptr_t) = delete; 797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Construct a string ref from a cstring. 812df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /*implicit*/ StringRef(const char *Str) 832df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens : Data(Str), Length(Str ? ::strlen(Str) : 0) {} 847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Construct a string ref from a pointer and length. 867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 872df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /*implicit*/ constexpr StringRef(const char *data, size_t length) 882df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens : Data(data), Length(length) {} 897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Construct a string ref from an std::string. 917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /*implicit*/ StringRef(const std::string &Str) 937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens : Data(Str.data()), Length(Str.length()) {} 947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 952df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens static StringRef withNullAsEmpty(const char *data) { 962df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return StringRef(data ? data : ""); 972df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 982df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 1007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name Iterators 1017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 1027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens iterator begin() const { return Data; } 1047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens iterator end() const { return Data + Length; } 1067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const unsigned char *bytes_begin() const { 1087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return reinterpret_cast<const unsigned char *>(begin()); 1097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const unsigned char *bytes_end() const { 1117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return reinterpret_cast<const unsigned char *>(end()); 1127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens iterator_range<const unsigned char *> bytes() const { 1147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return make_range(bytes_begin(), bytes_end()); 1157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 1187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name String Operations 1197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 1207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// data - Get a pointer to the start of the string (which may not be null 1227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// terminated). 1232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 1257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens const char *data() const { return Data; } 1267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// empty - Check if the string is empty. 1282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 1307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool empty() const { return Length == 0; } 1317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// size - Get the string size. 1332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 1357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t size() const { return Length; } 1367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// front - Get the first character in the string. 1382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens char front() const { 1407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(!empty()); 1417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Data[0]; 1427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// back - Get the last character in the string. 1452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens char back() const { 1477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(!empty()); 1487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Data[Length-1]; 1497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // copy - Allocate copy in Allocator and return StringRef to it. 1522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens template <typename Allocator> 1532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD StringRef copy(Allocator &A) const { 1547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Don't request a length 0 copy from the allocator. 1557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (empty()) 1567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return StringRef(); 1577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens char *S = A.template Allocate<char>(Length); 1587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::copy(begin(), end(), S); 1597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return StringRef(S, Length); 1607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// equals - Check for string equality, this is more efficient than 1637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// compare() when the relative ordering of inequal strings isn't needed. 1642df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 1667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool equals(StringRef RHS) const { 1677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return (Length == RHS.Length && 1687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens compareMemory(Data, RHS.Data, RHS.Length) == 0); 1697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// equals_lower - Check for string equality, ignoring case. 1722df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool equals_lower(StringRef RHS) const { 1747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Length == RHS.Length && compare_lower(RHS) == 0; 1757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// compare - Compare two strings; the result is -1, 0, or 1 if this string 1787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// is lexicographically less than, equal to, or greater than the \p RHS. 1792df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 1817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens int compare(StringRef RHS) const { 1827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Check the prefix for a mismatch. 1837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (int Res = compareMemory(Data, RHS.Data, std::min(Length, RHS.Length))) 1847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Res < 0 ? -1 : 1; 1857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Otherwise the prefixes match, so we only need to check the lengths. 1877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Length == RHS.Length) 1887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return 0; 1897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Length < RHS.Length ? -1 : 1; 1907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 1917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// compare_lower - Compare two strings, ignoring case. 1932df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens int compare_lower(StringRef RHS) const; 1957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 1967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// compare_numeric - Compare two strings, treating sequences of digits as 1977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// numbers. 1982df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 1997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens int compare_numeric(StringRef RHS) const; 2007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Determine the edit distance between this string and another 2027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// string. 2037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Other the string to compare this string against. 2057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param AllowReplacements whether to allow character 2077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// replacements (change one character into another) as a single 2087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// operation, rather than as two operations (an insertion and a 2097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// removal). 2107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param MaxEditDistance If non-zero, the maximum edit distance that 2127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// this routine is allowed to compute. If the edit distance will exceed 2137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// that maximum, returns \c MaxEditDistance+1. 2147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns the minimum number of character insertions, removals, 2167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// or (if \p AllowReplacements is \c true) replacements needed to 2177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// transform one of the given strings into the other. If zero, 2187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the strings are identical. 2192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens unsigned edit_distance(StringRef Other, bool AllowReplacements = true, 2217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens unsigned MaxEditDistance = 0) const; 2227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// str - Get the contents as an std::string. 2242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::string str() const { 2267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (!Data) return std::string(); 2277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::string(Data, Length); 2287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 2317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name Operator Overloads 2327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 2337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens char operator[](size_t Index) const { 2367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(Index < Length && "Invalid index!"); 2377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Data[Index]; 2387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Disallow accidental assignment from a temporary std::string. 2412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 2422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// The declaration here is extra complicated so that `stringRef = {}` 2432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// and `stringRef = "abc"` continue to select the move assignment operator. 2442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens template <typename T> 2452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens typename std::enable_if<std::is_same<T, std::string>::value, 2462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef>::type & 2472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens operator=(T &&Str) = delete; 2482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 2497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 2507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name Type Conversions 2517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 2527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens operator std::string() const { 2547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return str(); 2557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 2587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name String Predicates 2597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 2607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Check if this string starts with the given \p Prefix. 2622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 2647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool startswith(StringRef Prefix) const { 2657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Length >= Prefix.Length && 2667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens compareMemory(Data, Prefix.Data, Prefix.Length) == 0; 2677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Check if this string starts with the given \p Prefix, ignoring case. 2702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool startswith_lower(StringRef Prefix) const; 2727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Check if this string ends with the given \p Suffix. 2742df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 2767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool endswith(StringRef Suffix) const { 2777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Length >= Suffix.Length && 2787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens compareMemory(end() - Suffix.Length, Suffix.Data, Suffix.Length) == 0; 2797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 2807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Check if this string ends with the given \p Suffix, ignoring case. 2822df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool endswith_lower(StringRef Suffix) const; 2847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 2867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name String Searching 2877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 2887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 2897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Search for the first character \p C in the string. 2907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 2917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns The index of the first occurrence of \p C, or npos if not 2927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 2932df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 2947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 2957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find(char C, size_t From = 0) const { 2967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t FindBegin = std::min(From, Length); 2977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (FindBegin < Length) { // Avoid calling memchr with nullptr. 2987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Just forward to memchr, which is faster than a hand-rolled loop. 2997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (const void *P = ::memchr(Data + FindBegin, C, Length - FindBegin)) 3007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return static_cast<const char *>(P) - Data; 3017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return npos; 3037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3052df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Search for the first character \p C in the string, ignoring case. 3062df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 3072df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \returns The index of the first occurrence of \p C, or npos if not 3082df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// found. 3092df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t find_lower(char C, size_t From = 0) const; 3112df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3122df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Search for the first character satisfying the predicate \p F 3132df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 3142df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \returns The index of the first character satisfying \p F starting from 3152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \p From, or npos if not found. 3162df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 3182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t find_if(function_ref<bool(char)> F, size_t From = 0) const { 3192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef S = drop_front(From); 3202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens while (!S.empty()) { 3212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens if (F(S.front())) 3222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return size() - S.size(); 3232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens S = S.drop_front(); 3242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 3252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return npos; 3262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 3272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Search for the first character not satisfying the predicate \p F 3292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 3302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \returns The index of the first character not satisfying \p F starting 3312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// from \p From, or npos if not found. 3322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 3342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t find_if_not(function_ref<bool(char)> F, size_t From = 0) const { 3352df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return find_if([F](char c) { return !F(c); }, From); 3362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 3372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Search for the first string \p Str in the string. 3397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 3407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns The index of the first occurrence of \p Str, or npos if not 3417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 3422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find(StringRef Str, size_t From = 0) const; 3447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Search for the first string \p Str in the string, ignoring case. 3462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 3472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \returns The index of the first occurrence of \p Str, or npos if not 3482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// found. 3492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t find_lower(StringRef Str, size_t From = 0) const; 3512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Search for the last character \p C in the string. 3537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 3547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns The index of the last occurrence of \p C, or npos if not 3557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 3562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t rfind(char C, size_t From = npos) const { 3587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens From = std::min(From, Length); 3597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t i = From; 3607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens while (i != 0) { 3617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens --i; 3627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Data[i] == C) 3637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return i; 3647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return npos; 3667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3682df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Search for the last character \p C in the string, ignoring case. 3692df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 3702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \returns The index of the last occurrence of \p C, or npos if not 3712df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// found. 3722df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3732df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t rfind_lower(char C, size_t From = npos) const; 3742df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Search for the last string \p Str in the string. 3767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 3777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns The index of the last occurrence of \p Str, or npos if not 3787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 3792df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t rfind(StringRef Str) const; 3817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3822df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Search for the last string \p Str in the string, ignoring case. 3832df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 3842df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \returns The index of the last occurrence of \p Str, or npos if not 3852df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// found. 3862df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3872df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens size_t rfind_lower(StringRef Str) const; 3882df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 3897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the first character in the string that is \p C, or npos if not 3907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. Same as find. 3912df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 3927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_first_of(char C, size_t From = 0) const { 3937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return find(C, From); 3947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 3957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 3967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the first character in the string that is in \p Chars, or npos if 3977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// not found. 3987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 3997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Complexity: O(size() + Chars.size()) 4002df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_first_of(StringRef Chars, size_t From = 0) const; 4027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the first character in the string that is not \p C or npos if not 4047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 4052df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_first_not_of(char C, size_t From = 0) const; 4077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the first character in the string that is not in the string 4097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \p Chars, or npos if not found. 4107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 4117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Complexity: O(size() + Chars.size()) 4122df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_first_not_of(StringRef Chars, size_t From = 0) const; 4147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the last character in the string that is \p C, or npos if not 4167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 4172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_last_of(char C, size_t From = npos) const { 4197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return rfind(C, From); 4207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 4217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the last character in the string that is in \p C, or npos if not 4237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 4247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 4257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Complexity: O(size() + Chars.size()) 4262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_last_of(StringRef Chars, size_t From = npos) const; 4287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the last character in the string that is not \p C, or npos if not 4307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// found. 4312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_last_not_of(char C, size_t From = npos) const; 4337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Find the last character in the string that is not in \p Chars, or 4357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// npos if not found. 4367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 4377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Complexity: O(size() + Chars.size()) 4382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t find_last_not_of(StringRef Chars, size_t From = npos) const; 4407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return true if the given string is a substring of *this, and false 4427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// otherwise. 4432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 4457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool contains(StringRef Other) const { return find(Other) != npos; } 4467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return true if the given character is contained in *this, and false 4482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// otherwise. 4492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 4512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool contains(char C) const { return find_first_of(C) != npos; } 4522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 4532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return true if the given string is a substring of *this, and false 4542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// otherwise. 4552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 4572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool contains_lower(StringRef Other) const { 4582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return find_lower(Other) != npos; 4592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 4602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 4612df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return true if the given character is contained in *this, and false 4622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// otherwise. 4632df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4642df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 4652df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool contains_lower(char C) const { return find_lower(C) != npos; } 4662df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 4677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 4687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name Helpful Algorithms 4697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 4707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return the number of occurrences of \p C in the string. 4722df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 4737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t count(char C) const { 4747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t Count = 0; 4757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens for (size_t i = 0, e = Length; i != e; ++i) 4767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Data[i] == C) 4777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens ++Count; 4787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return Count; 4797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 4807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return the number of non-overlapped occurrences of \p Str in 4827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the string. 4837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t count(StringRef Str) const; 4847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 4857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Parse the current string as an integer of the specified radix. If 4867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \p Radix is specified as zero, this does radix autosensing using 4877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// extended C rules: 0 is octal, 0x is hex, 0b is binary. 4887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 4897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If the string is invalid or if only a subset of the string is valid, 4907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// this returns true to signify the error. The string is considered 4917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// erroneous if empty or if it overflows T. 4927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <typename T> 4937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type 4947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens getAsInteger(unsigned Radix, T &Result) const { 4957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens long long LLVal; 4967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (getAsSignedInteger(*this, Radix, LLVal) || 4977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static_cast<T>(LLVal) != LLVal) 4987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return true; 4997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Result = LLVal; 5007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return false; 5017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 5027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <typename T> 5047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type 5057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens getAsInteger(unsigned Radix, T &Result) const { 5067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens unsigned long long ULLVal; 5077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // The additional cast to unsigned long long is required to avoid the 5087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Visual C++ warning C4805: '!=' : unsafe mix of type 'bool' and type 5097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // 'unsigned __int64' when instantiating getAsInteger with T = bool. 5107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (getAsUnsignedInteger(*this, Radix, ULLVal) || 5117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens static_cast<unsigned long long>(static_cast<T>(ULLVal)) != ULLVal) 5127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return true; 5137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Result = ULLVal; 5147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return false; 5157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 5167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Parse the current string as an integer of the specified radix. If 5182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// \p Radix is specified as zero, this does radix autosensing using 5192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// extended C rules: 0 is octal, 0x is hex, 0b is binary. 5202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 5212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// If the string does not begin with a number of the specified radix, 5222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// this returns true to signify the error. The string is considered 5232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// erroneous if empty or if it overflows T. 5242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// The portion of the string representing the discovered numeric value 5252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// is removed from the beginning of the string. 5262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens template <typename T> 5272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type 5282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens consumeInteger(unsigned Radix, T &Result) { 5292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens long long LLVal; 5302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens if (consumeSignedInteger(*this, Radix, LLVal) || 5312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens static_cast<long long>(static_cast<T>(LLVal)) != LLVal) 5322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return true; 5332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Result = LLVal; 5342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return false; 5352df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 5362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 5372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens template <typename T> 5382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type 5392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens consumeInteger(unsigned Radix, T &Result) { 5402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned long long ULLVal; 5412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens if (consumeUnsignedInteger(*this, Radix, ULLVal) || 5422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens static_cast<unsigned long long>(static_cast<T>(ULLVal)) != ULLVal) 5432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return true; 5442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Result = ULLVal; 5452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return false; 5462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 5472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 5487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Parse the current string as an integer of the specified \p Radix, or of 5497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// an autosensed radix if the \p Radix given is 0. The current value in 5507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \p Result is discarded, and the storage is changed to be wide enough to 5517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// store the parsed integer. 5527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 5537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns true if the string does not solely consist of a valid 5547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// non-empty number in the appropriate base. 5557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 5567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// APInt::fromString is superficially similar but assumes the 5577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// string is well-formed in the given radix. 5587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool getAsInteger(unsigned Radix, APInt &Result) const; 5597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 5617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name String Operations 5627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 5637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // Convert the given ASCII string to lowercase. 5652df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 5667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::string lower() const; 5677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Convert the given ASCII string to uppercase. 5692df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 5707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::string upper() const; 5717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 5737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name Substring Operations 5747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 5757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return a reference to the substring from [Start, Start + N). 5777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 5787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Start The index of the starting character in the substring; if 5797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the index is npos or greater than the length of the string then the 5807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// empty substring will be returned. 5817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 5827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param N The number of characters to included in the substring. If N 5837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// exceeds the number of characters remaining in the string, the string 5847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// suffix (starting with \p Start) will be returned. 5852df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 5867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 5877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef substr(size_t Start, size_t N = npos) const { 5887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Start = std::min(Start, Length); 5897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return StringRef(Data + Start, std::min(N, Length - Start)); 5907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 5917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 5927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return a StringRef equal to 'this' but with only the first \p N 5937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// elements remaining. If \p N is greater than the length of the 5947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// string, the entire string is returned. 5952df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 5967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 5977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef take_front(size_t N = 1) const { 5987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (N >= size()) 5997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return *this; 6007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return drop_back(size() - N); 6017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 6027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return a StringRef equal to 'this' but with only the first \p N 6047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// elements remaining. If \p N is greater than the length of the 6057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// string, the entire string is returned. 6062df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef take_back(size_t N = 1) const { 6097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (N >= size()) 6107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return *this; 6117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return drop_front(size() - N); 6127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 6137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6142df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the longest prefix of 'this' such that every character 6152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// in the prefix satisfies the given predicate. 6162df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef take_while(function_ref<bool(char)> F) const { 6192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return substr(0, find_if_not(F)); 6202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 6212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 6222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the longest prefix of 'this' such that no character in 6232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// the prefix satisfies the given predicate. 6242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef take_until(function_ref<bool(char)> F) const { 6272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return substr(0, find_if(F)); 6282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 6292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 6307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return a StringRef equal to 'this' but with the first \p N elements 6317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// dropped. 6322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef drop_front(size_t N = 1) const { 6357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(size() >= N && "Dropping more elements than exist"); 6367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return substr(N); 6377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 6387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return a StringRef equal to 'this' but with the last \p N elements 6407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// dropped. 6412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef drop_back(size_t N = 1) const { 6447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens assert(size() >= N && "Dropping more elements than exist"); 6457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return substr(0, size()-N); 6467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 6477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return a StringRef equal to 'this', but with all characters satisfying 6492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// the given predicate dropped from the beginning of the string. 6502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef drop_while(function_ref<bool(char)> F) const { 6532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return substr(find_if_not(F)); 6542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 6552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 6562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return a StringRef equal to 'this', but with all characters not 6572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// satisfying the given predicate dropped from the beginning of the string. 6582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef drop_until(function_ref<bool(char)> F) const { 6612df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return substr(find_if(F)); 6622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 6632df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 6647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Returns true if this StringRef has the given prefix and removes that 6657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// prefix. 6667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool consume_front(StringRef Prefix) { 6687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (!startswith(Prefix)) 6697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return false; 6707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens *this = drop_front(Prefix.size()); 6727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return true; 6737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 6747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Returns true if this StringRef has the given suffix and removes that 6767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// suffix. 6777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool consume_back(StringRef Suffix) { 6797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (!endswith(Suffix)) 6807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return false; 6817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens *this = drop_back(Suffix.size()); 6837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return true; 6847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 6857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 6867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return a reference to the substring from [Start, End). 6877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 6887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Start The index of the starting character in the substring; if 6897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the index is npos or greater than the length of the string then the 6907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// empty substring will be returned. 6917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 6927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param End The index following the last character to include in the 6937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// substring. If this is npos or exceeds the number of characters 6947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// remaining in the string, the string suffix (starting with \p Start) 6957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// will be returned. If this is less than \p Start, an empty string will 6967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// be returned. 6972df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 6987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 6997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef slice(size_t Start, size_t End) const { 7007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens Start = std::min(Start, Length); 7017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens End = std::min(std::max(Start, End), Length); 7027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return StringRef(Data + Start, End - Start); 7037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 7047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 7057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Split into two substrings around the first occurrence of a separator 7067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// character. 7077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If \p Separator is in the string, then the result is a pair (LHS, RHS) 7097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// such that (*this == LHS + Separator + RHS) is true and RHS is 7107ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// maximal. If \p Separator is not in the string, then the result is a 7117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// pair (LHS, RHS) where (*this == LHS) and (RHS == ""). 7127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Separator The character to split on. 7147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \returns The split substrings. 7152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 7167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::pair<StringRef, StringRef> split(char Separator) const { 7177ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t Idx = find(Separator); 7187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Idx == npos) 7197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::make_pair(*this, StringRef()); 7207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::make_pair(slice(0, Idx), slice(Idx+1, npos)); 7217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 7227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 7237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Split into two substrings around the first occurrence of a separator 7247ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// string. 7257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If \p Separator is in the string, then the result is a pair (LHS, RHS) 7277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// such that (*this == LHS + Separator + RHS) is true and RHS is 7287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// maximal. If \p Separator is not in the string, then the result is a 7297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// pair (LHS, RHS) where (*this == LHS) and (RHS == ""). 7307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7317ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Separator - The string to split on. 7327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \return - The split substrings. 7332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 7347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::pair<StringRef, StringRef> split(StringRef Separator) const { 7357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t Idx = find(Separator); 7367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Idx == npos) 7377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::make_pair(*this, StringRef()); 7387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::make_pair(slice(0, Idx), slice(Idx + Separator.size(), npos)); 7397ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 7407ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 7417ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Split into substrings around the occurrences of a separator string. 7427ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7437ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Each substring is stored in \p A. If \p MaxSplit is >= 0, at most 7447ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \p MaxSplit splits are done and consequently <= \p MaxSplit + 1 7457ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// elements are added to A. 7467ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If \p KeepEmpty is false, empty strings are not added to \p A. They 7477ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// still count when considering \p MaxSplit 7487ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// An useful invariant is that 7497ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Separator.join(A) == *this if MaxSplit == -1 and KeepEmpty == true 7507ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7517ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param A - Where to put the substrings. 7527ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Separator - The string to split on. 7537ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param MaxSplit - The maximum number of times the string is split. 7547ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param KeepEmpty - True if empty substring should be added. 7557ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void split(SmallVectorImpl<StringRef> &A, 7567ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef Separator, int MaxSplit = -1, 7577ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool KeepEmpty = true) const; 7587ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 7597ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Split into substrings around the occurrences of a separator character. 7607ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Each substring is stored in \p A. If \p MaxSplit is >= 0, at most 7627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \p MaxSplit splits are done and consequently <= \p MaxSplit + 1 7637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// elements are added to A. 7647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If \p KeepEmpty is false, empty strings are not added to \p A. They 7657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// still count when considering \p MaxSplit 7667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// An useful invariant is that 7677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Separator.join(A) == *this if MaxSplit == -1 and KeepEmpty == true 7687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param A - Where to put the substrings. 7707ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Separator - The string to split on. 7717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param MaxSplit - The maximum number of times the string is split. 7727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param KeepEmpty - True if empty substring should be added. 7737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens void split(SmallVectorImpl<StringRef> &A, char Separator, int MaxSplit = -1, 7747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens bool KeepEmpty = true) const; 7757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 7767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Split into two substrings around the last occurrence of a separator 7777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// character. 7787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// If \p Separator is in the string, then the result is a pair (LHS, RHS) 7807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// such that (*this == LHS + Separator + RHS) is true and RHS is 7817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// minimal. If \p Separator is not in the string, then the result is a 7827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// pair (LHS, RHS) where (*this == LHS) and (RHS == ""). 7837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// 7847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \param Separator - The character to split on. 7857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \return - The split substrings. 7862df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 7877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens std::pair<StringRef, StringRef> rsplit(char Separator) const { 7887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens size_t Idx = rfind(Separator); 7897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens if (Idx == npos) 7907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::make_pair(*this, StringRef()); 7917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return std::make_pair(slice(0, Idx), slice(Idx+1, npos)); 7927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 7937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 7947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return string with consecutive \p Char characters starting from the 7957ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the left removed. 7962df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 7977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef ltrim(char Char) const { 7987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return drop_front(std::min(Length, find_first_not_of(Char))); 7997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return string with consecutive characters in \p Chars starting from 8027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the left removed. 8032df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 8047ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef ltrim(StringRef Chars = " \t\n\v\f\r") const { 8057ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return drop_front(std::min(Length, find_first_not_of(Chars))); 8067ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8077ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8087ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return string with consecutive \p Char characters starting from the 8097ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// right removed. 8102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 8117ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef rtrim(char Char) const { 8127ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return drop_back(Length - std::min(Length, find_last_not_of(Char) + 1)); 8137ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8147ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8157ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return string with consecutive characters in \p Chars starting from 8167ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the right removed. 8172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 8187ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef rtrim(StringRef Chars = " \t\n\v\f\r") const { 8197ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return drop_back(Length - std::min(Length, find_last_not_of(Chars) + 1)); 8207ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8217ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8227ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return string with consecutive \p Char characters starting from the 8237ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// left and right removed. 8242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 8257ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef trim(char Char) const { 8267ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return ltrim(Char).rtrim(Char); 8277ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8287ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8297ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// Return string with consecutive characters in \p Chars starting from 8307ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// the left and right removed. 8312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 8327ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens StringRef trim(StringRef Chars = " \t\n\v\f\r") const { 8337ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return ltrim(Chars).rtrim(Chars); 8347ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8357ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8367ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 8377ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens }; 8387ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// A wrapper around a string literal that serves as a proxy for constructing 8402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// global tables of StringRefs with the length computed at compile time. 8412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// In order to avoid the invocation of a global constructor, StringLiteral 8422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// should *only* be used in a constexpr context, as such: 8432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 8442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// constexpr StringLiteral S("test"); 8452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 8462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens class StringLiteral : public StringRef { 8472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens public: 8482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens template <size_t N> 8492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens constexpr StringLiteral(const char (&Str)[N]) 8502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#if defined(__clang__) && __has_attribute(enable_if) 8512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#pragma clang diagnostic push 8522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#pragma clang diagnostic ignored "-Wgcc-compat" 8532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens __attribute((enable_if(__builtin_strlen(Str) == N - 1, 8542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens "invalid string literal"))) 8552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#pragma clang diagnostic pop 8562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#endif 8572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens : StringRef(Str, N - 1) { 8582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 8592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens }; 8602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 8617ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @name StringRef Comparison Operators 8627ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @{ 8637ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8647ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 8657ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline bool operator==(StringRef LHS, StringRef RHS) { 8667ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return LHS.equals(RHS); 8677ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8687ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8697ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens LLVM_ATTRIBUTE_ALWAYS_INLINE 8702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens inline bool operator!=(StringRef LHS, StringRef RHS) { return !(LHS == RHS); } 8717ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8727ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline bool operator<(StringRef LHS, StringRef RHS) { 8737ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return LHS.compare(RHS) == -1; 8747ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8757ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8767ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline bool operator<=(StringRef LHS, StringRef RHS) { 8777ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return LHS.compare(RHS) != 1; 8787ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8797ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8807ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline bool operator>(StringRef LHS, StringRef RHS) { 8817ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return LHS.compare(RHS) == 1; 8827ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8837ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8847ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline bool operator>=(StringRef LHS, StringRef RHS) { 8857ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return LHS.compare(RHS) != -1; 8867ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8877ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8887ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens inline std::string &operator+=(std::string &buffer, StringRef string) { 8897ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens return buffer.append(string.data(), string.size()); 8907ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens } 8917ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8927ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// @} 8937ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8947ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens /// \brief Compute a hash_code for a StringRef. 8952df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens LLVM_NODISCARD 8967ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens hash_code hash_value(StringRef S); 8977ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 8987ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens // StringRefs can be treated like a POD type. 8997ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <typename T> struct isPodLike; 9007ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens template <> struct isPodLike<StringRef> { static const bool value = true; }; 9017ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens} 9027ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens 9037ad046f5968d4709c3c68d165387d13f1da7bab6Nicolas Capens#endif 904