projects
/
folly.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Move folly/Bits.h to folly/lang/
[folly.git]
/
folly
/
Conv.h
diff --git
a/folly/Conv.h
b/folly/Conv.h
index be0d3d0dafa994695cc64ac43943a0a3e60a064d..a545816d327307ff460b7d99cd91a388115fc562 100644
(file)
--- a/
folly/Conv.h
+++ b/
folly/Conv.h
@@
-133,7
+133,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
+283,7
@@
unsafeTelescope128(char * buffer, size_t room, unsigned __int128 x) {
return p;
}
return p;
}
-}
+}
// namespace detail
#endif
/**
#endif
/**
@@
-408,6
+408,11
@@
estimateSpaceNeeded(T) {
return 1;
}
return 1;
}
+template <size_t N>
+constexpr size_t estimateSpaceNeeded(const char (&)[N]) {
+ return N;
+}
+
/**
* Everything implicitly convertible to const char* gets appended.
*/
/**
* Everything implicitly convertible to const char* gets appended.
*/
@@
-435,12
+440,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();
}
@@
-1415,8
+1426,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;
}
};
@@
-1475,6
+1487,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
@@
-1526,7
+1546,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;
@@
-1535,7
+1556,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;
@@
-1544,7
+1566,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));
@@
-1552,8
+1575,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));
}