Implement TLSLDM.
[oota-llvm.git] / include / llvm / ADT / StringRef.h
index 3b3f3cd94abe9a0cab8d69067d86b1bba10a693c..ccf8ca9a6647ee95475d90bbd98f53892bc94ae8 100644 (file)
 #ifndef LLVM_ADT_STRINGREF_H
 #define LLVM_ADT_STRINGREF_H
 
-#include <algorithm>
 #include <cassert>
 #include <cstring>
+#include <utility>
 #include <string>
 
 namespace llvm {
   template<typename T>
   class SmallVectorImpl;
+  class APInt;
 
   /// StringRef - Represent a constant reference to a string, i.e. a character
   /// array and a length, which need not be null terminated.
@@ -29,6 +30,7 @@ namespace llvm {
   class StringRef {
   public:
     typedef const char *iterator;
+    typedef const char *const_iterator;
     static const size_t npos = ~size_t(0);
     typedef size_t size_type;
 
@@ -42,15 +44,8 @@ namespace llvm {
     // Workaround PR5482: nearly all gcc 4.x miscompile StringRef and std::min()
     // Changing the arg of min to be an integer, instead of a reference to an
     // integer works around this bug.
-    size_t min(size_t a, size_t b) const
-    {
-      return a < b ? a : b;
-    }
-
-    size_t max(size_t a, size_t b) const
-    {
-      return a > b ? a : b;
-    }
+    static size_t min(size_t a, size_t b) { return a < b ? a : b; }
+    static size_t max(size_t a, size_t b) { return a > b ? a : b; }
 
   public:
     /// @name Constructors
@@ -133,8 +128,36 @@ namespace llvm {
     /// compare_lower - Compare two strings, ignoring case.
     int compare_lower(StringRef RHS) const;
 
+    /// compare_numeric - Compare two strings, treating sequences of digits as
+    /// numbers.
+    int compare_numeric(StringRef RHS) const;
+
+    /// \brief Determine the edit distance between this string and another 
+    /// string.
+    ///
+    /// \param Other the string to compare this string against.
+    ///
+    /// \param AllowReplacements whether to allow character
+    /// replacements (change one character into another) as a single
+    /// operation, rather than as two operations (an insertion and a
+    /// removal).
+    ///
+    /// \param MaxEditDistance If non-zero, the maximum edit distance that
+    /// this routine is allowed to compute. If the edit distance will exceed
+    /// that maximum, returns \c MaxEditDistance+1.
+    ///
+    /// \returns the minimum number of character insertions, removals,
+    /// or (if \p AllowReplacements is \c true) replacements needed to
+    /// transform one of the given strings into the other. If zero,
+    /// the strings are identical.
+    unsigned edit_distance(StringRef Other, bool AllowReplacements = true,
+                           unsigned MaxEditDistance = 0);
+
     /// str - Get the contents as an std::string.
-    std::string str() const { return std::string(Data, Length); }
+    std::string str() const {
+      if (Data == 0) return std::string();
+      return std::string(Data, Length);
+    }
 
     /// @}
     /// @name Operator Overloads
@@ -159,12 +182,14 @@ namespace llvm {
 
     /// startswith - Check if this string starts with the given \arg Prefix.
     bool startswith(StringRef Prefix) const {
-      return substr(0, Prefix.Length).equals(Prefix);
+      return Length >= Prefix.Length &&
+             memcmp(Data, Prefix.Data, Prefix.Length) == 0;
     }
 
     /// endswith - Check if this string ends with the given \arg Suffix.
     bool endswith(StringRef Suffix) const {
-      return slice(size() - Suffix.Length, size()).equals(Suffix);
+      return Length >= Suffix.Length &&
+             memcmp(end() - Suffix.Length, Suffix.Data, Suffix.Length) == 0;
     }
 
     /// @}
@@ -173,7 +198,7 @@ namespace llvm {
 
     /// find - Search for the first character \arg C in the string.
     ///
-    /// \return - The index of the first occurence of \arg C, or npos if not
+    /// \return - The index of the first occurrence of \arg C, or npos if not
     /// found.
     size_t find(char C, size_t From = 0) const {
       for (size_t i = min(From, Length), e = Length; i != e; ++i)
@@ -184,13 +209,13 @@ namespace llvm {
 
     /// find - Search for the first string \arg Str in the string.
     ///
-    /// \return - The index of the first occurence of \arg Str, or npos if not
+    /// \return - The index of the first occurrence of \arg Str, or npos if not
     /// found.
     size_t find(StringRef Str, size_t From = 0) const;
 
     /// rfind - Search for the last character \arg C in the string.
     ///
-    /// \return - The index of the last occurence of \arg C, or npos if not
+    /// \return - The index of the last occurrence of \arg C, or npos if not
     /// found.
     size_t rfind(char C, size_t From = npos) const {
       From = min(From, Length);
@@ -205,18 +230,20 @@ namespace llvm {
 
     /// rfind - Search for the last string \arg Str in the string.
     ///
-    /// \return - The index of the last occurence of \arg Str, or npos if not
+    /// \return - The index of the last occurrence of \arg Str, or npos if not
     /// found.
     size_t rfind(StringRef Str) const;
 
     /// find_first_of - Find the first character in the string that is \arg C,
     /// or npos if not found. Same as find.
-    size_type find_first_of(char C, size_t = 0) const { return find(C); }
+    size_type find_first_of(char C, size_t From = 0) const {
+      return find(C, From);
+    }
 
     /// find_first_of - Find the first character in the string that is in \arg
     /// Chars, or npos if not found.
     ///
-    /// Note: O(size() * Chars.size())
+    /// Note: O(size() + Chars.size())
     size_type find_first_of(StringRef Chars, size_t From = 0) const;
 
     /// find_first_not_of - Find the first character in the string that is not
@@ -226,7 +253,7 @@ namespace llvm {
     /// find_first_not_of - Find the first character in the string that is not
     /// in the string \arg Chars, or npos if not found.
     ///
-    /// Note: O(size() * Chars.size())
+    /// Note: O(size() + Chars.size())
     size_type find_first_not_of(StringRef Chars, size_t From = 0) const;
 
     /// @}
@@ -261,6 +288,19 @@ namespace llvm {
 
     // TODO: Provide overloads for int/unsigned that check for overflow.
 
+    /// getAsInteger - Parse the current string as an integer of the
+    /// specified radix, or of an autosensed radix if the radix given
+    /// is 0.  The current value in Result is discarded, and the
+    /// storage is changed to be wide enough to store the parsed
+    /// integer.
+    ///
+    /// Returns true if the string does not solely consist of a valid
+    /// non-empty number in the appropriate base.
+    ///
+    /// APInt::fromString is superficially similar but assumes the
+    /// string is well-formed in the given radix.
+    bool getAsInteger(unsigned Radix, APInt &Result) const;
+
     /// @}
     /// @name Substring Operations
     /// @{
@@ -295,7 +335,7 @@ namespace llvm {
       return StringRef(Data + Start, End - Start);
     }
 
-    /// split - Split into two substrings around the first occurence of a
+    /// split - Split into two substrings around the first occurrence of a
     /// separator character.
     ///
     /// If \arg Separator is in the string, then the result is a pair (LHS, RHS)
@@ -312,7 +352,7 @@ namespace llvm {
       return std::make_pair(slice(0, Idx), slice(Idx+1, npos));
     }
 
-    /// split - Split into two substrings around the first occurence of a
+    /// split - Split into two substrings around the first occurrence of a
     /// separator string.
     ///
     /// If \arg Separator is in the string, then the result is a pair (LHS, RHS)
@@ -329,7 +369,7 @@ namespace llvm {
       return std::make_pair(slice(0, Idx), slice(Idx + Separator.size(), npos));
     }
 
-    /// split - Split into substrings around the occurences of a separator
+    /// split - Split into substrings around the occurrences of a separator
     /// string.
     ///
     /// Each substring is stored in \arg A. If \arg MaxSplit is >= 0, at most
@@ -343,12 +383,12 @@ namespace llvm {
     /// \param A - Where to put the substrings.
     /// \param Separator - The string to split on.
     /// \param MaxSplit - The maximum number of times the string is split.
-    /// \parm KeepEmpty - True if empty substring should be added.
+    /// \param KeepEmpty - True if empty substring should be added.
     void split(SmallVectorImpl<StringRef> &A,
                StringRef Separator, int MaxSplit = -1,
                bool KeepEmpty = true) const;
 
-    /// rsplit - Split into two substrings around the last occurence of a
+    /// rsplit - Split into two substrings around the last occurrence of a
     /// separator character.
     ///
     /// If \arg Separator is in the string, then the result is a pair (LHS, RHS)