kern/include/gay/util.h

77 lines
2 KiB
C

/* See the end of this file for copyright and license terms. */
#pragma once
#include <gay/cdefs.h>
/**
* @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 <owo@fef.moe>.
*
* 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 <https://git.pixie.town/thufie/npl-builder>; 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.
*/