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>
time/day_to_str.c \
time/day_to_str.h \
ttytype.c \
+ typetraits.h \
tz.c \
ulimit.c \
user_busy.c \
--- /dev/null
+// 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