StringRef.h revision 323a3e653340781bad4c4c3245d9b25d5ab02685
14cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar//===--- StringRef.h - Constant String Reference Wrapper --------*- C++ -*-===//
24cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar//
34cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar//                     The LLVM Compiler Infrastructure
44cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar//
54cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar// This file is distributed under the University of Illinois Open Source
64cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar// License. See LICENSE.TXT for details.
74cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar//
84cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar//===----------------------------------------------------------------------===//
94cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
104cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#ifndef LLVM_ADT_STRINGREF_H
114cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#define LLVM_ADT_STRINGREF_H
124cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
13d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar#include <algorithm>
1485f49835c288b0107cb4020d4e59e491c146973dDaniel Dunbar#include <cassert>
154cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#include <cstring>
164cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#include <string>
174cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
184cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbarnamespace llvm {
19f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar
204cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  /// StringRef - Represent a constant reference to a string, i.e. a character
214cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  /// array and a length, which need not be null terminated.
224cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  ///
234cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  /// This class does not own the string data, it is expected to be used in
244cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  /// situations where the character data resides in some other buffer, whose
254cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  /// lifetime extends past that of the StringRef. For this reason, it is not in
264cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  /// general safe to store a StringRef.
274cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  class StringRef {
284cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  public:
294cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    typedef const char *iterator;
30b834a7b73ce0dcf8fbf8d8b0d62f69e4b78059adDaniel Dunbar    static const size_t npos = ~size_t(0);
314cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
324cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  private:
334cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// The start of the string, in an external buffer.
344cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    const char *Data;
354cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
364cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// The length of the string.
37f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    size_t Length;
384cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
394cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  public:
404cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @name Constructors
414cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @{
424cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
434cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// Construct an empty string ref.
444cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /*implicit*/ StringRef() : Data(0), Length(0) {}
454cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
464cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// Construct a string ref from a cstring.
474cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /*implicit*/ StringRef(const char *Str)
484cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      : Data(Str), Length(::strlen(Str)) {}
494cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
504cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// Construct a string ref from a pointer and length.
514cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /*implicit*/ StringRef(const char *_Data, unsigned _Length)
524cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      : Data(_Data), Length(_Length) {}
534cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
544cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// Construct a string ref from an std::string.
554cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /*implicit*/ StringRef(const std::string &Str)
564cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      : Data(Str.c_str()), Length(Str.length()) {}
574cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
584cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @}
594cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @name Iterators
604cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @{
614cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
624cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    iterator begin() const { return Data; }
634cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
644cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    iterator end() const { return Data + Length; }
654cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
664cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @}
674cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @name String Operations
684cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @{
694cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
704cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// data - Get a pointer to the start of the string (which may not be null
714cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// terminated).
724cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    const char *data() const { return Data; }
734cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
744cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// empty - Check if the string is empty.
754cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    bool empty() const { return Length == 0; }
764cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
774cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// size - Get the string size.
787cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    size_t size() const { return Length; }
79ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar
80ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar    /// front - Get the first character in the string.
81ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar    char front() const {
82ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar      assert(!empty());
83ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar      return Data[0];
84ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar    }
85e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner
86ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar    /// back - Get the last character in the string.
87e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner    char back() const {
88e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner      assert(!empty());
89e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner      return Data[Length-1];
90e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner    }
917cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
927cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    /// equals - Check for string equality, this is more efficient than
93ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar    /// compare() when the relative ordering of inequal strings isn't needed.
947cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    bool equals(const StringRef &RHS) const {
957cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar      return (Length == RHS.Length &&
967e763ebd982e199224a2d2e0cc802d09d2822b34Chris Lattner              memcmp(Data, RHS.Data, RHS.Length) == 0);
977cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    }
984cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
994cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// compare - Compare two strings; the result is -1, 0, or 1 if this string
1004cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// is lexicographically less than, equal to, or greater than the \arg RHS.
1014cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    int compare(const StringRef &RHS) const {
1024cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      // Check the prefix for a mismatch.
1034cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      if (int Res = memcmp(Data, RHS.Data, std::min(Length, RHS.Length)))
1044cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar        return Res < 0 ? -1 : 1;
1054cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1064cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      // Otherwise the prefixes match, so we only need to check the lengths.
1074cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      if (Length == RHS.Length)
1084cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar        return 0;
1094cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      return Length < RHS.Length ? -1 : 1;
1104cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    }
1114cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1124cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// str - Get the contents as an std::string.
1134cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    std::string str() const { return std::string(Data, Length); }
1144cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1154cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @}
1164cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @name Operator Overloads
1174cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @{
1184cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1194cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    char operator[](size_t Index) const {
1204cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      assert(Index < Length && "Invalid index!");
1214cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      return Data[Index];
1224cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    }
1234cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1244cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @}
1254cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @name Type Conversions
1264cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @{
1274cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1284cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    operator std::string() const {
1294cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar      return str();
1304cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    }
1314cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
1324cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar    /// @}
1330ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @name String Predicates
1340ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @{
1350ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar
1360ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// startswith - Check if this string starts with the given \arg Prefix.
1370ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    bool startswith(const StringRef &Prefix) const {
1380ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      return substr(0, Prefix.Length).equals(Prefix);
1390ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    }
1400ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar
1410ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// endswith - Check if this string ends with the given \arg Suffix.
1420ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    bool endswith(const StringRef &Suffix) const {
1430ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      return slice(size() - Suffix.Length, size()).equals(Suffix);
1440ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    }
1450ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar
1460ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @}
1470ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @name String Searching
1480ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @{
1490ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar
1500ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// find - Search for the character \arg C in the string.
1510ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    ///
1520ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// \return - The index of the first occurence of \arg C, or npos if not
1530ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// found.
1540ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    size_t find(char C) const {
1550ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      for (size_t i = 0, e = Length; i != e; ++i)
1560ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar        if (Data[i] == C)
1570ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar          return i;
1580ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      return npos;
1590ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    }
1600ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar
1610ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// find - Search for the string \arg Str in the string.
1620ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    ///
1630ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// \return - The index of the first occurence of \arg Str, or npos if not
1640ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// found.
1650ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    size_t find(const StringRef &Str) const {
1660ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      size_t N = Str.size();
1670ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      if (N > Length)
1680ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar        return npos;
1690ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      for (size_t i = 0, e = Length - N + 1; i != e; ++i)
1700ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar        if (substr(i, N).equals(Str))
1710ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar          return i;
1720ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      return npos;
1730ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    }
1740ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar
1755caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    /// count - Return the number of occurrences of \arg C in the string.
1765caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    size_t count(char C) const {
1775caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      size_t Count = 0;
1785caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      for (size_t i = 0, e = Length; i != e; ++i)
1795caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar        if (Data[i] == C)
180323a3e653340781bad4c4c3245d9b25d5ab02685Daniel Dunbar          ++Count;
1815caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      return Count;
1825caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    }
1835caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar
1845caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    /// count - Return the number of non-overlapped occurrences of \arg Str in
1855caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    /// the string.
1865caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    size_t count(const StringRef &Str) const {
1875caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      size_t Count = 0;
1885caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      size_t N = Str.size();
1895caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      if (N > Length)
1905caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar        return 0;
1915caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      for (size_t i = 0, e = Length - N + 1; i != e; ++i)
1925caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar        if (substr(i, N).equals(Str))
1935caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar          ++Count;
1945caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar      return Count;
1955caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar    }
1965caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar
1970ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @}
1980ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar    /// @name Substring Operations
199f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    /// @{
200f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar
201d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// substr - Return a reference to the substring from [Start, Start + N).
202f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    ///
203f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    /// \param Start - The index of the starting character in the substring; if
204d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// the index is npos or greater than the length of the string then the
205d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// empty substring will be returned.
206f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    ///
207f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    /// \param N - The number of characters to included in the substring. If N
208f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    /// exceeds the number of characters remaining in the string, the string
209f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    /// suffix (starting with \arg Start) will be returned.
210f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    StringRef substr(size_t Start, size_t N = npos) const {
211f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar      Start = std::min(Start, Length);
212f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar      return StringRef(Data + Start, std::min(N, Length - Start));
213f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    }
214f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar
215d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// slice - Return a reference to the substring from [Start, End).
216d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    ///
217d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// \param Start - The index of the starting character in the substring; if
218d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// the index is npos or greater than the length of the string then the
219d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// empty substring will be returned.
220d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    ///
221d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// \param End - The index following the last character to include in the
222d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// substring. If this is npos, or less than \arg Start, or exceeds the
223d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// number of characters remaining in the string, the string suffix
224d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// (starting with \arg Start) will be returned.
225d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    StringRef slice(size_t Start, size_t End) const {
226d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar      Start = std::min(Start, Length);
227d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar      End = std::min(std::max(Start, End), Length);
228d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar      return StringRef(Data + Start, End - Start);
229d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    }
230d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar
231d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// split - Split into two substrings around the first occurence of a
232d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// separator character.
233d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    ///
234d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// If \arg Separator is in the string, then the result is a pair (LHS, RHS)
235d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// such that (*this == LHS + Separator + RHS) is true and RHS is
236d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// maximal. If \arg Separator is not in the string, then the result is a
237d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// pair (LHS, RHS) where (*this == LHS) and (RHS == "").
238d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    ///
239d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// \param Separator - The character to split on.
240d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    /// \return - The split substrings.
241d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar    std::pair<StringRef, StringRef> split(char Separator) const {
2420ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      size_t Idx = find(Separator);
2430ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      if (Idx == npos)
244d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar        return std::make_pair(*this, StringRef());
2450ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar      return std::make_pair(slice(0, Idx), slice(Idx+1, npos));
246c9af366fc39d657b7d416d16988265d86a641184Daniel Dunbar    }
247c9af366fc39d657b7d416d16988265d86a641184Daniel Dunbar
248f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar    /// @}
2494cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar  };
250f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar
2517cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  /// @name StringRef Comparison Operators
2527cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  /// @{
2537cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2547cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  inline bool operator==(const StringRef &LHS, const StringRef &RHS) {
2557cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    return LHS.equals(RHS);
2567cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  }
2577cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2587cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  inline bool operator!=(const StringRef &LHS, const StringRef &RHS) {
2597cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    return !(LHS == RHS);
2607cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  }
2617cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2627cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  inline bool operator<(const StringRef &LHS, const StringRef &RHS) {
2637cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    return LHS.compare(RHS) == -1;
2647cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  }
2657cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2667cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  inline bool operator<=(const StringRef &LHS, const StringRef &RHS) {
2677cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    return LHS.compare(RHS) != 1;
2687cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  }
2697cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2707cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  inline bool operator>(const StringRef &LHS, const StringRef &RHS) {
2717cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    return LHS.compare(RHS) == 1;
2727cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  }
2737cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2747cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  inline bool operator>=(const StringRef &LHS, const StringRef &RHS) {
2757cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar    return LHS.compare(RHS) != -1;
2767cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  }
2777cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2787cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar  /// @}
2797cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar
2804cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar}
2814cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar
2824cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#endif
283