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>
This commit is contained in:
Alejandro Colomar 2023-12-02 00:16:49 +01:00
parent 2457fc7c6b
commit 500ec3f8f3
2 changed files with 47 additions and 0 deletions

View File

@ -164,6 +164,7 @@ libshadow_la_SOURCES = \
time/day_to_str.c \
time/day_to_str.h \
ttytype.c \
typetraits.h \
tz.c \
ulimit.c \
user_busy.c \

46
lib/typetraits.h Normal file
View File

@ -0,0 +1,46 @@
// 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