summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2018-04-27 20:23:54 +0200
committerStanislaw Halik <sthalik@misaki.pl>2018-04-27 20:26:17 +0200
commiteb7f23d1c95c4f435a6bc808bbef9e05c551b8eb (patch)
treeba809d40da97b0ac245f026b85b2dfabb13df158 /compat
parente36b3c4919a703b20838fa3c23456326b9d84b72 (diff)
compat/macros: add static_warning macro
Diffstat (limited to 'compat')
-rw-r--r--compat/macros.hpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/compat/macros.hpp b/compat/macros.hpp
index b0c7a51d..c0bc66f4 100644
--- a/compat/macros.hpp
+++ b/compat/macros.hpp
@@ -47,5 +47,43 @@
#endif
#if defined __cplusplus
+
+// from now only C++ macros
+
# define thunk(...) ([&]() { __VA_ARGS__; })
+
+#if defined _MSC_VER
+# define OTR_DEPRECATE(msg, decl, body) __declspec(deprecated(msg)) decl body
+#else
+# define OTR_DEPRECATE(msg, decl, body) decl body __attribute__((deprecated(msg)))
+#endif
+
+#if !defined PP_CAT
+# define PP_CAT(x,y) PP_CAT1(x,y)
+# define PP_CAT1(x,y) x##y
+#endif
+
+namespace static_warning_detail {
+ template<bool> struct test___132;
+
+ template<>
+ struct test___132<true>
+ {
+ static constexpr inline void check() {}
+ };
+} // ns static_warning_detail
+
+#define static_warning_template(cond, msg) \
+ { \
+ template<bool> \
+ struct ::static_warning_detail::test___132 \
+ { \
+ OTR_DEPRECATE(msg, static constexpr inline void check(), {}) \
+ }; \
+ ::static_warning_detail::test___132<(cond)>::check(); \
+ }
+
+#define static_warning(cond, msg) \
+ static_warning_template(cond, PP_CAT(msg, PP_CAT("\nExpression: ", #cond)))
+
#endif