constexpr_strlen works for types other than char. Remove bogus check for nullptr.
authorEric Niebler <eniebler@fb.com>
Mon, 5 Dec 2016 21:06:16 +0000 (13:06 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Mon, 5 Dec 2016 21:08:26 +0000 (13:08 -0800)
Summary: overload constexpr_strlen to work with other character types

Reviewed By: yfeldblum, luciang, Orvid, ot

Differential Revision: D4269654

fbshipit-source-id: 2fcd666669efb51d77e847ff31bda3a301e763da

folly/portability/Constexpr.h

index dc21a7d36d1662eecf29c929017c6cadae8ec17b..0827115e3ef2d8a9ee69254a6ec2a9f267487e65 100755 (executable)
@@ -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