| // 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_COMMON_MACROS_H_ |
| #define SRC_GRAPHICS_LIB_COMPUTE_COMMON_MACROS_H_ |
| |
| // |
| // |
| // |
| |
| #include <assert.h> |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <stdlib.h> |
| |
| // |
| // clang-format off |
| // |
| |
| #define ARRAY_LENGTH_MACRO(x_) (sizeof(x_)/sizeof(x_[0])) |
| #define OFFSETOF_MACRO(t_,m_) offsetof(t_,m_) |
| #define MEMBER_SIZE_MACRO(t_,m_) sizeof(((t_*)0)->m_) |
| |
| // |
| // FIXME(allanmac): |
| // |
| // Consider providing typed min/max() functions: |
| // |
| // <type> [min|max]_<type>(a,b) { ; } |
| // |
| // But note we still need preprocessor-time min/max(). |
| // |
| |
| #define MAX_MACRO(t_,a_,b_) (((a_) > (b_)) ? (a_) : (b_)) |
| #define MIN_MACRO(t_,a_,b_) (((a_) < (b_)) ? (a_) : (b_)) |
| |
| // |
| // |
| // |
| |
| #define BITS_TO_MASK_MACRO(n_) (((uint32_t)1<<(n_))-1) |
| #define BITS_TO_MASK_64_MACRO(n_) (((uint64_t)1<<(n_))-1) |
| |
| #define BITS_TO_MASK_AT_MACRO(n_,b_) (BITS_TO_MASK_MACRO(n_) <<(b_)) |
| #define BITS_TO_MASK_AT_64_MACRO(n_,b_) (BITS_TO_MASK_64_MACRO(n_)<<(b_)) |
| |
| // |
| // |
| // |
| |
| #define STRINGIFY_MACRO_2(a_) #a_ |
| #define STRINGIFY_MACRO(a_) STRINGIFY_MACRO_2(a_) |
| |
| // |
| // |
| // |
| |
| #define CONCAT_MACRO_2(a_,b_) a_ ## b_ |
| #define CONCAT_MACRO(a_,b_) CONCAT_MACRO_2(a_,b_) |
| |
| // |
| // Round up/down |
| // |
| |
| #define ROUND_DOWN_MACRO(v_,q_) (((v_) / (q_)) * (q_)) |
| #define ROUND_UP_MACRO(v_,q_) ((((v_) + (q_) - 1) / (q_)) * (q_)) |
| |
| // |
| // Round up/down when q is a power-of-two. |
| // |
| |
| #define ROUND_DOWN_POW2_MACRO(v_,q_) ((v_) & ~((q_) - 1)) |
| #define ROUND_UP_POW2_MACRO(v_,q_) ROUND_DOWN_POW2_MACRO((v_) + (q_) - 1, q_) |
| |
| // |
| // |
| // |
| |
| #if defined (_MSC_VER) && !defined (__clang__) |
| #define STATIC_ASSERT_MACRO(c_,m_) static_assert(c_,m_) |
| #else |
| #define STATIC_ASSERT_MACRO(c_,m_) _Static_assert(c_,m_) |
| #endif |
| |
| #define STATIC_ASSERT_MACRO_1(c_) STATIC_ASSERT_MACRO(c_,#c_) |
| |
| // |
| // |
| // |
| |
| #if defined (_MSC_VER) && !defined (__clang__) |
| #define POPCOUNT_MACRO(...) __popcnt(__VA_ARGS__) |
| #else |
| #define POPCOUNT_MACRO(...) __builtin_popcount(__VA_ARGS__) |
| #endif |
| |
| // |
| // |
| // |
| |
| #if defined (_MSC_VER) && !defined (__clang__) |
| #define ALIGN_MACRO(bytes_) __declspec(align(bytes_)) // only accepts integer as arg |
| #else |
| #include <stdalign.h> |
| #define ALIGN_MACRO(bytes_) alignas(bytes_) |
| #endif |
| |
| // |
| // Provide an opportunity to override malloc() and calloc() |
| // |
| #ifndef MALLOC_MACRO |
| #ifndef NDEBUG |
| #include "common/util.h" |
| #define MALLOC_MACRO(size_) malloc_assert(size_) |
| #else |
| #define MALLOC_MACRO(size_) malloc(size_) |
| #endif |
| #endif |
| |
| #ifndef CALLOC_MACRO |
| #ifndef NDEBUG |
| #include "common/util.h" |
| #define CALLOC_MACRO(num_, size_) calloc_assert(num_, size_) |
| #else |
| #define CALLOC_MACRO(num_, size_) calloc(num_, size_) |
| #endif |
| #endif |
| |
| // |
| // clang-format on |
| // |
| |
| #endif // SRC_GRAPHICS_LIB_COMPUTE_COMMON_MACROS_H_ |