| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_UTILS_H_ |
| #define SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_UTILS_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // Return static array size as const value. |
| #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) |
| |
| // Function attribute to use to indicate that a function never returns. |
| // To be placed at the end of function *declarations* only. |
| // |
| #if defined(__GCC__) || defined(__clang__) |
| #define FUNC_ATTRIBUTE_NORETURN __attribute__((noreturn)) |
| #else |
| #define FUNC_ATTRIBUTE_NORETURN /* nothing */ |
| #endif |
| |
| // Do not call these directly, see ASSERT, ASSERT_MSG, etc below. |
| extern void |
| assert_panic_(const char * file, int line, const char * fmt, ...) FUNC_ATTRIBUTE_NORETURN; |
| |
| // Panic immediately with a trivial error message if |condition| is not true. |
| // Use ASSERT_MSG() if you want to provide your own message instead. |
| #define ASSERT(condition) \ |
| do \ |
| { \ |
| if (!(condition)) \ |
| assert_panic_(__FILE__, __LINE__, #condition); \ |
| } \ |
| while (0) |
| |
| // Panic immediately if |condition| is not true, passing a formatted message |
| // in this case. |
| #define ASSERT_MSG(condition, ...) \ |
| do \ |
| { \ |
| if (!(condition)) \ |
| assert_panic_(__FILE__, __LINE__, __VA_ARGS__); \ |
| } \ |
| while (0) |
| |
| // Use UNUSED(variable) to notify the compiler that |variable| is not used. |
| // Useful when implementation callback functions, as in: |
| // |
| // void my_callback(foo_t * foo_param) { |
| // // Do nothing |
| // UNUSED(foo_param); |
| // } |
| // |
| #define UNUSED(variable) (void)(variable) |
| |
| // Force macro expansion of an expression, This is useful because using |
| // # or ## within the expression usually prevents macro expansion. |
| // Usage is: |
| // #define foo 10 |
| // #define bar 20 |
| // #define CALL1 CALL(foo ## bar) // expands to CALL(foobar) |
| // #define CALL2 CALL(MACRO_EXPAND(foo ## bar)) // expands to CALL(1020) |
| // |
| #define MACRO_EXPAND(x) MACRO_EXPAND_(x) |
| #define MACRO_EXPAND_(x) x |
| |
| // Force macro stringificaton of an expression, even if it uses # or ## |
| #define MACRO_STRING(x) MACRO_STRING_(x) |
| #define MACRO_STRING_(x) #x |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif // SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_UTILS_H_ |