Stop using ScopeGuardImpl in DynamicParser
[folly.git] / folly / Likely.h
index c535e8aefac9a0aa6934d1404a84ae4fbbbaac32..bdab72b817c2d621649c6bc28f27127aab6715be 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 Facebook, Inc.
+ * Copyright 2012-present Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * limitations under the License.
  */
 
-/**
- * Compiler hints to indicate the fast path of an "if" branch: whether
- * the if condition is likely to be true or false.
- *
- * @author Tudor Bosman (tudorb@fb.com)
- */
+#pragma once
+
+#if __GNUC__
+#define FOLLY_DETAIL_BUILTIN_EXPECT(b, t) (__builtin_expect(b, t))
+#else
+#define FOLLY_DETAIL_BUILTIN_EXPECT(b, t) b
+#endif
 
-#ifndef FOLLY_BASE_LIKELY_H_
-#define FOLLY_BASE_LIKELY_H_
+//  Likeliness annotations
+//
+//  Useful when the author has better knowledge than the compiler of whether
+//  the branch condition is overwhelmingly likely to take a specific value.
+//
+//  Useful when the author has better knowledge than the compiler of which code
+//  paths are designed as the fast path and which are designed as the slow path,
+//  and to force the compiler to optimize for the fast path, even when it is not
+//  overwhelmingly likely.
+
+#define FOLLY_LIKELY(x) FOLLY_DETAIL_BUILTIN_EXPECT((x), 1)
+#define FOLLY_UNLIKELY(x) FOLLY_DETAIL_BUILTIN_EXPECT((x), 0)
+
+//  Un-namespaced annotations
 
 #undef LIKELY
 #undef UNLIKELY
 
-#if defined(__GNUC__) && __GNUC__ >= 4
+#if defined(__GNUC__)
 #define LIKELY(x)   (__builtin_expect((x), 1))
 #define UNLIKELY(x) (__builtin_expect((x), 0))
 #else
 #define LIKELY(x)   (x)
 #define UNLIKELY(x) (x)
 #endif
-
-#endif /* FOLLY_BASE_LIKELY_H_ */
-