From 38fb7acd7836738bad760de579aeb7b4c5c82de2 Mon Sep 17 00:00:00 2001 From: Lucian Grijincu Date: Thu, 26 Jun 2014 16:26:33 -0700 Subject: [PATCH] folly: StringPiece: add skipWhitespace Test Plan: copied from folly::json Reviewed By: philipp@fb.com, soren@fb.com FB internal diff: D1417992 Tasks: 4527315 --- folly/String.cpp | 28 +++++++++++++++++++++++----- folly/String.h | 6 ++++++ folly/json.cpp | 18 +++--------------- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/folly/String.cpp b/folly/String.cpp index c80c6821..612db8cb 100644 --- a/folly/String.cpp +++ b/folly/String.cpp @@ -203,7 +203,7 @@ const PrettySuffix kPrettySISuffixes[] = { { "z", 1e-21L }, { "y", 1e-24L }, { " ", 0 }, - { 0, 0} + { 0, 0} }; const PrettySuffix* const kPrettySuffixes[PRETTY_NUM_TYPES] = { @@ -247,7 +247,7 @@ std::string prettyPrint(double val, PrettyType type, bool addSpace) { //TODO: //1) Benchmark & optimize -double prettyToDouble(folly::StringPiece *const prettyString, +double prettyToDouble(folly::StringPiece *const prettyString, const PrettyType type) { double value = folly::to(prettyString); while (prettyString->size() > 0 && std::isspace(prettyString->front())) { @@ -278,13 +278,13 @@ double prettyToDouble(folly::StringPiece *const prettyString, prettyString->toString(), "\"")); } prettyString->advance(longestPrefixLen); - return suffixes[bestPrefixId].val ? value * suffixes[bestPrefixId].val : + return suffixes[bestPrefixId].val ? value * suffixes[bestPrefixId].val : value; } double prettyToDouble(folly::StringPiece prettyString, const PrettyType type){ double result = prettyToDouble(&prettyString, type); - detail::enforceWhitespace(prettyString.data(), + detail::enforceWhitespace(prettyString.data(), prettyString.data() + prettyString.size()); return result; } @@ -329,6 +329,25 @@ fbstring errnoStr(int err) { return result; } +StringPiece skipWhitespace(StringPiece sp) { + // Spaces other than ' ' characters are less common but should be + // checked. This configuration where we loop on the ' ' + // separately from oddspaces was empirically fastest. + auto oddspace = [] (char c) { + return c == '\n' || c == '\t' || c == '\r'; + }; + +loop: + for (; !sp.empty() && sp.front() == ' '; sp.pop_front()) { + } + if (!sp.empty() && oddspace(sp.front())) { + sp.pop_front(); + goto loop; + } + + return sp; +} + namespace detail { size_t hexDumpLine(const void* ptr, size_t offset, size_t size, @@ -385,4 +404,3 @@ size_t hexDumpLine(const void* ptr, size_t offset, size_t size, # undef DMGL_TYPES # undef DMGL_RET_POSTFIX #endif - diff --git a/folly/String.h b/folly/String.h index f597291f..9a44f545 100644 --- a/folly/String.h +++ b/folly/String.h @@ -503,6 +503,12 @@ std::string join(const Delim& delimiter, return output; } +/** + * Returns a subpiece with all whitespace removed from the front of @sp. + * Whitespace means any of [' ', '\n', '\r', '\t']. + */ +StringPiece skipWhitespace(StringPiece sp); + } // namespace folly // Hash functions to make std::string usable with e.g. hash_map diff --git a/folly/json.cpp b/folly/json.cpp index f6bf8f2c..cd83b5ad 100644 --- a/folly/json.cpp +++ b/folly/json.cpp @@ -19,9 +19,10 @@ #include #include +#include #include +#include #include -#include namespace folly { @@ -323,20 +324,7 @@ struct Input { } void skipWhitespace() { - // Spaces other than ' ' characters are less common but should be - // checked. This configuration where we loop on the ' ' - // separately from oddspaces was empirically fastest. - auto oddspace = [] (char c) { - return c == '\n' || c == '\t' || c == '\r'; - }; - - loop: - for (; !range_.empty() && range_.front() == ' '; range_.pop_front()) { - } - if (!range_.empty() && oddspace(range_.front())) { - range_.pop_front(); - goto loop; - } + range_ = folly::skipWhitespace(range_); storeCurrent(); } -- 2.34.1