Refer to nullptr not NULL
[folly.git] / folly / Assume.h
index 8f8074333c2db293b4227372fb8976a0037b9130..f905dce7ca7528f6a7ae3bb374ab7eb7780b34f9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 #pragma once
 
+#include <cstdlib>
+
 #include <folly/Portability.h>
-#include <glog/logging.h>
 
 namespace folly {
 
+namespace detail {
+
+extern void assume_check(bool cond);
+
+}
+
 /**
  * Inform the compiler that the argument can be assumed true. It is
  * undefined behavior if the argument is not actually true, so use
@@ -32,16 +39,32 @@ namespace folly {
  */
 
 FOLLY_ALWAYS_INLINE void assume(bool cond) {
-#ifndef NDEBUG
-  DCHECK(cond);
-#elif defined(__clang__)  // Must go first because Clang also defines __GNUC__.
-  __builtin_assume(cond);
+  if (kIsDebug) {
+    detail::assume_check(cond);
+  } else {
+#if defined(__clang__)  // Must go first because Clang also defines __GNUC__.
+    __builtin_assume(cond);
 #elif defined(__GNUC__)
-  if (!cond) { __builtin_unreachable(); }
+    if (!cond) { __builtin_unreachable(); }
+#elif defined(_MSC_VER)
+    __assume(cond);
+#else
+    // Do nothing.
+#endif
+  }
+}
+
+[[noreturn]] FOLLY_ALWAYS_INLINE void assume_unreachable() {
+  assume(false);
+  // Do a bit more to get the compiler to understand
+  // that this function really will never return.
+#if defined(__GNUC__)
+  __builtin_unreachable();
 #elif defined(_MSC_VER)
-  __assume(cond);
+  __assume(0);
 #else
-  // Do nothing.
+  // Well, it's better than nothing.
+  std::abort();
 #endif
 }