diff options
author | 2016-10-14 17:09:16 -0800 | |
---|---|---|
committer | 2016-10-14 18:19:15 -0700 | |
commit | 345b7328871cadaa729052ad5a62a47c26f1595e (patch) | |
tree | 4b3dd944d9b987d232f24da5bf9c9ec96ff38614 /tensorflow | |
parent | cd92a576f927329a2686c5456402ebd88e9ba710 (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.cc | 28 | ||||
-rw-r--r-- | tensorflow/core/lib/strings/str_util.h | 2 | ||||
-rw-r--r-- | tensorflow/core/lib/strings/str_util_test.cc | 26 | ||||
-rw-r--r-- | tensorflow/core/platform/cloud/gcs_file_system.cc | 2 |
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( |