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 139130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer#include "llvm/Support/type_traits.h" 149130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer 1578cab947cf8f81fc3cadbedd90c20fbe6e5eb1eeJoerg Sonnenberger#include <algorithm> 1685f49835c288b0107cb4020d4e59e491c146973dDaniel Dunbar#include <cassert> 174cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#include <cstring> 189130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer#include <limits> 194cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#include <string> 209130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer#include <utility> 214cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 224cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbarnamespace llvm { 23c78c0c99a0fe1703ae72fc51e440aaa8e4e19e91Rafael Espindola template<typename T> 24c78c0c99a0fe1703ae72fc51e440aaa8e4e19e91Rafael Espindola class SmallVectorImpl; 251e7ad3993d8700488895fa372ecad55443f53485John McCall class APInt; 26528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth class hash_code; 279130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer class StringRef; 289130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer 299130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer /// Helper functions for StringRef::getAsInteger. 309130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer bool getAsUnsignedInteger(StringRef Str, unsigned Radix, 319130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer unsigned long long &Result); 329130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer 339130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer bool getAsSignedInteger(StringRef Str, unsigned Radix, long long &Result); 34f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar 354cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// StringRef - Represent a constant reference to a string, i.e. a character 364cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// array and a length, which need not be null terminated. 374cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// 384cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// This class does not own the string data, it is expected to be used in 394cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// situations where the character data resides in some other buffer, whose 404cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// lifetime extends past that of the StringRef. For this reason, it is not in 414cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// general safe to store a StringRef. 424cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar class StringRef { 434cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar public: 444cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar typedef const char *iterator; 45af2a8361e4e5b45441b6e73c332fb60c36892468Chris Lattner typedef const char *const_iterator; 46b834a7b73ce0dcf8fbf8d8b0d62f69e4b78059adDaniel Dunbar static const size_t npos = ~size_t(0); 47db513bc0963fbf372f898f8b94fc13994663c0c6Chris Lattner typedef size_t size_type; 48abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 494cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar private: 504cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// The start of the string, in an external buffer. 514cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar const char *Data; 524cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 534cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// The length of the string. 54f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar size_t Length; 554cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 562fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin // Workaround PR5482: nearly all gcc 4.x miscompile StringRef and std::min() 572fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin // Changing the arg of min to be an integer, instead of a reference to an 582fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin // integer works around this bug. 59fd813bc85027b8e4f8dc42b485b254cff210012dDan Gohman static size_t min(size_t a, size_t b) { return a < b ? a : b; } 60fd813bc85027b8e4f8dc42b485b254cff210012dDan Gohman static size_t max(size_t a, size_t b) { return a > b ? a : b; } 616d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis 626d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis // Workaround memcmp issue with null pointers (undefined behavior) 636d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis // by providing a specialized version 646d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis static int compareMemory(const char *Lhs, const char *Rhs, size_t Length) { 656d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis if (Length == 0) { return 0; } 666d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis return ::memcmp(Lhs,Rhs,Length); 676d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis } 686d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis 694cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar public: 704cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @name Constructors 714cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @{ 724cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 734cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// Construct an empty string ref. 744cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /*implicit*/ StringRef() : Data(0), Length(0) {} 754cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 764cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// Construct a string ref from a cstring. 77abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher /*implicit*/ StringRef(const char *Str) 786d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis : Data(Str) { 796d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis assert(Str && "StringRef cannot be built from a NULL argument"); 806d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis Length = ::strlen(Str); // invoking strlen(NULL) is undefined behavior 816d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis } 82abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 834cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// Construct a string ref from a pointer and length. 84abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher /*implicit*/ StringRef(const char *data, size_t length) 856d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis : Data(data), Length(length) { 866d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis assert((data || length == 0) && 876d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis "StringRef cannot be built from a NULL argument with non-null length"); 886d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis } 894cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 904cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// Construct a string ref from an std::string. 91abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher /*implicit*/ StringRef(const std::string &Str) 9224f8e29b4efe70496474c6d43aa6abfa27c21511Dan Gohman : Data(Str.data()), Length(Str.length()) {} 934cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 944cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @} 954cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @name Iterators 964cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @{ 974cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 984cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar iterator begin() const { return Data; } 994cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1004cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar iterator end() const { return Data + Length; } 1014cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1024cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @} 1034cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @name String Operations 1044cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @{ 1054cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1064cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// data - Get a pointer to the start of the string (which may not be null 1074cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// terminated). 1084cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar const char *data() const { return Data; } 1094cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1104cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// empty - Check if the string is empty. 1114cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar bool empty() const { return Length == 0; } 1124cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1134cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// size - Get the string size. 1147cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar size_t size() const { return Length; } 115ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar 116ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar /// front - Get the first character in the string. 117ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar char front() const { 118ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar assert(!empty()); 119ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar return Data[0]; 120ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar } 121abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 122ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar /// back - Get the last character in the string. 123e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner char back() const { 124e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner assert(!empty()); 125e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner return Data[Length-1]; 126e36df3fd31a08a41d9ad04fcba182b616b030c9cChris Lattner } 1277cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 1287cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar /// equals - Check for string equality, this is more efficient than 129ac55b85438da378bab227fd34167bb0c4a9249aaDaniel Dunbar /// compare() when the relative ordering of inequal strings isn't needed. 1302928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar bool equals(StringRef RHS) const { 131abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher return (Length == RHS.Length && 1326d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis compareMemory(Data, RHS.Data, RHS.Length) == 0); 1337cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 1344cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 13505872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer /// equals_lower - Check for string equality, ignoring case. 13605872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer bool equals_lower(StringRef RHS) const { 13705872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer return Length == RHS.Length && compare_lower(RHS) == 0; 13805872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer } 13905872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer 1404cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// compare - Compare two strings; the result is -1, 0, or 1 if this string 1414cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// is lexicographically less than, equal to, or greater than the \arg RHS. 1422928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar int compare(StringRef RHS) const { 1434cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar // Check the prefix for a mismatch. 1446d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis if (int Res = compareMemory(Data, RHS.Data, min(Length, RHS.Length))) 1454cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar return Res < 0 ? -1 : 1; 1464cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1474cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar // Otherwise the prefixes match, so we only need to check the lengths. 1484cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar if (Length == RHS.Length) 1494cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar return 0; 1504cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar return Length < RHS.Length ? -1 : 1; 1514cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar } 1524cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 15305872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer /// compare_lower - Compare two strings, ignoring case. 15405872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer int compare_lower(StringRef RHS) const; 15505872ea804cdc9534960b30d28a391928c61481aBenjamin Kramer 156160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen /// compare_numeric - Compare two strings, treating sequences of digits as 157160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen /// numbers. 158160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen int compare_numeric(StringRef RHS) const; 159160a3bf74d1a2b048f65e2162d038ed96eddde01Jakob Stoklund Olesen 160326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer /// \brief Determine the edit distance between this string and another 161441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// string. 162441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// 163441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// \param Other the string to compare this string against. 164441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// 165441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// \param AllowReplacements whether to allow character 166441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// replacements (change one character into another) as a single 167441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// operation, rather than as two operations (an insertion and a 168441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// removal). 169441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// 1705ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor /// \param MaxEditDistance If non-zero, the maximum edit distance that 1715ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor /// this routine is allowed to compute. If the edit distance will exceed 1725ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor /// that maximum, returns \c MaxEditDistance+1. 1735ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor /// 174441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// \returns the minimum number of character insertions, removals, 175441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// or (if \p AllowReplacements is \c true) replacements needed to 176441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// transform one of the given strings into the other. If zero, 177441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor /// the strings are identical. 1785ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor unsigned edit_distance(StringRef Other, bool AllowReplacements = true, 1795ee568ac2704d7302017d42ad162d4b53d076cbcDouglas Gregor unsigned MaxEditDistance = 0); 180441c8b4ad17c0d029b2247c367111395e7ad068cDouglas Gregor 1814cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// str - Get the contents as an std::string. 1827f7274ce7f3243bd71588c7a75a142c39e5c7e34Chris Lattner std::string str() const { 18379ed2c597a134cb4dd5da90199053f322b7d8a2dBenjamin Kramer if (Data == 0) return std::string(); 1847f7274ce7f3243bd71588c7a75a142c39e5c7e34Chris Lattner return std::string(Data, Length); 1857f7274ce7f3243bd71588c7a75a142c39e5c7e34Chris Lattner } 1864cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1874cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @} 1884cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @name Operator Overloads 1894cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @{ 1904cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 191abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher char operator[](size_t Index) const { 1924cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar assert(Index < Length && "Invalid index!"); 193abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher return Data[Index]; 1944cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar } 1954cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 1964cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @} 1974cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @name Type Conversions 1984cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @{ 1994cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 2004cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar operator std::string() const { 2014cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar return str(); 2024cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar } 2034cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 2044cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar /// @} 2050ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// @name String Predicates 2060ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// @{ 2070ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar 2080ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// startswith - Check if this string starts with the given \arg Prefix. 2092928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar bool startswith(StringRef Prefix) const { 210d5b1f8a8426e82990dafc6e3336fefc6635c8fa4Eli Friedman return Length >= Prefix.Length && 2116d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis compareMemory(Data, Prefix.Data, Prefix.Length) == 0; 2120ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar } 2130ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar 2140ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// endswith - Check if this string ends with the given \arg Suffix. 2152928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar bool endswith(StringRef Suffix) const { 216d5b1f8a8426e82990dafc6e3336fefc6635c8fa4Eli Friedman return Length >= Suffix.Length && 2176d5502eb4966fb2f81fe951d0acf11cfa5cd4acfArgyrios Kyrtzidis compareMemory(end() - Suffix.Length, Suffix.Data, Suffix.Length) == 0; 2180ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar } 2190ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar 2200ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// @} 2210ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// @name String Searching 2220ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// @{ 2230ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar 224e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// find - Search for the first character \arg C in the string. 2250ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// 2263c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// \return - The index of the first occurrence of \arg C, or npos if not 2270ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// found. 22864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar size_t find(char C, size_t From = 0) const { 2292fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin for (size_t i = min(From, Length), e = Length; i != e; ++i) 2300ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar if (Data[i] == C) 2310ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar return i; 2320ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar return npos; 2330ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar } 2340ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar 235e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// find - Search for the first string \arg Str in the string. 2360ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// 2373c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// \return - The index of the first occurrence of \arg Str, or npos if not 2380ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// found. 23964066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar size_t find(StringRef Str, size_t From = 0) const; 240abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 241e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// rfind - Search for the last character \arg C in the string. 242e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// 2433c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// \return - The index of the last occurrence of \arg C, or npos if not 244e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// found. 245c936fe8cb356931f23e6f17ce1bd5789eeae1ecbChris Lattner size_t rfind(char C, size_t From = npos) const { 2462fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin From = min(From, Length); 247c936fe8cb356931f23e6f17ce1bd5789eeae1ecbChris Lattner size_t i = From; 248c936fe8cb356931f23e6f17ce1bd5789eeae1ecbChris Lattner while (i != 0) { 249e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar --i; 250e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar if (Data[i] == C) 251e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar return i; 252e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar } 253e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar return npos; 254e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar } 255abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 256e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// rfind - Search for the last string \arg Str in the string. 257e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// 2583c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// \return - The index of the last occurrence of \arg Str, or npos if not 259e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// found. 2602928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar size_t rfind(StringRef Str) const; 261abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 26264066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// find_first_of - Find the first character in the string that is \arg C, 26364066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// or npos if not found. Same as find. 26479ed2c597a134cb4dd5da90199053f322b7d8a2dBenjamin Kramer size_type find_first_of(char C, size_t From = 0) const { 26579ed2c597a134cb4dd5da90199053f322b7d8a2dBenjamin Kramer return find(C, From); 26679ed2c597a134cb4dd5da90199053f322b7d8a2dBenjamin Kramer } 267abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 26864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// find_first_of - Find the first character in the string that is in \arg 26964066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// Chars, or npos if not found. 27064066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// 271250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer /// Note: O(size() + Chars.size()) 27264066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar size_type find_first_of(StringRef Chars, size_t From = 0) const; 273abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 27405a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner /// find_first_not_of - Find the first character in the string that is not 27564066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// \arg C or npos if not found. 27664066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar size_type find_first_not_of(char C, size_t From = 0) const; 27764066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar 27864066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// find_first_not_of - Find the first character in the string that is not 27964066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// in the string \arg Chars, or npos if not found. 28064066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar /// 281250eb005d91e80b05a61345394bae9e9528151acBenjamin Kramer /// Note: O(size() + Chars.size()) 28264066bd8b593082f622bbc25716938a453363d2fDaniel Dunbar size_type find_first_not_of(StringRef Chars, size_t From = 0) const; 283abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 28463c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer /// find_last_of - Find the last character in the string that is \arg C, or 28563c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer /// npos if not found. 28663c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer size_type find_last_of(char C, size_t From = npos) const { 28763c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer return rfind(C, From); 28863c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer } 28963c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer 29063c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer /// find_last_of - Find the last character in the string that is in \arg C, 29163c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer /// or npos if not found. 29263c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer /// 29363c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer /// Note: O(size() + Chars.size()) 29463c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer size_type find_last_of(StringRef Chars, size_t From = npos) const; 29563c133b67d61b0c457ff46c957aed2b8d90b599cMichael J. Spencer 296b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer /// find_last_not_of - Find the last character in the string that is not 297b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer /// \arg C, or npos if not found. 298b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer size_type find_last_not_of(char C, size_t From = npos) const; 299b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer 300b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer /// find_last_not_of - Find the last character in the string that is not in 301b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer /// \arg Chars, or npos if not found. 302b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer /// 303b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer /// Note: O(size() + Chars.size()) 304b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer size_type find_last_not_of(StringRef Chars, size_t From = npos) const; 305b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer 30605a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner /// @} 30705a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner /// @name Helpful Algorithms 30805a32c8ab118d9c92dc9b4ecaa7a6fed67241215Chris Lattner /// @{ 309abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 3105caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar /// count - Return the number of occurrences of \arg C in the string. 3115caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar size_t count(char C) const { 3125caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar size_t Count = 0; 3135caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar for (size_t i = 0, e = Length; i != e; ++i) 3145caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar if (Data[i] == C) 315323a3e653340781bad4c4c3245d9b25d5ab02685Daniel Dunbar ++Count; 3165caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar return Count; 3175caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar } 318abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 3195caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar /// count - Return the number of non-overlapped occurrences of \arg Str in 3205caba3bcb14fae4b36924463ed2bcf3846f029a9Daniel Dunbar /// the string. 3212928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar size_t count(StringRef Str) const; 322abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 323cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// getAsInteger - Parse the current string as an integer of the specified 324cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// radix. If Radix is specified as zero, this does radix autosensing using 325cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// extended C rules: 0 is octal, 0x is hex, 0b is binary. 326cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// 327cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// If the string is invalid or if only a subset of the string is valid, 328cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// this returns true to signify the error. The string is considered 3299130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer /// erroneous if empty or if it overflows T. 330cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// 3319130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer template <typename T> 3329130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer typename enable_if_c<std::numeric_limits<T>::is_signed, bool>::type 3339130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer getAsInteger(unsigned Radix, T &Result) const { 3349130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer long long LLVal; 3359130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer if (getAsSignedInteger(*this, Radix, LLVal) || 3369130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer static_cast<T>(LLVal) != LLVal) 3379130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer return true; 3389130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer Result = LLVal; 3399130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer return false; 3409130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer } 341cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner 3429130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer template <typename T> 3439130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer typename enable_if_c<!std::numeric_limits<T>::is_signed, bool>::type 3449130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer getAsInteger(unsigned Radix, T &Result) const { 3459130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer unsigned long long ULLVal; 3469130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer if (getAsUnsignedInteger(*this, Radix, ULLVal) || 3479130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer static_cast<T>(ULLVal) != ULLVal) 3489130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer return true; 3499130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer Result = ULLVal; 3509130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer return false; 3519130b42a85998238b7bbe25ed2989e0605f636f0Michael J. Spencer } 352abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 3531e7ad3993d8700488895fa372ecad55443f53485John McCall /// getAsInteger - Parse the current string as an integer of the 3541e7ad3993d8700488895fa372ecad55443f53485John McCall /// specified radix, or of an autosensed radix if the radix given 3551e7ad3993d8700488895fa372ecad55443f53485John McCall /// is 0. The current value in Result is discarded, and the 3561e7ad3993d8700488895fa372ecad55443f53485John McCall /// storage is changed to be wide enough to store the parsed 3571e7ad3993d8700488895fa372ecad55443f53485John McCall /// integer. 3581e7ad3993d8700488895fa372ecad55443f53485John McCall /// 3591e7ad3993d8700488895fa372ecad55443f53485John McCall /// Returns true if the string does not solely consist of a valid 3601e7ad3993d8700488895fa372ecad55443f53485John McCall /// non-empty number in the appropriate base. 3611e7ad3993d8700488895fa372ecad55443f53485John McCall /// 3621e7ad3993d8700488895fa372ecad55443f53485John McCall /// APInt::fromString is superficially similar but assumes the 3631e7ad3993d8700488895fa372ecad55443f53485John McCall /// string is well-formed in the given radix. 3641e7ad3993d8700488895fa372ecad55443f53485John McCall bool getAsInteger(unsigned Radix, APInt &Result) const; 3651e7ad3993d8700488895fa372ecad55443f53485John McCall 366cea1438cf59c7cd3a632d61d78e68589315510d3Chris Lattner /// @} 367589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar /// @name String Operations 368589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar /// @{ 369589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar 370589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar // lower - Convert the given ASCII string to lowercase. 371589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar std::string lower() const; 372589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar 373589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar /// upper - Convert the given ASCII string to uppercase. 374589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar std::string upper() const; 375589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar 376589fbb1770df5f7bee1c5e24e9e8f4ca5091d528Daniel Dunbar /// @} 3770ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar /// @name Substring Operations 378f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// @{ 379f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar 380d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// substr - Return a reference to the substring from [Start, Start + N). 381f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// 382f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// \param Start - The index of the starting character in the substring; if 383d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// the index is npos or greater than the length of the string then the 384d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// empty substring will be returned. 385f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// 386f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// \param N - The number of characters to included in the substring. If N 387f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// exceeds the number of characters remaining in the string, the string 388f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// suffix (starting with \arg Start) will be returned. 389f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar StringRef substr(size_t Start, size_t N = npos) const { 3902fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin Start = min(Start, Length); 3912fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin return StringRef(Data + Start, min(N, Length - Start)); 392f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar } 393a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner 394a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner /// drop_front - Return a StringRef equal to 'this' but with the first 395a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner /// elements dropped. 396a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner StringRef drop_front(unsigned N = 1) const { 397a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner assert(size() >= N && "Dropping more elements than exist"); 398a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner return substr(N); 399a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner } 400a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner 401a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner /// drop_back - Return a StringRef equal to 'this' but with the last 402a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner /// elements dropped. 403a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner StringRef drop_back(unsigned N = 1) const { 404a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner assert(size() >= N && "Dropping more elements than exist"); 405a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner return substr(0, size()-N); 406a97a5eabe2a412d7cc078f94b7df7ee8ac840853Chris Lattner } 407f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar 408d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// slice - Return a reference to the substring from [Start, End). 409d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// 410d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// \param Start - The index of the starting character in the substring; if 411d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// the index is npos or greater than the length of the string then the 412d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// empty substring will be returned. 413d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// 414d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// \param End - The index following the last character to include in the 415d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// substring. If this is npos, or less than \arg Start, or exceeds the 416d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// number of characters remaining in the string, the string suffix 417d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// (starting with \arg Start) will be returned. 418d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar StringRef slice(size_t Start, size_t End) const { 4192fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin Start = min(Start, Length); 4202fe05d80d396b6ca0bdc66ec17732b8c514d575eTorok Edwin End = min(max(Start, End), Length); 421d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar return StringRef(Data + Start, End - Start); 422d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar } 423d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar 4243c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// split - Split into two substrings around the first occurrence of a 425d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// separator character. 426d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// 427d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// If \arg Separator is in the string, then the result is a pair (LHS, RHS) 428d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// such that (*this == LHS + Separator + RHS) is true and RHS is 429d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// maximal. If \arg Separator is not in the string, then the result is a 430d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// pair (LHS, RHS) where (*this == LHS) and (RHS == ""). 431d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// 432d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// \param Separator - The character to split on. 433d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar /// \return - The split substrings. 434d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar std::pair<StringRef, StringRef> split(char Separator) const { 4350ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar size_t Idx = find(Separator); 4360ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar if (Idx == npos) 437d61918fc6898a89df8b0a03e068f234ded010cdfDaniel Dunbar return std::make_pair(*this, StringRef()); 4380ad7f9bb2f806387e53ffeaf6a564b9a80b962afDaniel Dunbar return std::make_pair(slice(0, Idx), slice(Idx+1, npos)); 439c9af366fc39d657b7d416d16988265d86a641184Daniel Dunbar } 440c9af366fc39d657b7d416d16988265d86a641184Daniel Dunbar 4413c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// split - Split into two substrings around the first occurrence of a 442a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// separator string. 443a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// 444a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// If \arg Separator is in the string, then the result is a pair (LHS, RHS) 445a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// such that (*this == LHS + Separator + RHS) is true and RHS is 446a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// maximal. If \arg Separator is not in the string, then the result is a 447a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// pair (LHS, RHS) where (*this == LHS) and (RHS == ""). 448a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// 449a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// \param Separator - The string to split on. 450a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar /// \return - The split substrings. 451a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar std::pair<StringRef, StringRef> split(StringRef Separator) const { 452a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar size_t Idx = find(Separator); 453a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar if (Idx == npos) 454a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar return std::make_pair(*this, StringRef()); 455a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar return std::make_pair(slice(0, Idx), slice(Idx + Separator.size(), npos)); 456a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar } 457a8333d3d107df1e0b6bde986ed0532915e154b65Daniel Dunbar 4583c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// split - Split into substrings around the occurrences of a separator 4595ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// string. 4605ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// 4615ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// Each substring is stored in \arg A. If \arg MaxSplit is >= 0, at most 4625ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// \arg MaxSplit splits are done and consequently <= \arg MaxSplit 4635ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// elements are added to A. 4645ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// If \arg KeepEmpty is false, empty strings are not added to \arg A. They 4655ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// still count when considering \arg MaxSplit 4665ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// An useful invariant is that 4675ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// Separator.join(A) == *this if MaxSplit == -1 and KeepEmpty == true 4685ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// 4695ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// \param A - Where to put the substrings. 4705ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// \param Separator - The string to split on. 4715ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola /// \param MaxSplit - The maximum number of times the string is split. 472fb76fe09297ee292129e44d723127f2408602a3dDan Gohman /// \param KeepEmpty - True if empty substring should be added. 473c78c0c99a0fe1703ae72fc51e440aaa8e4e19e91Rafael Espindola void split(SmallVectorImpl<StringRef> &A, 474c78c0c99a0fe1703ae72fc51e440aaa8e4e19e91Rafael Espindola StringRef Separator, int MaxSplit = -1, 4755ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola bool KeepEmpty = true) const; 4765ccac247263ab62975f3b72421fc783f10ccf5f6Rafael Espindola 4773c37bb8dbe886993dcd8f37dec0d94762393f3d4Kovarththanan Rajaratnam /// rsplit - Split into two substrings around the last occurrence of a 478e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// separator character. 479e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// 480e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// If \arg Separator is in the string, then the result is a pair (LHS, RHS) 481e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// such that (*this == LHS + Separator + RHS) is true and RHS is 482e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// minimal. If \arg Separator is not in the string, then the result is a 483e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// pair (LHS, RHS) where (*this == LHS) and (RHS == ""). 484e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// 485e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// \param Separator - The character to split on. 486e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar /// \return - The split substrings. 487e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar std::pair<StringRef, StringRef> rsplit(char Separator) const { 488e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar size_t Idx = rfind(Separator); 489e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar if (Idx == npos) 490e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar return std::make_pair(*this, StringRef()); 491e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar return std::make_pair(slice(0, Idx), slice(Idx+1, npos)); 492e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar } 493e65512809a4144c17538aac4cc59fac6d325a7e4Daniel Dunbar 494b08174c0b1ed7a8c3cacc5df506eb98c79305a4eMichael J. Spencer /// ltrim - Return string with consecutive characters in \arg Chars starting 495b08174c0b1ed7a8c3cacc5df506eb98c79305a4eMichael J. Spencer /// from the left removed. 496b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer StringRef ltrim(StringRef Chars = " \t\n\v\f\r") const { 497b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer return drop_front(std::min(Length, find_first_not_of(Chars))); 498b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer } 499b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer 500b08174c0b1ed7a8c3cacc5df506eb98c79305a4eMichael J. Spencer /// rtrim - Return string with consecutive characters in \arg Chars starting 501b08174c0b1ed7a8c3cacc5df506eb98c79305a4eMichael J. Spencer /// from the right removed. 502b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer StringRef rtrim(StringRef Chars = " \t\n\v\f\r") const { 503b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer return drop_back(Length - std::min(Length, find_last_not_of(Chars) + 1)); 504b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer } 505b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer 506b08174c0b1ed7a8c3cacc5df506eb98c79305a4eMichael J. Spencer /// trim - Return string with consecutive characters in \arg Chars starting 507b08174c0b1ed7a8c3cacc5df506eb98c79305a4eMichael J. Spencer /// from the left and right removed. 508b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer StringRef trim(StringRef Chars = " \t\n\v\f\r") const { 509b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer return ltrim(Chars).rtrim(Chars); 510b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer } 511b0940b46edbbe9d3f62d7f6f70330fd87f3507e1Michael J. Spencer 512f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar /// @} 5134cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar }; 514f5fdf73238dfd923f33bcbbd397cff6752d9c41eDaniel Dunbar 5157cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar /// @name StringRef Comparison Operators 5167cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar /// @{ 5177cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 5182928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar inline bool operator==(StringRef LHS, StringRef RHS) { 5197cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar return LHS.equals(RHS); 5207cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 5217cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 5222928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar inline bool operator!=(StringRef LHS, StringRef RHS) { 5237cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar return !(LHS == RHS); 5247cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 525abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher 5262928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar inline bool operator<(StringRef LHS, StringRef RHS) { 527abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher return LHS.compare(RHS) == -1; 5287cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 5297cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 5302928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar inline bool operator<=(StringRef LHS, StringRef RHS) { 531abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher return LHS.compare(RHS) != 1; 5327cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 5337cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 5342928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar inline bool operator>(StringRef LHS, StringRef RHS) { 535abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher return LHS.compare(RHS) == 1; 5367cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 5377cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 5382928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar inline bool operator>=(StringRef LHS, StringRef RHS) { 539abc5ac728961cb23b1041a3466fe2eb4521603c3Eric Christopher return LHS.compare(RHS) != -1; 5407cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar } 5417cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 5426765f78efbd9d43f429344af7d997ec2df495b02John McCall inline std::string &operator+=(std::string &buffer, llvm::StringRef string) { 5436765f78efbd9d43f429344af7d997ec2df495b02John McCall return buffer.append(string.data(), string.size()); 5446765f78efbd9d43f429344af7d997ec2df495b02John McCall } 5456765f78efbd9d43f429344af7d997ec2df495b02John McCall 5467cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar /// @} 5477cb6860185187c74a1205deebff9e0f09a0ddae4Daniel Dunbar 548528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth /// \brief Compute a hash_code for a StringRef. 549528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth hash_code hash_value(StringRef S); 550528f0bbe19553dfadedca040df13a389daa7593dChandler Carruth 551847d2f93ca692fa627a97ba9743bc1e9b8c5cbaeBenjamin Kramer // StringRefs can be treated like a POD type. 552847d2f93ca692fa627a97ba9743bc1e9b8c5cbaeBenjamin Kramer template <typename T> struct isPodLike; 553847d2f93ca692fa627a97ba9743bc1e9b8c5cbaeBenjamin Kramer template <> struct isPodLike<StringRef> { static const bool value = true; }; 554847d2f93ca692fa627a97ba9743bc1e9b8c5cbaeBenjamin Kramer 5554cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar} 5564cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar 5574cf95d75c65f37677d306952b0d2306bc6d20b1fDaniel Dunbar#endif 558