mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[Support] Add StringRef::getAsDouble.
Differential Revision: https://reviews.llvm.org/D29918 llvm-svn: 295089
This commit is contained in:
parent
62596cd09c
commit
a94bd828dc
@ -557,6 +557,14 @@ namespace llvm {
|
||||
/// string is well-formed in the given radix.
|
||||
bool getAsInteger(unsigned Radix, APInt &Result) const;
|
||||
|
||||
/// Parse the current string as an IEEE double-precision floating
|
||||
/// point value. The string must be a well-formed double.
|
||||
///
|
||||
/// If \p AllowInexact is false, the function will fail if the string
|
||||
/// cannot be represented exactly. Otherwise, the function only fails
|
||||
/// in case of an overflow or underflow.
|
||||
bool getAsDouble(double &Result, bool AllowInexact = true) const;
|
||||
|
||||
/// @}
|
||||
/// @name String Operations
|
||||
/// @{
|
||||
|
@ -8,6 +8,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/Hashing.h"
|
||||
#include "llvm/ADT/edit_distance.h"
|
||||
@ -595,6 +596,18 @@ bool StringRef::getAsInteger(unsigned Radix, APInt &Result) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool StringRef::getAsDouble(double &Result, bool AllowInexact) const {
|
||||
APFloat F(0.0);
|
||||
APFloat::opStatus Status =
|
||||
F.convertFromString(*this, APFloat::rmNearestTiesToEven);
|
||||
if (Status != APFloat::opOK) {
|
||||
if (!AllowInexact || Status != APFloat::opInexact)
|
||||
return true;
|
||||
}
|
||||
|
||||
Result = F.convertToDouble();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Implementation of StringRef hashing.
|
||||
hash_code llvm::hash_value(StringRef S) {
|
||||
|
@ -852,6 +852,27 @@ TEST(StringRefTest, consumeIntegerSigned) {
|
||||
}
|
||||
}
|
||||
|
||||
struct GetDoubleStrings {
|
||||
const char *Str;
|
||||
bool AllowInexact;
|
||||
bool ShouldFail;
|
||||
double D;
|
||||
} DoubleStrings[] = {{"0", false, false, 0.0},
|
||||
{"0.0", false, false, 0.0},
|
||||
{"-0.0", false, false, -0.0},
|
||||
{"123.45", false, true, 123.45},
|
||||
{"123.45", true, false, 123.45}};
|
||||
|
||||
TEST(StringRefTest, getAsDouble) {
|
||||
for (const auto &Entry : DoubleStrings) {
|
||||
double Result;
|
||||
StringRef S(Entry.Str);
|
||||
EXPECT_EQ(Entry.ShouldFail, S.getAsDouble(Result, Entry.AllowInexact));
|
||||
if (!Entry.ShouldFail)
|
||||
EXPECT_EQ(Result, Entry.D);
|
||||
}
|
||||
}
|
||||
|
||||
static const char *join_input[] = { "a", "b", "c" };
|
||||
static const char join_result1[] = "a";
|
||||
static const char join_result2[] = "a:b:c";
|
||||
|
Loading…
Reference in New Issue
Block a user