/* * Copyright (c) 2011-2014, Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 * * Content copied out of from Zephyr v3.2.0. * Copyright and licensing retained. */ #ifndef BACNETSTACK_TEST_ZTEST_INCLUDE_ZEPHYR_SYS_UTIL_H_ #define BACNETSTACK_TEST_ZTEST_INCLUDE_ZEPHYR_SYS_UTIL_H_ /** @brief 0 if @p cond is true-ish; causes a compile error otherwise. */ #define ZERO_OR_COMPILE_ERROR(cond) ((int) sizeof(char[1 - 2 * !(cond)]) - 1) #if defined(__cplusplus) /* The built-in function used below for type checking in C is not * supported by GNU C++. */ #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) #else /* __cplusplus */ /** * @brief Zero if @p array has an array type, a compile error otherwise * * This macro is available only from C, not C++. */ #define IS_ARRAY(array) \ ZERO_OR_COMPILE_ERROR( \ !__builtin_types_compatible_p(__typeof__(array), \ __typeof__(&(array)[0]))) /** * @brief Number of elements in the given @p array * * In C++, due to language limitations, this will accept as @p array * any type that implements operator[]. The results may not be * particularly meaningful in this case. * * In C, passing a pointer as @p array causes a compile error. */ #define ARRAY_SIZE(array) \ ((size_t) (IS_ARRAY(array) + (sizeof(array) / sizeof((array)[0])))) #endif /* __cplusplus */ /** * @brief Get a pointer to a structure containing the element * * Example: * * struct foo { * int bar; * }; * * struct foo my_foo; * int *ptr = &my_foo.bar; * * struct foo *container = CONTAINER_OF(ptr, struct foo, bar); * * Above, @p container points at @p my_foo. * * @param ptr pointer to a structure element * @param type name of the type that @p ptr is an element of * @param field the name of the field within the struct @p ptr points to * @return a pointer to the structure that contains @p ptr */ #define CONTAINER_OF(ptr, type, field) \ ((type *)(((char *)(ptr)) - offsetof(type, field))) #ifndef MAX /** * @brief Obtain the maximum of two values. * * @note Arguments are evaluated twice. Use Z_MAX for a GCC-only, single * evaluation version * * @param a First value. * @param b Second value. * * @returns Maximum value of @p a and @p b. */ #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN /** * @brief Obtain the minimum of two values. * * @note Arguments are evaluated twice. Use Z_MIN for a GCC-only, single * evaluation version * * @param a First value. * @param b Second value. * * @returns Minimum value of @p a and @p b. */ #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #endif /* BACNETSTACK_TEST_ZTEST_INCLUDE_ZEPHYR_SYS_UTIL_H_ */