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