Mark constructing an Unexpected as cold
[folly.git] / folly / CppAttributes.h
index 6f75b8ac4e062cf6ea2d73dcb34fcd74e6c91503..466aab91a81144527e968415207f666674d52d46 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 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.
  * @author Dominik Gabi
  */
 
-#ifndef FOLLY_BASE_ATTRIBUTES_H_
-#define FOLLY_BASE_ATTRIBUTES_H_
+#pragma once
+
+#ifndef __has_attribute
+#define FOLLY_HAS_ATTRIBUTE(x) 0
+#else
+#define FOLLY_HAS_ATTRIBUTE(x) __has_attribute(x)
+#endif
 
 #ifndef __has_cpp_attribute
 #define FOLLY_HAS_CPP_ATTRIBUTE(x) 0
 #define FOLLY_FALLTHROUGH
 #endif
 
+/**
+ *  Maybe_unused indicates that a function, variable or parameter might or
+ *  might not be used, e.g.
+ *
+ *  int foo(FOLLY_MAYBE_UNUSED int x) {
+ *    #ifdef USE_X
+ *      return x;
+ *    #else
+ *      return 0;
+ *    #endif
+ *  }
+ */
+#if FOLLY_HAS_CPP_ATTRIBUTE(maybe_unused)
+#define FOLLY_MAYBE_UNUSED [[maybe_unused]]
+#elif FOLLY_HAS_ATTRIBUTE(__unused__) || __GNUC__
+#define FOLLY_MAYBE_UNUSED __attribute__((__unused__))
+#else
+#define FOLLY_MAYBE_UNUSED
+#endif
+
 /**
  * Nullable indicates that a return value or a parameter may be a `nullptr`,
  * e.g.
  */
 #if FOLLY_HAS_EXTENSION(nullability)
 #define FOLLY_NULLABLE _Nullable
+#define FOLLY_NONNULL _Nonnull
 #else
 #define FOLLY_NULLABLE
+#define FOLLY_NONNULL
 #endif
 
-#endif /* FOLLY_BASE_ATTRIBUTES_H_ */
+/**
+ * "Cold" indicates to the compiler that a function is only expected to be
+ * called from unlikely code paths. It can affect decisions made by the
+ * optimizer both when processing the function body and when analyzing
+ * call-sites.
+ */
+#if __GNUC__
+#define FOLLY_COLD __attribute__((__cold__))
+#else
+#define FOLLY_COLD
+#endif