Export of internal Abseil changes.

--
8f685654a7d04eb8a0cb82d31e44e391e906b609 by Derek Mauro <dmauro@google.com>:

Support constexpr construction of absl::string_view from a
string literal in MSVC 2017+.

Fixes https://github.com/abseil/abseil-cpp/issues/352

PiperOrigin-RevId: 260853160

--
a3c4c5168ce2a491134d7c87cf7fdc75d1ee2533 by Derek Mauro <dmauro@google.com>:

Make SwissTable's at() throw when exceptions are enabled

Fixes https://github.com/abseil/abseil-cpp/issues/355

PiperOrigin-RevId: 260788026
GitOrigin-RevId: 8f685654a7d04eb8a0cb82d31e44e391e906b609
Change-Id: I9ed498e181faa9c9d16e9b1b01404969d99b8ea9
This commit is contained in:
Abseil Team 2019-07-30 20:47:29 -07:00 committed by Andy Soffer
parent 52e88ee56b
commit 14550beb3b
5 changed files with 35 additions and 13 deletions

View file

@ -172,19 +172,9 @@ class string_view {
// Implicit constructor of a `string_view` from nul-terminated `str`. When
// accepting possibly null strings, use `absl::NullSafeStringView(str)`
// instead (see below).
#if ABSL_HAVE_BUILTIN(__builtin_strlen) || \
(defined(__GNUC__) && !defined(__clang__))
// GCC has __builtin_strlen according to
// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Other-Builtins.html, but
// ABSL_HAVE_BUILTIN doesn't detect that, so we use the extra checks above.
// __builtin_strlen is constexpr.
constexpr string_view(const char* str) // NOLINT(runtime/explicit)
: ptr_(str),
length_(CheckLengthInternal(str ? __builtin_strlen(str) : 0)) {}
#else
constexpr string_view(const char* str) // NOLINT(runtime/explicit)
: ptr_(str), length_(CheckLengthInternal(str ? strlen(str) : 0)) {}
#endif
length_(str ? CheckLengthInternal(StrlenInternal(str)) : 0) {}
// Implicit constructor of a `string_view` from a `const char*` and length.
constexpr string_view(const char* data, size_type len)
@ -495,6 +485,24 @@ class string_view {
return ABSL_ASSERT(len <= kMaxSize), len;
}
static constexpr size_type StrlenInternal(const char* str) {
#if defined(_MSC_VER) && _MSC_VER >= 1910 && !defined(__clang__)
// MSVC 2017+ can evaluate this at compile-time.
const char* begin = str;
while (*str != '\0') ++str;
return str - begin;
#elif ABSL_HAVE_BUILTIN(__builtin_strlen) || \
(defined(__GNUC__) && !defined(__clang__))
// GCC has __builtin_strlen according to
// https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Other-Builtins.html, but
// ABSL_HAVE_BUILTIN doesn't detect that, so we use the extra checks above.
// __builtin_strlen is constexpr.
return __builtin_strlen(str);
#else
return str ? strlen(str) : 0;
#endif
}
const char* ptr_;
size_type length_;
};