compiler.h: Introduce caa_unqual_scalar_typeof
[urcu.git] / include / urcu / compiler.h
index 157346763078a3ec1d73b7c65618ed1bd98b325f..827ec1fd6eee0d00d5e863f9268fa89b7ae2d59e 100644 (file)
 
 #include <stddef.h>    /* for offsetof */
 
+#if defined __cplusplus
+# include <type_traits>        /* for std::remove_cv */
+#endif
+
 #define caa_likely(x)  __builtin_expect(!!(x), 1)
 #define caa_unlikely(x)        __builtin_expect(!!(x), 0)
 
@@ -82,7 +86,7 @@
 #define __rcu
 
 #ifdef __cplusplus
-#define URCU_FORCE_CAST(type, arg)     (reinterpret_cast<type>(arg))
+#define URCU_FORCE_CAST(_type, arg)    (reinterpret_cast<std::remove_cv<_type>::type>(arg))
 #else
 #define URCU_FORCE_CAST(type, arg)     ((type) (arg))
 #endif
                                + __GNUC_PATCHLEVEL__)
 #endif
 
-#ifndef __cplusplus
-#define caa_c_transparent_union        __attribute__((__transparent_union__))
+#ifdef __cplusplus
+#define caa_unqual_scalar_typeof(x)                                    \
+       std::remove_cv<std::remove_reference<decltype(x)>::type>::type
 #else
-#define caa_c_transparent_union
+#define caa_scalar_type_to_expr(type)                                  \
+       unsigned type: (unsigned type)0,                                \
+       signed type: (signed type)0
+
+/*
+ * Use C11 _Generic to express unqualified type from expression. This removes
+ * volatile qualifier from expression type.
+ */
+#define caa_unqual_scalar_typeof(x)                                    \
+       __typeof__(                                                     \
+               _Generic((x),                                           \
+                       char: (char)0,                                  \
+                       caa_scalar_type_to_expr(char),                  \
+                       caa_scalar_type_to_expr(short),         \
+                       caa_scalar_type_to_expr(int),                   \
+                       caa_scalar_type_to_expr(long),                  \
+                       caa_scalar_type_to_expr(long long),             \
+                       default: (x)                                    \
+               )                                                       \
+       )
 #endif
 
 #endif /* _URCU_COMPILER_H */
This page took 0.038714 seconds and 4 git commands to generate.