aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/core/lib
diff options
context:
space:
mode:
authorGravatar Rachel Lim <rachelim@google.com>2018-05-31 18:28:20 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-05-31 18:30:58 -0700
commit2f97b2f2796b2b1df781066b0efe443750ac5a6b (patch)
tree70b8b512ec62de967e343dd5f87eb1634c83f6a7 /tensorflow/core/lib
parent2e272dbca6600991599e55a7ff7cfa668b8403aa (diff)
[tf.data] Changed parsing logic for CsvDataset for better performance and correctness
PiperOrigin-RevId: 198812512
Diffstat (limited to 'tensorflow/core/lib')
-rw-r--r--tensorflow/core/lib/strings/numbers.cc26
-rw-r--r--tensorflow/core/lib/strings/numbers.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/tensorflow/core/lib/strings/numbers.cc b/tensorflow/core/lib/strings/numbers.cc
index 987e4fe733..f18c6dc709 100644
--- a/tensorflow/core/lib/strings/numbers.cc
+++ b/tensorflow/core/lib/strings/numbers.cc
@@ -345,6 +345,19 @@ bool safe_strtof(const char* str, float* value) {
return processed_characters_count > 0;
}
+bool safe_strtof(StringPiece str, float* value) {
+ int processed_characters_count = -1;
+ auto len = str.size();
+
+ // If string length exceeds buffer size or int max, fail.
+ if (len >= kFastToBufferSize) return false;
+ if (len > std::numeric_limits<int>::max()) return false;
+
+ *value = StringToFloatConverter().StringToFloat(
+ str.data(), static_cast<int>(len), &processed_characters_count);
+ return processed_characters_count > 0;
+}
+
bool safe_strtod(const char* str, double* value) {
int processed_characters_count = -1;
auto len = str_util::Strnlen(str, kFastToBufferSize);
@@ -359,6 +372,19 @@ bool safe_strtod(const char* str, double* value) {
return processed_characters_count > 0;
}
+bool safe_strtod(StringPiece str, double* value) {
+ int processed_characters_count = -1;
+ auto len = str.size();
+
+ // If string length exceeds buffer size or int max, fail.
+ if (len >= kFastToBufferSize) return false;
+ if (len > std::numeric_limits<int>::max()) return false;
+
+ *value = StringToFloatConverter().StringToDouble(
+ str.data(), static_cast<int>(len), &processed_characters_count);
+ return processed_characters_count > 0;
+}
+
size_t FloatToBuffer(float value, char* buffer) {
// FLT_DIG is 6 for IEEE-754 floats, which are used on almost all
// platforms these days. Just in case some system exists where FLT_DIG
diff --git a/tensorflow/core/lib/strings/numbers.h b/tensorflow/core/lib/strings/numbers.h
index 9cb56415cb..f62584dedb 100644
--- a/tensorflow/core/lib/strings/numbers.h
+++ b/tensorflow/core/lib/strings/numbers.h
@@ -116,12 +116,14 @@ bool safe_strtou64(StringPiece str, uint64* value);
// Values may be rounded on over- and underflow.
// Returns false on invalid input or if `strlen(value) >= kFastToBufferSize`.
bool safe_strtof(const char* str, float* value);
+bool safe_strtof(StringPiece str, float* value);
// Convert strings to double precision floating point values.
// Leading and trailing spaces are allowed.
// Values may be rounded on over- and underflow.
// Returns false on invalid input or if `strlen(value) >= kFastToBufferSize`.
bool safe_strtod(const char* str, double* value);
+bool safe_strtod(StringPiece str, double* value);
inline bool ProtoParseNumeric(StringPiece s, int32* value) {
return safe_strto32(s, value);