compiler.h: Introduce caa_unqual_scalar_typeof
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 22 Jun 2023 13:58:39 +0000 (09:58 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 29 Jun 2023 18:21:45 +0000 (14:21 -0400)
Allow defining variables and cast with a typeof which removes the
volatile and const qualifiers.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ie2ea915a600a69cec3c2ff64209892bf0794cb70

include/urcu/compiler.h

index 34eb564bb77795e9e77d21983240c3327b3401d1..fb3c8f160dc580aa8ede55e1ad0fa525e5942ade 100644 (file)
                                + __GNUC_PATCHLEVEL__)
 #endif
 
+#ifdef __cplusplus
+#define caa_unqual_scalar_typeof(x)                                    \
+       std::remove_cv<std::remove_reference<decltype(x)>::type>::type
+#else
+#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.026562 seconds and 4 git commands to generate.