Files
shadow/lib/typetraits.h
Alejandro Colomar 500ec3f8f3 lib/typetraits.h: Add macros that give information about a type
In the case of is_unsigned() and is_signed(), the natural thing would be
to compare to 0:

	#define is_unsigned(x)  (((typeof(x)) -1) > 0)
	#define is_signed(x)    (((typeof(x)) -1) < 0)

However, that would trigger -Wtype-limits, so we compare against 1,
which silences that, and does the same job.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
2024-06-29 20:00:18 +02:00

47 lines
1.6 KiB
C

// SPDX-FileCopyrightText: 2022-2024, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef SHADOW_INCLUDE_LIB_TYPETRAITS_H_
#define SHADOW_INCLUDE_LIB_TYPETRAITS_H_
#include <config.h>
#include "sizeof.h"
#define is_unsigned(x) \
( \
(typeof(x)) -1 > 1 \
)
#define is_signed(x) \
( \
(typeof(x)) -1 < 1 \
)
#define stype_max(T) \
( \
(T) (((((T) 1 << (WIDTHOF(T) - 2)) - 1) << 1) + 1) \
)
#define utype_max(T) \
( \
(T) -1 \
)
#define type_max(T) \
( \
(T) (is_signed(T) ? stype_max(T) : utype_max(T)) \
)
#define type_min(T) \
( \
(T) ~type_max(T) \
)
#endif // include guard