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