Commit 38fb7acd authored by Lucian Grijincu's avatar Lucian Grijincu Committed by Tudor Bosman

folly: StringPiece: add skipWhitespace

Test Plan: copied from folly::json

Reviewed By: philipp@fb.com, soren@fb.com

FB internal diff: D1417992

Tasks: 4527315
parent 368266c3
...@@ -203,7 +203,7 @@ const PrettySuffix kPrettySISuffixes[] = { ...@@ -203,7 +203,7 @@ const PrettySuffix kPrettySISuffixes[] = {
{ "z", 1e-21L }, { "z", 1e-21L },
{ "y", 1e-24L }, { "y", 1e-24L },
{ " ", 0 }, { " ", 0 },
{ 0, 0} { 0, 0}
}; };
const PrettySuffix* const kPrettySuffixes[PRETTY_NUM_TYPES] = { const PrettySuffix* const kPrettySuffixes[PRETTY_NUM_TYPES] = {
...@@ -247,7 +247,7 @@ std::string prettyPrint(double val, PrettyType type, bool addSpace) { ...@@ -247,7 +247,7 @@ std::string prettyPrint(double val, PrettyType type, bool addSpace) {
//TODO: //TODO:
//1) Benchmark & optimize //1) Benchmark & optimize
double prettyToDouble(folly::StringPiece *const prettyString, double prettyToDouble(folly::StringPiece *const prettyString,
const PrettyType type) { const PrettyType type) {
double value = folly::to<double>(prettyString); double value = folly::to<double>(prettyString);
while (prettyString->size() > 0 && std::isspace(prettyString->front())) { while (prettyString->size() > 0 && std::isspace(prettyString->front())) {
...@@ -278,13 +278,13 @@ double prettyToDouble(folly::StringPiece *const prettyString, ...@@ -278,13 +278,13 @@ double prettyToDouble(folly::StringPiece *const prettyString,
prettyString->toString(), "\"")); prettyString->toString(), "\""));
} }
prettyString->advance(longestPrefixLen); prettyString->advance(longestPrefixLen);
return suffixes[bestPrefixId].val ? value * suffixes[bestPrefixId].val : return suffixes[bestPrefixId].val ? value * suffixes[bestPrefixId].val :
value; value;
} }
double prettyToDouble(folly::StringPiece prettyString, const PrettyType type){ double prettyToDouble(folly::StringPiece prettyString, const PrettyType type){
double result = prettyToDouble(&prettyString, type); double result = prettyToDouble(&prettyString, type);
detail::enforceWhitespace(prettyString.data(), detail::enforceWhitespace(prettyString.data(),
prettyString.data() + prettyString.size()); prettyString.data() + prettyString.size());
return result; return result;
} }
...@@ -329,6 +329,25 @@ fbstring errnoStr(int err) { ...@@ -329,6 +329,25 @@ fbstring errnoStr(int err) {
return result; 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 { namespace detail {
size_t hexDumpLine(const void* ptr, size_t offset, size_t size, 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, ...@@ -385,4 +404,3 @@ size_t hexDumpLine(const void* ptr, size_t offset, size_t size,
# undef DMGL_TYPES # undef DMGL_TYPES
# undef DMGL_RET_POSTFIX # undef DMGL_RET_POSTFIX
#endif #endif
...@@ -503,6 +503,12 @@ std::string join(const Delim& delimiter, ...@@ -503,6 +503,12 @@ std::string join(const Delim& delimiter,
return output; 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 } // namespace folly
// Hash functions to make std::string usable with e.g. hash_map // Hash functions to make std::string usable with e.g. hash_map
......
...@@ -19,9 +19,10 @@ ...@@ -19,9 +19,10 @@
#include <boost/next_prior.hpp> #include <boost/next_prior.hpp>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <folly/Conv.h>
#include <folly/Range.h> #include <folly/Range.h>
#include <folly/String.h>
#include <folly/Unicode.h> #include <folly/Unicode.h>
#include <folly/Conv.h>
namespace folly { namespace folly {
...@@ -323,20 +324,7 @@ struct Input { ...@@ -323,20 +324,7 @@ struct Input {
} }
void skipWhitespace() { void skipWhitespace() {
// Spaces other than ' ' characters are less common but should be range_ = folly::skipWhitespace(range_);
// 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;
}
storeCurrent(); storeCurrent();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment