aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow
diff options
context:
space:
mode:
authorGravatar Alexey Surkov <surkov@google.com>2016-10-14 17:09:16 -0800
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2016-10-14 18:19:15 -0700
commit345b7328871cadaa729052ad5a62a47c26f1595e (patch)
tree4b3dd944d9b987d232f24da5bf9c9ec96ff38614 /tensorflow
parentcd92a576f927329a2686c5456402ebd88e9ba710 (diff)
GCS Resumable Upload: use int64 instead of int32 when parsing file offsets.
Change: 136219797
Diffstat (limited to 'tensorflow')
-rw-r--r--tensorflow/core/lib/strings/str_util.cc28
-rw-r--r--tensorflow/core/lib/strings/str_util.h2
-rw-r--r--tensorflow/core/lib/strings/str_util_test.cc26
-rw-r--r--tensorflow/core/platform/cloud/gcs_file_system.cc2
4 files changed, 48 insertions, 10 deletions
diff --git a/tensorflow/core/lib/strings/str_util.cc b/tensorflow/core/lib/strings/str_util.cc
index 6a794839f2..4d44fd87cd 100644
--- a/tensorflow/core/lib/strings/str_util.cc
+++ b/tensorflow/core/lib/strings/str_util.cc
@@ -196,6 +196,20 @@ bool CUnescapeInternal(StringPiece source, char* dest,
return true;
}
+template <typename T>
+bool SplitAndParseAsInts(StringPiece text, char delim,
+ std::function<bool(StringPiece, T*)> converter,
+ std::vector<T>* result) {
+ result->clear();
+ std::vector<string> num_strings = Split(text, delim);
+ for (const auto& s : num_strings) {
+ T num;
+ if (!converter(s, &num)) return false;
+ result->push_back(num);
+ }
+ return true;
+}
+
} // namespace
bool CUnescape(StringPiece source, string* dest, string* error) {
@@ -333,14 +347,12 @@ bool ConsumeNonWhitespace(StringPiece* s, StringPiece* val) {
bool SplitAndParseAsInts(StringPiece text, char delim,
std::vector<int32>* result) {
- result->clear();
- std::vector<string> num_strings = Split(text, delim);
- for (const auto& s : num_strings) {
- int32 num;
- if (!strings::safe_strto32(s, &num)) return false;
- result->push_back(num);
- }
- return true;
+ return SplitAndParseAsInts<int32>(text, delim, strings::safe_strto32, result);
+}
+
+bool SplitAndParseAsInts(StringPiece text, char delim,
+ std::vector<int64>* result) {
+ return SplitAndParseAsInts<int64>(text, delim, strings::safe_strto64, result);
}
} // namespace str_util
diff --git a/tensorflow/core/lib/strings/str_util.h b/tensorflow/core/lib/strings/str_util.h
index 135d2f744e..ee197e54e3 100644
--- a/tensorflow/core/lib/strings/str_util.h
+++ b/tensorflow/core/lib/strings/str_util.h
@@ -117,6 +117,8 @@ std::vector<string> Split(StringPiece text, char delim, Predicate p);
// to "*result" and returns true. Otherwise returns false.
bool SplitAndParseAsInts(StringPiece text, char delim,
std::vector<int32>* result);
+bool SplitAndParseAsInts(StringPiece text, char delim,
+ std::vector<int64>* result);
// ------------------------------------------------------------------
// Implementation details below
diff --git a/tensorflow/core/lib/strings/str_util_test.cc b/tensorflow/core/lib/strings/str_util_test.cc
index 091691c7b2..055e1e4ac0 100644
--- a/tensorflow/core/lib/strings/str_util_test.cc
+++ b/tensorflow/core/lib/strings/str_util_test.cc
@@ -248,7 +248,7 @@ TEST(Split, Basic) {
"a|b|c");
}
-TEST(SplitAndParseAsInts, Basic) {
+TEST(SplitAndParseAsInts, Int32) {
std::vector<int32> nums;
EXPECT_TRUE(str_util::SplitAndParseAsInts("", ',', &nums));
EXPECT_EQ(nums.size(), 0);
@@ -271,6 +271,30 @@ TEST(SplitAndParseAsInts, Basic) {
EXPECT_FALSE(str_util::SplitAndParseAsInts("13,abc,5", ',', &nums));
}
+TEST(SplitAndParseAsInts, Int64) {
+ std::vector<int64> nums;
+ EXPECT_TRUE(str_util::SplitAndParseAsInts("", ',', &nums));
+ EXPECT_EQ(nums.size(), 0);
+
+ EXPECT_TRUE(str_util::SplitAndParseAsInts("134", ',', &nums));
+ EXPECT_EQ(nums.size(), 1);
+ EXPECT_EQ(nums[0], 134);
+
+ EXPECT_TRUE(
+ str_util::SplitAndParseAsInts("134,2,13,-4000000000", ',', &nums));
+ EXPECT_EQ(nums.size(), 4);
+ EXPECT_EQ(nums[0], 134);
+ EXPECT_EQ(nums[1], 2);
+ EXPECT_EQ(nums[2], 13);
+ EXPECT_EQ(nums[3], -4000000000);
+
+ EXPECT_FALSE(str_util::SplitAndParseAsInts("abc", ',', &nums));
+
+ EXPECT_FALSE(str_util::SplitAndParseAsInts("-13,abc", ',', &nums));
+
+ EXPECT_FALSE(str_util::SplitAndParseAsInts("13,abc,5", ',', &nums));
+}
+
TEST(Lowercase, Basic) {
EXPECT_EQ("", str_util::Lowercase(""));
EXPECT_EQ("hello", str_util::Lowercase("hello"));
diff --git a/tensorflow/core/platform/cloud/gcs_file_system.cc b/tensorflow/core/platform/cloud/gcs_file_system.cc
index 2c3ba2228f..712fa9c636 100644
--- a/tensorflow/core/platform/cloud/gcs_file_system.cc
+++ b/tensorflow/core/platform/cloud/gcs_file_system.cc
@@ -485,7 +485,7 @@ class GcsWritableFile : public WritableFile {
} else {
StringPiece range_piece(received_range);
range_piece.Consume("bytes="); // May or may not be present.
- std::vector<int32> range_parts;
+ std::vector<int64> range_parts;
if (!str_util::SplitAndParseAsInts(range_piece, '-', &range_parts) ||
range_parts.size() != 2) {
return errors::Internal(strings::StrCat(