From: Alejandro Colomar Date: Fri, 1 Dec 2023 23:16:49 +0000 (+0100) Subject: lib/typetraits.h: Add macros that give information about a type X-Git-Tag: 4.17.0-rc1~222 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=500ec3f8f33983c517bba007857b2533f6d2e47b;p=thirdparty%2Fshadow.git 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 --- diff --git a/lib/Makefile.am b/lib/Makefile.am index adcd9fbf9..b5f601a6b 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -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 \ diff --git a/lib/typetraits.h b/lib/typetraits.h new file mode 100644 index 000000000..47bd30d94 --- /dev/null +++ b/lib/typetraits.h @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2022-2024, Alejandro Colomar +// SPDX-License-Identifier: BSD-3-Clause + + +#ifndef SHADOW_INCLUDE_LIB_TYPETRAITS_H_ +#define SHADOW_INCLUDE_LIB_TYPETRAITS_H_ + + +#include + +#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