blob: efd5993bd5a89ffd6e15e41fc29deec6f844fbb8 [file] [log] [blame]
// 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_