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