csnip  0.1
limits.h
Go to the documentation of this file.
1 #ifndef CSNIP_LIMITS_H
2 #define CSNIP_LIMITS_H
3 
17 #include <limits.h>
18 #include <stddef.h>
19 
33 #define csnip_limit_Int(x) \
34  _Generic((x), \
35  csnip__tmm(signed char, SCHAR_MIN, SCHAR_MAX), \
36  csnip__tmm(unsigned char, 0, UCHAR_MAX), \
37  csnip__tmm(char, CHAR_MIN, CHAR_MAX), \
38  csnip__tmm(short int, SHRT_MIN, SHRT_MAX), \
39  csnip__tmm(unsigned short int, 0, USHRT_MAX), \
40  csnip__tmm(int, INT_MIN, INT_MAX), \
41  csnip__tmm(unsigned int, 0, UINT_MAX), \
42  csnip__tmm(long, LONG_MIN, LONG_MAX), \
43  csnip__tmm(unsigned long, 0, ULONG_MAX), \
44  csnip__tmm(long long int, LLONG_MIN, LLONG_MAX), \
45  csnip__tmm(unsigned long long int, 0, ULLONG_MAX), \
46  default: csnip_limit_Int__1(x))
47 
61 #define csnip_limit_Mini(x) (csnip_limit_Int(x)[0])
62 
68 #define csnip_limit_Maxi(x) (csnip_limit_Int(x)[1])
69 
71 #define csnip__tmm(type, minv, maxv) type: (const type[]){ minv, maxv }
72 
73 // Intma for standard typedefs
74 #define csnip_limit_Int__1(x) \
75  _Generic((x), csnip__tmm(intptr_t, INTPTR_MIN, INTPTR_MAX), default: \
76  _Generic((x), csnip__tmm(uintptr_t, 0, UINTPTR_MAX), default: \
77  _Generic((x), csnip__tmm(intmax_t, INTMAX_MIN, INTMAX_MAX), default: \
78  _Generic((x), csnip__tmm(uintmax_t, 0, UINTMAX_MAX), default: \
79  _Generic((x), csnip__tmm(ptrdiff_t, PTRDIFF_MIN, PTRDIFF_MAX), default:\
80  _Generic((x), csnip__tmm(size_t, 0, SIZE_MAX), default: \
81  csnip_limit_Int__2(x) \
82  ))))))
83 
84 #ifdef INT8_MAX
85 # define csnip_limit_Int__2(x) \
86  _Generic((x), \
87  csnip__tmm(int8_t, INT8_MIN, INT8_MAX), \
88  csnip__tmm(uint8_t, 0, UINT8_MAX), \
89  default: csnip_limit_Int__3(x))
90 #else
91 # define csnip_limit_Int__2(x) csnip_limit_Int__3(x)
92 #endif
93 
94 #ifdef INT16_MAX
95 # define csnip_limit_Int__3(x) \
96  _Generic((x), \
97  csnip__tmm(int16_t, INT16_MIN, INT16_MAX), \
98  csnip__tmm(uint16_t, 0, UINT16_MAX), \
99  default: csnip_limit_Int__4(x))
100 #else
101 # define csnip_limit_Int__3(x) csnip_limit_Int__4(x)
102 #endif
103 
104 #ifdef INT32_MAX
105 # define csnip_limit_Int__4(x) \
106  _Generic((x), \
107  csnip__tmm(int32_t, INT32_MIN, INT32_MAX), \
108  csnip__tmm(uint32_t, 0, UINT32_MAX), \
109  default: csnip_limit_Int__5(x))
110 #else
111 # define csnip_limit_Int__4(x) csnip_limit_Int__5(x)
112 #endif
113 
114 #ifdef INT64_MAX
115 # define csnip_limit_Int__5(x) \
116  _Generic((x), \
117  csnip__tmm(int64_t, INT64_MIN, INT64_MAX), \
118  csnip__tmm(uint64_t, 0, UINT64_MAX), \
119  default: csnip_limit_Int__6(x))
120 #else
121 # define csnip_limit_Int__5(x) csnip_limit_Int__6(x)
122 #endif
123 
124 #ifdef INT_LEAST8_MAX
125 # define csnip_limit_Int__6(x) \
126  _Generic((x), \
127  csnip__tmm(int_least8_t, INT_LEAST8_MIN, INT_LEAST8_MAX), \
128  csnip__tmm(uint_least8_t, 0, UINT_LEAST8_MAX), \
129  default: csnip_limit_Int__7(x))
130 #else
131 # define csnip_limit_Int__6(x) csnip_limit_Int__7(x)
132 #endif
133 
134 #ifdef INT_LEAST16_MAX
135 # define csnip_limit_Int__7(x) \
136  _Generic((x), \
137  csnip__tmm(int_least16_t, INT_LEAST16_MIN, INT_LEAST16_MAX), \
138  csnip__tmm(uint_least16_t, 0, UINT_LEAST16_MAX), \
139  default: csnip_limit_Int__8(x))
140 #else
141 # define csnip_limit_Int__7(x) csnip_limit_Int__8(x)
142 #endif
143 
144 #ifdef INT_LEAST32_MAX
145 # define csnip_limit_Int__8(x) \
146  _Generic((x), \
147  csnip__tmm(int_least32_t, INT_LEAST32_MIN, INT_LEAST32_MAX), \
148  csnip__tmm(uint_least32_t, 0, UINT_LEAST32_MAX), \
149  default: csnip_limit_Int__9(x))
150 #else
151 # define csnip_limit_Int__8(x) csnip_limit_Int__9(x)
152 #endif
153 
154 #ifdef INT_LEAST64_MAX
155 # define csnip_limit_Int__9(x) \
156  _Generic((x), \
157  csnip__tmm(int_least64_t, INT_LEAST64_MIN, INT_LEAST64_MAX), \
158  csnip__tmm(uint_least64_t, 0, UINT_LEAST64_MAX), \
159  default: csnip_limit_Int__10(x))
160 #else
161 # define csnip_limit_Int__9(x) csnip_limit_Int__10(x)
162 #endif
163 
164 #ifdef INT_FAST8_MAX
165 # define csnip_limit_Int__10(x) \
166  _Generic((x), \
167  csnip__tmm(int_fast8_t, INT_FAST8_MIN, INT_FAST8_MAX), \
168  csnip__tmm(uint_fast8_t, 0, UINT_FAST8_MAX), \
169  default: csnip_limit_Int__11(x))
170 #else
171 # define csnip_limit_Int__10(x) csnip_limit_Int__11(x)
172 #endif
173 
174 #ifdef INT_FAST16_MAX
175 # define csnip_limit_Int__11(x) \
176  _Generic((x), \
177  csnip__tmm(int_fast16_t, INT_FAST16_MIN, INT_FAST16_MAX), \
178  csnip__tmm(uint_fast16_t, 0, UINT_FAST16_MAX), \
179  default: csnip_limit_Int__12(x))
180 #else
181 # define csnip_limit_Int__11(x) csnip_limit_Int__12(x)
182 #endif
183 
184 #ifdef INT_FAST32_MAX
185 # define csnip_limit_Int__12(x) \
186  _Generic((x), \
187  csnip__tmm(int_fast32_t, INT_FAST32_MIN, INT_FAST32_MAX), \
188  csnip__tmm(uint_fast32_t, 0, UINT_FAST32_MAX), \
189  default: csnip_limit_Int__13(x))
190 #else
191 # define csnip_limit_Int__12(x) csnip_limit_Int__13(x)
192 #endif
193 
194 #ifdef INT_FAST64_MAX
195 # define csnip_limit_Int__13(x) \
196  _Generic((x), \
197  csnip__tmm(int_fast64_t, INT_FAST64_MIN, INT_FAST64_MAX), \
198  csnip__tmm(uint_fast64_t, 0, UINT_FAST64_MAX), \
199  default: csnip_limit_Int__14(x))
200 #else
201 # define csnip_limit_Int__13(x) csnip_limit_Int__14(x)
202 #endif
203 
204 #ifdef WCHAR_MAX
205 # define csnip_limit_Int__14(x) \
206  _Generic((x), csnip__tmm(wchar_t, WCHAR_MIN, WCHAR_MAX), \
207  default: csnip_limit_Int__15(x))
208 #else
209 # define csnip_limit_Int__14(x) csnip_limit_Int__15(x)
210 #endif
211 
212 #ifdef WEOF
213 #define csnip_limit_Int__15(x) \
214  _Generic((x), csnip__tmm(wint_t, WINT_MIN, WINT_MAX), \
215  default: csnip_limit_Int__16(x))
216 #else
217 # define csnip_limit_Int__15(x) csnip_limit_Int__16(x)
218 #endif
219 
220 #ifdef SIG_DFL
221 # define csnip_limit_Int__16(x) \
222  _Generic((x), csnip__tmm(sig_atomic_t, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX),\
223  default: 0 )
224 #else
225 # define csnip_limit_Int__16(x) 0
226 #endif
231 #endif /* CSNIP_LIMITS_H */
232 
233 #if defined(CSNIP_SHORT_NAMES) && !defined(CSNIP_LIMITS_HAVE_SHORT_NAMES)
234 #define limit_Int csnip_limit_Int
235 #define limit_Mini csnip_limit_Mini
236 #define limit_Maxi csnip_limit_Maxi
237 #define CSNIP_LIMITS_HAVE_SHORT_NAMES
238 #endif