Support constexpr_strlen under MSVC.
authorChristopher Dykes <cdykes@fb.com>
Mon, 1 Feb 2016 20:36:43 +0000 (12:36 -0800)
committerfacebook-github-bot-1 <folly-bot@fb.com>
Mon, 1 Feb 2016 21:20:26 +0000 (13:20 -0800)
Summary: MSVC doesn't support evaluating strlen at compile time, so implement our own version instead.

Reviewed By: yfeldblum, lbrandy

Differential Revision: D2856926

fb-gh-sync-id: 22222350b57d9eff6a06c9d0f37d43a3cb1f2534

folly/Portability.h
folly/json.cpp

index 41c598208c446eb80d3b233c7e8f64972fec4d6b..5054afd8424a3271e04b59e7611f3234eab80b8a 100644 (file)
@@ -439,9 +439,19 @@ inline void asm_pause() {
 #endif
 }
 
+#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);
+}
+static_assert(constexpr_strlen_internal("123456789", 0) == 9,
+              "Someone appears to have broken constexpr_strlen...");
+#endif
+
 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);
 #else
   return strlen(s);
 #endif
index 438cdf2ed7a4bc833c059a7b6c05e0d569c033ee..2fb8d78a286e7a8a5495bc1687ea4e17e0403829 100644 (file)
@@ -20,6 +20,7 @@
 #include <boost/algorithm/string.hpp>
 
 #include <folly/Conv.h>
+#include <folly/Portability.h>
 #include <folly/Range.h>
 #include <folly/String.h>
 #include <folly/Unicode.h>
@@ -487,7 +488,7 @@ dynamic parseNumber(Input& in) {
 
   constexpr const char* maxInt = "9223372036854775807";
   constexpr const char* minInt = "9223372036854775808";
-  constexpr auto maxIntLen = __builtin_strlen(maxInt);
+  constexpr auto maxIntLen = constexpr_strlen(maxInt);
 
 
   if (*in != '.' && !wasE && in.getOpts().parse_numbers_as_strings) {