projects
/
folly.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Return if we handle any error messages to avoid unnecessarily calling recv/send
[folly.git]
/
folly
/
Conv.h
diff --git
a/folly/Conv.h
b/folly/Conv.h
index ce30765c6f8d3bac9e8da6129d2ba6601eaeeed9..61e50e3733b316a4254c6bac094962efe2e80e93 100644
(file)
--- a/
folly/Conv.h
+++ b/
folly/Conv.h
@@
-1,5
+1,5
@@
/*
/*
- * Copyright 201
7
Facebook, Inc.
+ * Copyright 201
1-present
Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@
-35,7
+35,6
@@
#include <typeinfo>
#include <utility>
#include <typeinfo>
#include <utility>
-#include <boost/implicit_cast.hpp>
#include <double-conversion/double-conversion.h> // V8 JavaScript implementation
#include <folly/Demangle.h>
#include <double-conversion/double-conversion.h> // V8 JavaScript implementation
#include <folly/Demangle.h>
@@
-133,7
+132,7
@@
inline void enforceWhitespace(StringPiece sp) {
throw makeConversionError(err, sp);
}
}
throw makeConversionError(err, sp);
}
}
-}
+}
// namespace detail
/**
* The identity conversion function.
/**
* The identity conversion function.
@@
-283,7
+282,7
@@
unsafeTelescope128(char * buffer, size_t room, unsigned __int128 x) {
return p;
}
return p;
}
-}
+}
// namespace detail
#endif
/**
#endif
/**
@@
-303,7
+302,7
@@
inline uint32_t digits10(uint64_t v) {
// 10^i, defined for i 0 through 19.
// This is 20 * 8 == 160 bytes, which fits neatly into 5 cache lines
// (assuming a cache line size of 64).
// 10^i, defined for i 0 through 19.
// This is 20 * 8 == 160 bytes, which fits neatly into 5 cache lines
// (assuming a cache line size of 64).
-
static const uint64_t powersOf10[20] FOLLY_ALIGNED(64)
= {
+
alignas(64) static const uint64_t powersOf10[20]
= {
1,
10,
100,
1,
10,
100,
@@
-327,7
+326,7
@@
inline uint32_t digits10(uint64_t v) {
};
// "count leading zeroes" operation not valid; for 0; special case this.
};
// "count leading zeroes" operation not valid; for 0; special case this.
- if
UNLIKELY (! v
) {
+ if
(UNLIKELY(!v)
) {
return 1;
}
return 1;
}
@@
-342,16
+341,24
@@
inline uint32_t digits10(uint64_t v) {
// return that log_10 lower bound, plus adjust if input >= 10^(that bound)
// in case there's a small error and we misjudged length.
// return that log_10 lower bound, plus adjust if input >= 10^(that bound)
// in case there's a small error and we misjudged length.
- return minLength +
(uint32_t) (UNLIKELY (v >= powersOf10[minLength])
);
+ return minLength +
uint32_t(v >= powersOf10[minLength]
);
#else
uint32_t result = 1;
#else
uint32_t result = 1;
- for (;;) {
- if (LIKELY(v < 10)) return result;
- if (LIKELY(v < 100)) return result + 1;
- if (LIKELY(v < 1000)) return result + 2;
- if (LIKELY(v < 10000)) return result + 3;
+ while (true) {
+ if (LIKELY(v < 10)) {
+ return result;
+ }
+ if (LIKELY(v < 100)) {
+ return result + 1;
+ }
+ if (LIKELY(v < 1000)) {
+ return result + 2;
+ }
+ if (LIKELY(v < 10000)) {
+ return result + 3;
+ }
// Skip ahead by 4 orders of magnitude
v /= 10000U;
result += 4;
// Skip ahead by 4 orders of magnitude
v /= 10000U;
result += 4;
@@
-440,12
+447,18
@@
typename std::enable_if<std::is_convertible<Src, const char*>::value, size_t>::
return 0;
}
return 0;
}
+template <class Src>
+typename std::enable_if<IsSomeString<Src>::value, size_t>::type
+estimateSpaceNeeded(Src const& value) {
+ return value.size();
+}
+
template <class Src>
typename std::enable_if<
template <class Src>
typename std::enable_if<
- (std::is_convertible<Src, folly::StringPiece>::value ||
-
IsSomeString<Src>::value)
&&
- !std::is_convertible<Src, const char*>::value,
- size_t>::type
+ std::is_convertible<Src, folly::StringPiece>::value &&
+
!IsSomeString<Src>::value
&&
+
!std::is_convertible<Src, const char*>::value,
+
size_t>::type
estimateSpaceNeeded(Src value) {
return folly::StringPiece(value).size();
}
estimateSpaceNeeded(Src value) {
return folly::StringPiece(value).size();
}
@@
-1420,8
+1433,9
@@
using ParseToResult = decltype(parseTo(StringPiece{}, std::declval<Tgt&>()));
struct CheckTrailingSpace {
Expected<Unit, ConversionCode> operator()(StringPiece sp) const {
auto e = enforceWhitespaceErr(sp);
struct CheckTrailingSpace {
Expected<Unit, ConversionCode> operator()(StringPiece sp) const {
auto e = enforceWhitespaceErr(sp);
- if (UNLIKELY(e != ConversionCode::SUCCESS))
+ if (UNLIKELY(e != ConversionCode::SUCCESS))
{
return makeUnexpected(e);
return makeUnexpected(e);
+ }
return unit;
}
};
return unit;
}
};
@@
-1480,6
+1494,14
@@
tryTo(StringPiece src) {
});
}
});
}
+template <class Tgt, class Src>
+inline typename std::enable_if<
+ IsSomeString<Src>::value && !std::is_same<StringPiece, Tgt>::value,
+ Tgt>::type
+to(Src const& src) {
+ return to<Tgt>(StringPiece(src.data(), src.size()));
+}
+
template <class Tgt>
inline
typename std::enable_if<!std::is_same<StringPiece, Tgt>::value, Tgt>::type
template <class Tgt>
inline
typename std::enable_if<!std::is_same<StringPiece, Tgt>::value, Tgt>::type
@@
-1531,7
+1553,8
@@
Tgt to(StringPiece* src) {
template <class Tgt, class Src>
typename std::enable_if<
template <class Tgt, class Src>
typename std::enable_if<
- std::is_enum<Src>::value && !std::is_same<Src, Tgt>::value,
+ std::is_enum<Src>::value && !std::is_same<Src, Tgt>::value &&
+ !std::is_convertible<Tgt, StringPiece>::value,
Expected<Tgt, ConversionCode>>::type
tryTo(const Src& value) {
using I = typename std::underlying_type<Src>::type;
Expected<Tgt, ConversionCode>>::type
tryTo(const Src& value) {
using I = typename std::underlying_type<Src>::type;
@@
-1540,7
+1563,8
@@
tryTo(const Src& value) {
template <class Tgt, class Src>
typename std::enable_if<
template <class Tgt, class Src>
typename std::enable_if<
- std::is_enum<Tgt>::value && !std::is_same<Src, Tgt>::value,
+ !std::is_convertible<Src, StringPiece>::valuea &&
+ std::is_enum<Tgt>::value && !std::is_same<Src, Tgt>::value,
Expected<Tgt, ConversionCode>>::type
tryTo(const Src& value) {
using I = typename std::underlying_type<Tgt>::type;
Expected<Tgt, ConversionCode>>::type
tryTo(const Src& value) {
using I = typename std::underlying_type<Tgt>::type;
@@
-1549,7
+1573,8
@@
tryTo(const Src& value) {
template <class Tgt, class Src>
typename std::enable_if<
template <class Tgt, class Src>
typename std::enable_if<
- std::is_enum<Src>::value && !std::is_same<Src, Tgt>::value,
+ std::is_enum<Src>::value && !std::is_same<Src, Tgt>::value &&
+ !std::is_convertible<Tgt, StringPiece>::value,
Tgt>::type
to(const Src& value) {
return to<Tgt>(static_cast<typename std::underlying_type<Src>::type>(value));
Tgt>::type
to(const Src& value) {
return to<Tgt>(static_cast<typename std::underlying_type<Src>::type>(value));
@@
-1557,8
+1582,10
@@
to(const Src& value) {
template <class Tgt, class Src>
typename std::enable_if<
template <class Tgt, class Src>
typename std::enable_if<
- std::is_enum<Tgt>::value && !std::is_same<Src, Tgt>::value, Tgt>::type
-to(const Src & value) {
+ !std::is_convertible<Src, StringPiece>::value && std::is_enum<Tgt>::value &&
+ !std::is_same<Src, Tgt>::value,
+ Tgt>::type
+to(const Src& value) {
return static_cast<Tgt>(to<typename std::underlying_type<Tgt>::type>(value));
}
return static_cast<Tgt>(to<typename std::underlying_type<Tgt>::type>(value));
}