mirror of
https://github.com/shadow-maint/shadow.git
synced 2024-11-23 10:06:31 +08:00
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:
parent
2457fc7c6b
commit
500ec3f8f3
@ -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
46
lib/typetraits.h
Normal 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
|
Loading…
Reference in New Issue
Block a user