// @author: Andrei Alexandrescu
-#ifndef FOLLY_PREPROCESSOR_
-#define FOLLY_PREPROCESSOR_
+#pragma once
/**
* Necessarily evil preprocessor-related amenities.
#define FB_THIRD(a, b, ...) __VA_ARGS__
#endif
+// MSVC's preprocessor is a pain, so we have to
+// forcefully expand the VA args in some places.
+#define FB_VA_GLUE(a, b) a b
+
/**
* Helper macro that extracts the first argument out of a list of any
* number of arguments.
* number of arguments. If only one argument is given, it returns
* that.
*/
+#ifdef _MSC_VER
+// GCC refuses to expand this correctly if this macro itself was
+// called with FB_VA_GLUE :(
+#define FB_ARG_2_OR_1(...) \
+ FB_VA_GLUE(FB_ARG_2_OR_1_IMPL, (__VA_ARGS__, __VA_ARGS__))
+#else
#define FB_ARG_2_OR_1(...) FB_ARG_2_OR_1_IMPL(__VA_ARGS__, __VA_ARGS__)
+#endif
// Support macro for the above
#define FB_ARG_2_OR_1_IMPL(a, b, ...) b
*/
#define FB_SINGLE_ARG(...) __VA_ARGS__
+/**
+ * Helper macro that just ignores its parameters.
+ */
+#define FOLLY_IGNORE(...)
+
+/**
+ * Helper macro that just ignores its parameters and inserts a semicolon.
+ */
+#define FOLLY_SEMICOLON(...) ;
+
/**
* FB_ANONYMOUS_VARIABLE(str) introduces an identifier starting with
* str and ending with a number that varies with the line.
* another macro expansion.
*/
#define FB_STRINGIZE(x) #x
-
-#endif // FOLLY_PREPROCESSOR_