add some more overloads of StringRef::getAsInteger for
authorChris Lattner <sabre@nondot.org>
Sat, 19 Sep 2009 23:58:48 +0000 (23:58 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 19 Sep 2009 23:58:48 +0000 (23:58 +0000)
common and useful integer types.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82338 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/StringRef.h
lib/Support/StringRef.cpp

index 2015a66bd82c02493be9da1c6bfa6f6a40b839a6..01f5d7bef0ff5cac39f8eeb4d1c57d5e9927e7dd 100644 (file)
@@ -235,8 +235,10 @@ namespace llvm {
     /// this returns true to signify the error.  The string is considered
     /// erroneous if empty.
     ///
-    //bool getAsInteger(unsigned Radix, long long &Result) const;
+    bool getAsInteger(unsigned Radix, long long &Result) const;
     bool getAsInteger(unsigned Radix, unsigned long long &Result) const;
+    bool getAsInteger(unsigned Radix, int &Result) const;
+    bool getAsInteger(unsigned Radix, unsigned &Result) const;
 
     // TODO: Provide overloads for int/unsigned that check for overflow.
     
index 2e7d3c0c6e8610fc109073ef9eeee76aa1e228c5..4c427012b13e0cb2d1245176cad97e3244b5a66c 100644 (file)
@@ -12,6 +12,8 @@ using namespace llvm;
 
 const size_t StringRef::npos;
 
+/// GetAsUnsignedInteger - Workhorse method that converts a integer character
+/// sequence of radix up to 36 to an unsigned long long value.
 static bool GetAsUnsignedInteger(StringRef Str, unsigned Radix,
                                  unsigned long long &Result) {
   // Autosense radix if not specified.
@@ -74,3 +76,46 @@ bool StringRef::getAsInteger(unsigned Radix, unsigned long long &Result) const {
   return GetAsUnsignedInteger(*this, Radix, Result);
 }
 
+
+bool StringRef::getAsInteger(unsigned Radix, long long &Result) const {
+  unsigned long long ULLVal;
+  
+  // Handle positive strings first.
+  if (empty() || front() != '-') {
+    if (GetAsUnsignedInteger(*this, Radix, ULLVal) ||
+        // Check for value so large it overflows a signed value.
+        (long long)ULLVal < 0)
+      return true;
+    Result = ULLVal;
+    return false;
+  }
+  
+  // Get the positive part of the value.
+  if (GetAsUnsignedInteger(substr(1), Radix, ULLVal) ||
+      // Reject values so large they'd overflow as negative signed, but allow
+      // "-0".  This negates the unsigned so that the negative isn't undefined
+      // on signed overflow.
+      (long long)-ULLVal > 0)
+    return true;
+  
+  Result = -ULLVal;
+  return false;
+}
+
+bool StringRef::getAsInteger(unsigned Radix, int &Result) const {
+  long long Val;
+  if (getAsInteger(Radix, Val) ||
+      (int)Val != Val)
+    return true;
+  Result = Val;
+  return false;
+}
+
+bool StringRef::getAsInteger(unsigned Radix, unsigned &Result) const {
+  unsigned long long Val;
+  if (getAsInteger(Radix, Val) ||
+      (unsigned)Val != Val)
+    return true;
+  Result = Val;
+  return false;
+}