/* See the end of this file for copyright and license terms. */ #pragma once #include /** * @brief Get the number of elements in a statically allocated array. * * @param a The array * @returns The number of elements */ #define ARRAY_SIZE(a) ( sizeof(a) / sizeof(a[0]) ) #define abs(x) ({ \ typeof(x) __x = (x); \ __x < 0 ? -__x : __x; \ }) #define max(a, b) ({ \ typeof(a) __a = (a); \ typeof(b) __b = (b); \ __a > __b ? __a : __b; \ }) #define min(a, b) ({ \ typeof(a) __a = (a); \ typeof(b) __b = (b); \ __a < __b ? __a : __b; \ }) /** * @brief Cast a pointer to a struct member out to the containing structure. * * @param ptr Pointer to the struct member * @param type Type of the containing structure * @param member Name of the member within the containing structure * @returns Pointer to the containing structure */ #define container_of(ptr, type, member) \ ((type *)( (void *)(ptr) - offsetof(type, member) )) /** * @brief Do an evil raw cast. * * @param type Type to cast to * @param expr Expression to cast * @returns The raw value of `expr`, cast to `type` */ #define raw_cast(type, expr) ({ \ typeof(expr) __expr = (expr); \ *(type *)&__expr; \ }) /** * @brief Align `ptr` such that `ptr % n == 0`. * * @param ptr Pointer to align * @param log The log2 of the alignment. If negative, the pointer will be * aligned to the next lower address, otherwise to the next higher one. * @returns The aligned pointer */ void *ptr_align(void *ptr, int log); /* * This file is part of GayBSD. * Copyright (c) 2021 fef . * * GayBSD is nonviolent software: you may only use, redistribute, and/or * modify it under the terms of the Cooperative Nonviolent Public License * (CNPL) as found in the LICENSE file in the source code root directory * or at ; either version 7 * of the license, or (at your option) any later version. * * GayBSD comes with ABSOLUTELY NO WARRANTY, to the extent * permitted by applicable law. See the CNPL for details. */