Commit dd9cce30 authored by Eric Niebler's avatar Eric Niebler Committed by Facebook Github Bot

constexpr_strlen works for types other than char. Remove bogus check for nullptr.

Summary: overload constexpr_strlen to work with other character types

Reviewed By: yfeldblum, luciang, Orvid, ot

Differential Revision: D4269654

fbshipit-source-id: 2fcd666669efb51d77e847ff31bda3a301e763da
parent 87efa7ee
......@@ -81,19 +81,27 @@ constexpr auto constexpr_abs(T t)
return detail::constexpr_abs_helper<T>::go(t);
}
#ifdef _MSC_VER
constexpr size_t constexpr_strlen_internal(const char* s, size_t len) {
return *s == '\0' ? len : constexpr_strlen_internal(s + 1, len + 1);
namespace detail {
template <typename Char>
constexpr size_t constexpr_strlen_internal(const Char* s, size_t len) {
return *s == Char(0) ? len : constexpr_strlen_internal(s + 1, len + 1);
}
static_assert(constexpr_strlen_internal("123456789", 0) == 9,
"Someone appears to have broken constexpr_strlen...");
#endif
} // namespace detail
template <typename Char>
constexpr size_t constexpr_strlen(const Char* s) {
return detail::constexpr_strlen_internal(s, 0);
}
template <>
constexpr size_t constexpr_strlen(const char* s) {
#if defined(__clang__)
return __builtin_strlen(s);
#elif defined(_MSC_VER)
return s == nullptr ? 0 : constexpr_strlen_internal(s, 0);
return detail::constexpr_strlen_internal(s, 0);
#else
return std::strlen(s);
#endif
......
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