X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=include%2Flttng%2Fust-utils.h;h=e60cdbe3b1a490934945d2c74ae93f86a0934384;hb=f04f60a5f613b5a850dbe0ee4e983f21803db1ed;hp=cbd1f66adeef8cc530afbc8217942ef9a8c1352d;hpb=2fbda51c64f28b33b8febffc998af235e6fa9ea9;p=lttng-ust.git diff --git a/include/lttng/ust-utils.h b/include/lttng/ust-utils.h index cbd1f66a..e60cdbe3 100644 --- a/include/lttng/ust-utils.h +++ b/include/lttng/ust-utils.h @@ -58,15 +58,32 @@ __builtin_types_compatible_p(type, unsigned long long)) #endif +/** + * lttng_ust_is_pointer_type - check if type is a pointer + * + * Returns true if the type of @type is a pointer. + * + * Note: The C implementation of lttng_ust_is_pointer_type uses pointer + * arithmetic, which does not work on opaque pointer types. + */ +#if defined(__cplusplus) +#define lttng_ust_is_pointer_type(type) (std::is_pointer::value) +#else +/* The difference between two pointers is an integer. */ +#define lttng_ust_is_pointer_type(type) \ + (lttng_ust_is_integer_type(typeof(((type)1 - (type)1))) && !lttng_ust_is_integer_type(type)) +#endif + + /** * lttng_ust_field_array_element_type_is_supported - * * Adds a compilation assertion that array and sequence fields declared by the - * user are of an integral type. + * user are of an integral or pointer type. */ #define lttng_ust_field_array_element_type_is_supported(type, item) \ - lttng_ust_static_assert(lttng_ust_is_integer_type(type), \ - "Non-integer type `" #item "` not supported as element of LTTNG_UST_FIELD_ARRAY or LTTNG_UST_FIELD_SEQUENCE", \ + lttng_ust_static_assert(lttng_ust_is_integer_type(type) || lttng_ust_is_pointer_type(type), \ + "Non-integer, non-pointer type `" #item "` not supported as element of LTTNG_UST_FIELD_ARRAY or LTTNG_UST_FIELD_SEQUENCE", \ Non_integer_type__##item##__not_supported_as_element_of_LTTNG_UST_FIELD_ARRAY_or_LTTNG_UST_FIELD_SEQUENCE)