Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 08:48:40

0001 // Licensed under the MIT License.
0002 // Copyright David LeBlanc - dcl@dleblanc.net
0003 
0004 #if !defined SAFE_MATH_H
0005 #define SAFE_MATH_H
0006 
0007 #if defined SAFEINT_HPP
0008 #error use either the C++ SafeInt, or safe_math, not both
0009 #endif
0010 
0011 // C wants a prototype, if all warnings enabled
0012 // #if !defined SAFE_MATH_FAIL_DEFINED
0013 // static inline void safe_math_fail(const char* msg);
0014 // #endif
0015 
0016 #include "safe_math_impl.h"
0017 
0018 #ifdef __cplusplus
0019 extern "C"
0020 {
0021 #endif
0022 
0023 /*
0024     The following functions are defined in safe_math_impl.h:
0025 
0026     // All check_cast functions return 0 if safe, non-zero if unsafe
0027     // Casting test to int8
0028     int check_cast_int8_int32(int32_t in)
0029     int check_cast_int8_uint32(uint32_t in)
0030     int check_cast_int8_int64(int64_t in)
0031     int check_cast_int8_uint64(uint64_t in)
0032 
0033     // Casting to int64
0034     int check_cast_int16_int32(int32_t in)
0035     int check_cast_int16_uint32(uint32_t in)
0036     int check_cast_int16_int64(int64_t in)
0037     int check_cast_int16_uint64(uint64_t in)
0038 
0039     // Casting to int32
0040     int check_cast_int32_uint32(uint32_t in)
0041     int check_cast_int32_int64(int64_t in)
0042     int check_cast_int32_uint64(uint64_t in)
0043     int check_cast_int64_uint64(uint64_t in)
0044 
0045     // Casting to uint8
0046     int check_cast_uint8_int32(int32_t in)
0047     int check_cast_uint8_uint32(uint32_t in)
0048     int check_cast_uint8_int64(int64_t in)
0049     int check_cast_uint8_uint64(uint64_t in)
0050 
0051     // Casting to uint16
0052     int check_cast_uint16_int32(int32_t in)
0053     int check_cast_uint16_uint32(uint32_t in)
0054     int check_cast_uint16_int64(int64_t in)
0055     int check_cast_uint16_uint64(uint64_t in)
0056 
0057     // Casting to uint32
0058     int check_cast_uint32_int32(int32_t in)
0059     int check_cast_uint32_int64(int64_t in)
0060     int check_cast_uint32_uint64(uint64_t in)
0061 
0062     // Casting to uint64
0063     int check_cast_uint64_int64(int64_t in)
0064 
0065     // safe_cast functions all abort on failure
0066 
0067     // Casting to int8
0068     int8_t safe_cast_int8_int32(int32_t in)
0069     int8_t safe_cast_int8_uint32(uint32_t in)
0070     int8_t safe_cast_int8_int64(int64_t in)
0071     int8_t safe_cast_int8_uint64(uint64_t in)
0072 
0073     // Casting to int16
0074     int16_t safe_cast_int16_int32(int32_t in)
0075     int16_t safe_cast_int16_uint32(uint32_t in)
0076     int16_t safe_cast_int16_int64(int64_t in)
0077     int16_t safe_cast_int16_uint64(uint64_t in)
0078 
0079     // Casting to int32
0080     int32_t safe_cast_int32_uint32(uint32_t in)
0081     int32_t safe_cast_int32_int64(int64_t in)
0082     int32_t safe_cast_int32_uint64(uint64_t in)
0083 
0084     // Casting to int64
0085     int64_t safe_cast_int64_uint64(uint64_t in)
0086 
0087     // Casting to uint8
0088     uint8_t safe_cast_uint8_int32(int32_t in)
0089     uint8_t safe_cast_uint8_uint32(uint32_t in)
0090     uint8_t safe_cast_uint8_int64(int64_t in)
0091     uint8_t safe_cast_uint8_uint64(uint64_t in)
0092 
0093     // Casting to uint16
0094     uint16_t safe_cast_uint16_int32(int32_t in)
0095     uint16_t safe_cast_uint16_uint32(uint32_t in)
0096     uint16_t safe_cast_uint16_int64(int64_t in)
0097     uint16_t safe_cast_uint16_uint64(uint64_t in)
0098 
0099     // Casting to uint32
0100     uint32_t safe_cast_uint32_int32(int32_t in)
0101     uint32_t safe_cast_uint32_int64(int64_t in)
0102     uint32_t safe_cast_uint32_uint64(uint64_t in)
0103 
0104     // Casting to uint64
0105     uint64_t safe_cast_uint64_int64(int64_t in)
0106 
0107     // Only 32-bit or larger types are supported for 
0108     // addition, subtraction, multiplication and division
0109 
0110     // If smaller types are needed, either wrap the result
0111     // in a safe_cast, or pass the smaller type in as a
0112     // 32-bit type of the same signedness
0113 
0114     // Addition functions, all of these abort on failure
0115     // For all of the below, there are also non-aborting versions
0116     // that have the signature of:
0117     //
0118     // bool check_op_intXX_intYY(intXX a, intYY b, intXX* ret)
0119 
0120     int32_t safe_add_int32_int32(int32_t a, int32_t b)
0121     int32_t safe_add_int32_uint32(int32_t a, uint32_t b)
0122     int32_t safe_add_int32_int64(int32_t a, int64_t b)
0123     int32_t safe_add_int32_uint64(int32_t a, uint64_t b)
0124 
0125     uint32_t safe_add_uint32_int32(uint32_t a, int32_t b)
0126     uint32_t safe_add_uint32_uint32(uint32_t a, uint32_t b)
0127     uint32_t safe_add_uint32_int64(uint32_t a, int64_t b)
0128     uint32_t safe_add_uint32_uint64(uint32_t a, uint64_t b)
0129 
0130     int64_t safe_add_int64_int32(int64_t a, int32_t b)
0131     int64_t safe_add_int64_uint32(int64_t a, uint32_t b)
0132     int64_t safe_add_int64_int64(int64_t a, int64_t b)
0133     int64_t safe_add_int64_uint64(int64_t a, uint64_t b)
0134 
0135     uint64_t safe_add_uint64_int32(uint64_t a, int32_t b)
0136     uint64_t safe_add_uint64_uint32(uint64_t a, uint32_t b)
0137     uint64_t safe_add_uint64_int64(uint64_t a, int64_t b)
0138     uint64_t safe_add_uint64_uint64(uint64_t a, uint64_t b)
0139 
0140     // Multiplication
0141     int32_t safe_div_int32_int32(int32_t a, int32_t b)
0142     int32_t safe_div_int32_uint32(int32_t a, uint32_t b)
0143     int32_t safe_div_int32_int64(int32_t a, int64_t b)
0144     int32_t safe_div_int32_uint64(int32_t a, uint64_t b)
0145 
0146     uint32_t safe_div_uint32_int32(uint32_t a, int32_t b)
0147     uint32_t safe_div_uint32_uint32(uint32_t a, uint32_t b)
0148     uint32_t safe_div_uint32_int64(uint32_t a, int64_t b)
0149     uint32_t safe_div_uint32_uint64(uint32_t a, uint64_t b)
0150 
0151     int64_t safe_div_int64_int32(int64_t a, int32_t b)
0152     int64_t safe_div_int64_uint32(int64_t a, uint32_t b)
0153     int64_t safe_div_int64_int64(int64_t a, int64_t b)
0154     int64_t safe_div_int64_uint64(int64_t a, uint64_t b)
0155 
0156     uint64_t safe_div_uint64_int32(uint64_t a, int32_t b)
0157     uint64_t safe_div_uint64_uint32(uint64_t a, uint32_t b)
0158     uint64_t safe_div_uint64_int64(uint64_t a, int64_t b)
0159     uint64_t safe_div_uint64_uint64(uint64_t a, uint64_t b)
0160 
0161     // Division
0162     int32_t safe_div_int32_int32(int32_t a, int32_t b)
0163     int32_t safe_div_int32_uint32(int32_t a, uint32_t b)
0164     int32_t safe_div_int32_int64(int32_t a, int64_t b)
0165     int32_t safe_div_int32_uint64(int32_t a, uint64_t b)
0166 
0167     uint32_t safe_div_uint32_int32(uint32_t a, int32_t b)
0168     uint32_t safe_div_uint32_uint32(uint32_t a, uint32_t b)
0169     uint32_t safe_div_uint32_int64(uint32_t a, int64_t b)
0170     uint32_t safe_div_uint32_uint64(uint32_t a, uint64_t b)
0171 
0172     int64_t safe_div_int64_int32(int64_t a, int32_t b)
0173     int64_t safe_div_int64_uint32(int64_t a, uint32_t b)
0174     int64_t safe_div_int64_int64(int64_t a, int64_t b)
0175     int64_t safe_div_int64_uint64(int64_t a, uint64_t b)
0176 
0177     uint64_t safe_div_uint64_int32(uint64_t a, int32_t b)
0178     uint64_t safe_div_uint64_uint32(uint64_t a, uint32_t b)
0179     uint64_t safe_div_uint64_int64(uint64_t a, int64_t b)
0180     uint64_t safe_div_uint64_uint64(uint64_t a, uint64_t b)
0181 
0182     // Subtraction
0183     int32_t safe_sub_int32_int32(int32_t a, int32_t b)
0184     int32_t safe_sub_int32_uint32(int32_t a, uint32_t b)
0185     int32_t safe_sub_int32_int64(int32_t a, int64_t b)
0186     int32_t safe_sub_int32_uint64(int32_t a, uint64_t b)
0187 
0188     uint32_t safe_sub_uint32_int32(uint32_t a, int32_t b)
0189     uint32_t safe_sub_uint32_uint32(uint32_t a, uint32_t b)
0190     uint32_t safe_sub_uint32_int64(uint32_t a, int64_t b)
0191     uint32_t safe_sub_uint32_uint64(uint32_t a, uint64_t b)
0192 
0193     int64_t safe_sub_int64_int32(int64_t a, int32_t b)
0194     int64_t safe_sub_int64_uint32(int64_t a, uint32_t b)
0195     int64_t safe_sub_int64_int64(int64_t a, int64_t b)
0196     int64_t safe_sub_int64_uint64(int64_t a, uint64_t b)
0197 
0198     uint64_t safe_sub_uint64_int32(uint64_t a, int32_t b)
0199     uint64_t safe_sub_uint64_uint32(uint64_t a, uint32_t b)
0200     uint64_t safe_sub_uint64_int64(uint64_t a, int64_t b)
0201     uint64_t safe_sub_uint64_uint64(uint64_t a, uint64_t b)
0202 */
0203 
0204 // Do some sorting out of standard types and sizes
0205 
0206 #if CHAR_MIN != 0
0207 #define SAFE_MATH_SIGNED_CHAR 1
0208 #else
0209 #define SAFE_MATH_SIGNED_CHAR 0
0210 #endif
0211 
0212 #if LONG_MAX == LLONG_MAX
0213 #define SAFE_MATH_LONG 64
0214 #else
0215 #define SAFE_MATH_LONG 32
0216 #endif
0217 
0218 // Not going to support odd sizes of things
0219 extern char SAFE_MATH_CHECK_SHORT_IS_16[1 / ((sizeof(short)-2) ? 0 : 1)];
0220 extern char SAFE_MATH_CHECK_INT_IS_32[1 / ((sizeof(int) - 4) ? 0 : 1)];
0221 
0222 // In order to help keep people from making mistakes by 
0223 // incorrectly guessing which types match which of the intXX types,
0224 // make some functions.
0225 
0226 // Cast to char, char might be signed or unsigned
0227 #if SAFE_MATH_SIGNED_CHAR
0228 static inline char safe_cast_char_int(int in) { return safe_cast_int8_int32(in); }
0229 static inline char safe_cast_char_uint(unsigned int in) { return safe_cast_int8_uint32(in); }
0230 
0231 static inline int check_cast_char_int(int in) { return safe_cast_int8_int32(in); }
0232 static inline int check_cast_char_uint(unsigned int in) { return safe_cast_int8_uint32(in); }
0233 
0234 #if SAFE_MATH_LONG == 64
0235 static inline char safe_cast_char_long(long in) { return safe_cast_int8_int64(in); }
0236 static inline int check_cast_char_long(long in) { return check_cast_int8_int64(in); }
0237 #else
0238 static inline char safe_cast_char_long(long in) { return safe_cast_int8_int32(in); }
0239 static inline int check_cast_char_long(long in) { return check_cast_int8_int32(in); }
0240 #endif
0241 
0242 static inline char safe_cast_char_longlong(long long in) { return safe_cast_int8_int64(in); }
0243 static inline char safe_cast_char_ulonglong(unsigned long long in) { return safe_cast_int8_uint64(in); }
0244 
0245 static inline int check_cast_char_longlong(long long in) { return check_cast_int8_int64(in); }
0246 static inline int check_cast_char_ulonglong(unsigned long long in) { return check_cast_int8_uint64(in); }
0247 #else
0248 static inline char safe_cast_char_int(int in) { return safe_cast_uint8_int32(in); }
0249 static inline char safe_cast_char_uint(unsigned int in) { return safe_cast_uint8_uint32(in); }
0250 
0251 static inline int check_cast_char_int(int in) { return check_cast_uint8_int32(in); }
0252 static inline int check_cast_char_uint(unsigned int in) { return check_cast_uint8_uint32(in); }
0253 
0254 #if SAFE_MATH_LONG == 64
0255 static inline char safe_cast_char_long(long in) { return safe_cast_uint8_int64(in); }
0256 static inline int check_cast_char_long(long in) { return check_cast_uint8_int64(in); }
0257 #else
0258 static inline char safe_cast_char_long(long in) { return safe_cast_uint8_int32(in); }
0259 static inline int check_cast_char_long(long in) { return check_cast_uint8_int32(in); }
0260 #endif
0261 
0262 static inline char safe_cast_char_longlong(long long in) { return safe_cast_uint8_int64(in); }
0263 static inline char safe_cast_char_ulonglong(unsigned long long in) { return safe_cast_uint8_uint64(in); }
0264 
0265 static inline int check_cast_char_longlong(long long in) { return check_cast_uint8_int64(in); }
0266 static inline int check_cast_char_ulonglong(unsigned long long in) { return check_cast_uint8_uint64(in); }
0267 #endif
0268 
0269 // Signed char
0270 static inline signed char safe_cast_schar_int(int in) { return safe_cast_int8_int32(in); }
0271 static inline signed char safe_cast_schar_uint(unsigned int in) { return safe_cast_int8_uint32(in); }
0272 
0273 static inline int check_cast_schar_int(int in) { return check_cast_int8_int32(in); }
0274 static inline int check_cast_schar_uint(unsigned int in) { return check_cast_int8_uint32(in); }
0275 
0276 #if SAFE_MATH_LONG == 64
0277 static inline signed char safe_cast_schar_long(long in) { return safe_cast_int8_int64(in); }
0278 static inline int check_cast_schar_long(long in) { return check_cast_int8_int64(in); }
0279 #else
0280 static inline signed char safe_cast_schar_long(long in) { return safe_cast_int8_int32(in); }
0281 static inline int check_cast_schar_long(long in) { return check_cast_int8_int32(in); }
0282 #endif
0283 
0284 static inline signed char safe_cast_schar_longlong(long long in) { return safe_cast_int8_int64(in); }
0285 static inline signed char safe_cast_schar_ulonglong(unsigned long long in) { return safe_cast_int8_uint64(in); }
0286 
0287 static inline int check_cast_schar_longlong(long long in) { return check_cast_int8_int64(in); }
0288 static inline int check_cast_schar_ulonglong(unsigned long long in) { return check_cast_int8_uint64(in); }
0289 
0290 // Unsigned char
0291 static inline unsigned char safe_cast_uchar_int(int in) { return safe_cast_uint8_int32(in); }
0292 static inline unsigned char safe_cast_uchar_uint(unsigned int in) { return safe_cast_uint8_uint32(in); }
0293 
0294 static inline int check_cast_uchar_int(int in) { return check_cast_uint8_int32(in); }
0295 static inline int check_cast_uchar_uint(unsigned int in) { return check_cast_uint8_uint32(in); }
0296 
0297 #if SAFE_MATH_LONG == 64
0298 static inline unsigned char safe_cast_uchar_long(long in) { return safe_cast_uint8_int64(in); }
0299 static inline int check_cast_uchar_long(long in) { return check_cast_uint8_int64(in); }
0300 #else
0301 static inline unsigned char safe_cast_uchar_long(long in) { return safe_cast_uint8_int32(in); }
0302 static inline int check_cast_uchar_long(long in) { return check_cast_uint8_int32(in); }
0303 #endif
0304 
0305 static inline unsigned char safe_cast_uchar_longlong(long long in) { return safe_cast_uint8_int64(in); }
0306 static inline unsigned char safe_cast_uchar_ulonglong(unsigned long long in) { return safe_cast_uint8_uint64(in); }
0307 
0308 static inline int check_cast_uchar_longlong(long long in) { return check_cast_uint8_int64(in); }
0309 static inline int check_cast_uchar_ulonglong(unsigned long long in) { return check_cast_uint8_uint64(in); }
0310 
0311 // 16-bit signed casting
0312 static inline short safe_cast_short_int(int in) { return safe_cast_int16_int32(in); }
0313 static inline short safe_cast_short_uint(unsigned int in) { return safe_cast_int16_uint32(in); }
0314 
0315 static inline int check_cast_short_int(int in) { return check_cast_int16_int32(in); }
0316 static inline int check_cast_short_uint(unsigned int in) { return check_cast_int16_uint32(in); }
0317 #if SAFE_MATH_LONG == 64
0318 static inline short safe_cast_short_long(long in) { return safe_cast_int16_int64(in); }
0319 static inline int check_cast_short_long(long in) { return check_cast_int16_int64(in); }
0320 #else
0321 static inline short safe_cast_short_long(long in) { return safe_cast_int16_int32(in); }
0322 static inline int check_cast_short_long(long in) { return check_cast_int16_int32(in); }
0323 #endif
0324 
0325 static inline short safe_cast_short_longlong(long long in) { return safe_cast_int16_int64(in); }
0326 static inline short safe_cast_short_ulonglong(unsigned long long in) { return safe_cast_int16_uint64(in); }
0327 
0328 static inline int check_cast_short_longlong(long long in) { return check_cast_int16_int64(in); }
0329 static inline int check_cast_short_ulonglong(unsigned long long in) { return check_cast_int16_uint64(in); }
0330 
0331 // 16-bit unsigned casting
0332 static inline unsigned short safe_cast_ushort_int(int in) { return safe_cast_uint16_int32(in); }
0333 static inline unsigned short safe_cast_ushort_uint(unsigned int in) { return safe_cast_uint16_uint32(in); }
0334 
0335 static inline int check_cast_ushort_int(int in) { return check_cast_uint16_int32(in); }
0336 static inline int check_cast_ushort_uint(unsigned int in) { return check_cast_uint16_uint32(in); }
0337 #if SAFE_MATH_LONG == 64
0338 static inline unsigned short safe_cast_ushort_long(long in) { return safe_cast_uint16_int64(in); }
0339 static inline int check_cast_ushort_long(long in) { return check_cast_uint16_int64(in); }
0340 #else
0341 static inline unsigned short safe_cast_ushort_long(long in) { return safe_cast_uint16_int32(in); }
0342 static inline int check_cast_ushort_long(long in) { return check_cast_uint16_int32(in); }
0343 #endif
0344 
0345 static inline unsigned short safe_cast_ushort_longlong(long long in) { return safe_cast_uint16_int64(in); }
0346 static inline unsigned short safe_cast_ushort_ulonglong(unsigned long long in) { return safe_cast_uint16_uint64(in); }
0347 
0348 static inline int check_cast_ushort_longlong(long long in) { return check_cast_uint16_int64(in); }
0349 static inline int check_cast_ushort_ulonglong(unsigned long long in) { return check_cast_uint16_uint64(in); }
0350 
0351 // Cast to int
0352 static inline int safe_cast_int_uint(unsigned int in) { return safe_cast_int32_uint32(in); }
0353 static inline int check_cast_int_uint(unsigned int in) { return check_cast_int32_uint32(in); }
0354 
0355 #if SAFE_MATH_LONG == 64
0356 static inline int safe_cast_int_long(long in) { return safe_cast_int32_int64(in); }
0357 static inline int safe_cast_int_ulong(unsigned long in) { return safe_cast_int32_uint64(in); }
0358 
0359 static inline int check_cast_int_long(long in) { return check_cast_int32_int64(in); }
0360 static inline int check_cast_int_ulong(unsigned long in) { return check_cast_int32_uint64(in); }
0361 #else
0362 static inline int safe_cast_int_long(long in) { return in; }
0363 static inline int safe_cast_int_ulong(unsigned long in) { return safe_cast_int32_uint32(in); }
0364 
0365 static inline int check_cast_int_long(long in) { (void)in;  return 0; }
0366 static inline int check_cast_int_ulong(unsigned long in) { return check_cast_int32_uint32(in); }
0367 #endif
0368 
0369 static inline int safe_cast_int_longlong(long long in) { return safe_cast_int32_int64(in); }
0370 static inline int safe_cast_int_ulonglong(unsigned long long in) { return safe_cast_int32_uint64(in); }
0371 
0372 static inline int check_cast_int_longlong(long long in) { return check_cast_int32_int64(in); }
0373 static inline int check_cast_int_ulonglong(unsigned long long in) { return check_cast_int32_uint64(in); }
0374 
0375 // Cast to unsigned int
0376 static inline unsigned int safe_cast_uint_int(int in) { return safe_cast_uint32_int32(in); }
0377 static inline int check_cast_uint_int(int in) { return check_cast_uint32_int32(in); }
0378 #if SAFE_MATH_LONG == 64
0379 static inline unsigned int safe_cast_uint_long(long in) { return safe_cast_uint32_int64(in); }
0380 static inline unsigned int safe_cast_uint_ulong(unsigned long in) { return safe_cast_uint32_uint64(in); }
0381 
0382 static inline int check_cast_uint_long(long in) { return check_cast_uint32_int64(in); }
0383 static inline int check_cast_uint_ulong(unsigned long in) { return check_cast_uint32_uint64(in); }
0384 #else
0385 static inline unsigned int safe_cast_uint_long(long in) { return safe_cast_uint32_int32(in); }
0386 static inline unsigned int safe_cast_uint_ulong(unsigned long in) { return in; }
0387 
0388 static inline int check_cast_uint_long(long in) { return check_cast_uint32_int32(in); }
0389 static inline int check_cast_uint_ulong(unsigned long in) { (void)in; return 0; }
0390 #endif
0391 
0392 static inline unsigned int safe_cast_uint_longlong(long long in) { return safe_cast_uint32_int64(in); }
0393 static inline unsigned int safe_cast_uint_ulonglong(unsigned long long in) { return safe_cast_uint32_uint64(in); }
0394 
0395 static inline int check_cast_uint_longlong(long long in) { return check_cast_uint32_int64(in); }
0396 static inline int check_cast_uint_ulonglong(unsigned long long in) { return check_cast_uint32_uint64(in); }
0397 
0398 // Cast to long
0399 // Also have to keep parity in the case of different compilations
0400 // of the same code.
0401 #if SAFE_MATH_LONG == 64
0402 static inline long safe_cast_long_ulong(unsigned long in) { return safe_cast_int64_uint64(in); }
0403 static inline long safe_cast_long_longlong(long long in) { return in; }
0404 static inline long safe_cast_long_ulonglong(unsigned long long in) { return safe_cast_int64_uint64(in); }
0405 
0406 static inline int check_cast_long_ulong(unsigned long in) { return check_cast_int64_uint64(in); }
0407 static inline int check_cast_long_longlong(long long in) { (void)in; return 0; }
0408 static inline int check_cast_long_ulonglong(unsigned long long in) { return check_cast_int64_uint64(in); }
0409 
0410 static inline unsigned long safe_cast_ulong_long(long in) { return safe_cast_uint64_int64(in); }
0411 static inline unsigned long safe_cast_ulong_ulonglong(unsigned long long in) { return in; }
0412 static inline unsigned long safe_cast_ulong_longlong(long long in) { return safe_cast_uint64_int64(in); }
0413 
0414 static inline int check_cast_ulong_long(long in) { return check_cast_uint64_int64(in); }
0415 static inline int check_cast_ulong_ulonglong(unsigned long long in) { (void)in; return 0; }
0416 static inline int check_cast_ulong_longlong(long long in) { return check_cast_uint64_int64(in); }
0417 #else
0418 static inline long safe_cast_long_ulong(unsigned long in) { return safe_cast_int32_uint32(in); }
0419 static inline long safe_cast_long_longlong(long long in) { return safe_cast_int32_int64(in); }
0420 static inline long safe_cast_long_ulonglong(unsigned long long in) { return safe_cast_int32_uint64(in); }
0421 
0422 static inline int check_cast_long_ulong(unsigned long in) { return check_cast_int32_uint32(in); }
0423 static inline int check_cast_long_longlong(long long in) { return check_cast_int32_int64(in); }
0424 static inline int check_cast_long_ulonglong(unsigned long long in) { return check_cast_int32_uint64(in); }
0425 
0426 static inline unsigned long safe_cast_ulong_long(long in) { return safe_cast_uint32_int32(in); }
0427 static inline unsigned long safe_cast_ulong_ulonglong(unsigned long long in) { return safe_cast_uint32_uint64(in); }
0428 static inline unsigned long safe_cast_ulong_longlong(long long in) { return safe_cast_uint32_int64(in); }
0429 
0430 static inline int check_cast_ulong_long(long in) { return check_cast_uint32_int32(in); }
0431 static inline int check_cast_ulong_ulonglong(unsigned long long in) { return check_cast_uint32_uint64(in); }
0432 static inline int check_cast_ulong_longlong(long long in) { return check_cast_uint32_int64(in); }
0433 #endif
0434 
0435 // And long long
0436 static inline long long safe_cast_longlong_ulonglong(unsigned long long in) { return safe_cast_int64_uint64(in); }
0437 static inline unsigned long long safe_cast_ulonglong_longlong(long long in) { return safe_cast_uint64_int64(in); }
0438 
0439 static inline int check_cast_longlong_ulonglong(unsigned long long in) { return check_cast_int64_uint64(in); }
0440 static inline int check_cast_ulonglong_longlong(long long in) { return check_cast_uint64_int64(in); }
0441 
0442 // Addition
0443 static inline int safe_add_int_int(int a, int b) { return safe_add_int32_int32(a, b); }
0444 static inline int safe_add_int_uint(int a, unsigned int b) { return safe_add_int32_uint32(a, b); }
0445 static inline int safe_add_int_longlong(int a, long long b) { return safe_add_int32_int64(a, b); }
0446 static inline int safe_add_int_ulonglong(int a, unsigned long long b) { return safe_add_int32_uint64(a, b); }
0447 
0448 static inline bool check_add_int_int(int a, int b, int* ret) { return check_add_int32_int32(a, b, (int32_t*)ret); }
0449 static inline bool check_add_int_uint(int a, unsigned int b, int* ret) { return check_add_int32_uint32(a, b, (int32_t*)ret); }
0450 static inline bool check_add_int_longlong(int a, long long b, int* ret) { return check_add_int32_int64(a, b, (int32_t*)ret); }
0451 static inline bool check_add_int_ulonglong(int a, unsigned long long b, int* ret) { return check_add_int32_uint64(a, b, (int32_t*)ret); }
0452 
0453 static inline unsigned int safe_add_uint_int(unsigned int a, int b) { return safe_add_uint32_int32(a, b); }
0454 static inline unsigned int safe_add_uint_uint(unsigned int a, unsigned int b) { return safe_add_uint32_uint32(a, b); }
0455 static inline unsigned int safe_add_uint_longlong(unsigned int a, long long b) { return safe_add_uint32_int64(a, b); }
0456 static inline unsigned int safe_add_uint_ulonglong(unsigned int a, unsigned long long b) { return safe_add_uint32_uint64(a, b); }
0457 
0458 static inline bool check_add_uint_int(unsigned int a, int b, unsigned int* ret) { return check_add_uint32_int32(a, b, (uint32_t*)ret); }
0459 static inline bool check_add_uint_uint(unsigned int a, unsigned int b, unsigned int* ret) { return check_add_uint32_uint32(a, b, (uint32_t*)ret); }
0460 static inline bool check_add_uint_longlong(unsigned int a, long long b, unsigned int* ret) { return check_add_uint32_int64(a, b, (uint32_t*)ret); }
0461 static inline bool check_add_uint_ulonglong(unsigned int a, unsigned long long b, unsigned int* ret) { return check_add_uint32_uint64(a, b, (uint32_t*)ret); }
0462 
0463 #if SAFE_MATH_LONG == 64
0464 static inline int safe_add_int_long(int a, long b) { return safe_add_int32_int64(a, b); }
0465 static inline int safe_add_int_ulong(int a, unsigned long b) { return safe_add_int32_uint64(a, b); }
0466 
0467 static inline bool check_add_int_long(int a, long b, int* ret) { return check_add_int32_int64(a, b, (int32_t*)ret); }
0468 static inline bool check_add_int_ulong(int a, unsigned long b, int* ret) { return check_add_int32_uint64(a, b, (int32_t*)ret); }
0469 
0470 static inline unsigned int safe_add_uint_long(unsigned int a, long b) { return safe_add_uint32_int64(a, b); }
0471 static inline unsigned int safe_add_uint_ulong(unsigned int a, unsigned long b) { return safe_add_uint32_uint64(a, b); }
0472 
0473 static inline bool check_add_uint_long(unsigned int a, long b, unsigned int* ret) { return check_add_uint32_int64(a, b, (uint32_t*)ret); }
0474 static inline bool check_add_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_add_uint32_uint64(a, b, (uint32_t*)ret); }
0475 
0476 static inline long safe_add_long_int(long a, int b) { return safe_add_int64_int32(a, b); }
0477 static inline long safe_add_long_uint(long a, unsigned int b) { return safe_add_int64_uint32(a, b); }
0478 static inline long safe_add_long_long(long a, long b) { return safe_add_int64_int64(a, b); }
0479 static inline long safe_add_long_ulong(long a, unsigned long b) { return safe_add_int64_uint64(a, b); }
0480 static inline long safe_add_long_longlong(long a, long long b) { return safe_add_int64_int64(a, b); }
0481 static inline long safe_add_long_ulonglong(long a, unsigned long long b) { return safe_add_int64_uint64(a, b); }
0482 
0483 static inline bool check_add_long_int(long a, int b, long* ret) { return check_add_int64_int32(a, b, (int64_t*)ret); }
0484 static inline bool check_add_long_uint(long a, unsigned int b, long* ret) { return check_add_int64_uint32(a, b, (int64_t*)ret); }
0485 static inline bool check_add_long_long(long a, long b, long* ret) { return check_add_int64_int64(a, b, (int64_t*)ret); }
0486 static inline bool check_add_long_ulong(long a, unsigned long b, long* ret) { return check_add_int64_uint64(a, b, (int64_t*)ret); }
0487 static inline bool check_add_long_longlong(long a, long long b, long* ret) { return check_add_int64_int64(a, b, (int64_t*)ret); }
0488 static inline bool check_add_long_ulonglong(long a, unsigned long long b, long* ret) { return check_add_int64_uint64(a, b, (int64_t*)ret); }
0489 
0490 static inline unsigned long safe_add_ulong_int(unsigned long a, int b) { return safe_add_uint64_int32(a, b); }
0491 static inline unsigned long safe_add_ulong_uint(unsigned long a, unsigned int b) { return safe_add_uint64_uint32(a, b); }
0492 static inline unsigned long safe_add_ulong_long(unsigned long a, long b) { return safe_add_uint64_int64(a, b); }
0493 static inline unsigned long safe_add_ulong_ulong(unsigned long a, unsigned long b) { return safe_add_uint64_uint64(a, b); }
0494 static inline unsigned long safe_add_ulong_longlong(unsigned long a, long long b) { return safe_add_uint64_int64(a, b); }
0495 static inline unsigned long safe_add_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_add_uint64_uint64(a, b); }
0496 
0497 static inline bool check_add_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_add_uint64_int32(a, b, (uint64_t*)ret); }
0498 static inline bool check_add_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_add_uint64_uint32(a, b, (uint64_t*)ret); }
0499 static inline bool check_add_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_add_uint64_int64(a, b, (uint64_t*)ret); }
0500 static inline bool check_add_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_add_uint64_uint64(a, b, (uint64_t*)ret); }
0501 static inline bool check_add_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_add_uint64_int64(a, b, (uint64_t*)ret); }
0502 static inline bool check_add_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_add_uint64_uint64(a, b, (uint64_t*)ret); }
0503 
0504 static inline long long safe_add_longlong_long(long long a, long b) { return safe_add_int64_int64(a, b); }
0505 static inline long long safe_add_longlong_ulong(long long a, unsigned long b) { return safe_add_int64_uint64(a, b); }
0506 
0507 static inline bool check_add_longlong_long(long long a, long b, long long* ret) { return check_add_int64_int64(a, b, (int64_t*)ret); }
0508 static inline bool check_add_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_add_int64_uint64(a, b, (int64_t*)ret); }
0509 
0510 static inline unsigned long long safe_add_ulonglong_long(unsigned long long a, long b) { return safe_add_uint64_int64(a, b); }
0511 static inline unsigned long long safe_add_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_add_uint64_uint64(a, b); }
0512 
0513 static inline bool check_add_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_add_uint64_int64(a, b, (uint64_t*)ret); }
0514 static inline bool check_add_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_add_uint64_uint64(a, b, (uint64_t*)ret); }
0515 #else
0516 static inline int safe_add_int_long(int a, long b) { return safe_add_int32_int32(a, b); }
0517 static inline int safe_add_int_ulong(int a, unsigned long b) { return safe_add_int32_uint32(a, b); }
0518 
0519 static inline bool check_add_int_long(int a, long b, int* ret) { return check_add_int32_int32(a, b, (int32_t*)ret); }
0520 static inline bool check_add_int_ulong(int a, unsigned long b, int* ret) { return check_add_int32_uint32(a, b, (int32_t*)ret); }
0521 
0522 static inline unsigned int safe_add_uint_long(unsigned int a, long b) { return safe_add_uint32_int32(a, b); }
0523 static inline unsigned int safe_add_uint_ulong(unsigned int a, unsigned long b) { return safe_add_uint32_uint32(a, b); }
0524 
0525 static inline bool check_add_uint_long(unsigned int a, long b, unsigned int* ret) { return check_add_uint32_int32(a, b, (uint32_t*)ret); }
0526 static inline bool check_add_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_add_uint32_uint32(a, b, (uint32_t*)ret); }
0527 
0528 static inline long safe_add_long_int(long a, int b) { return safe_add_int32_int32(a, b); }
0529 static inline long safe_add_long_uint(long a, unsigned int b) { return safe_add_int32_uint32(a, b); }
0530 static inline long safe_add_long_long(long a, long b) { return safe_add_int32_int32(a, b); }
0531 static inline long safe_add_long_ulong(long a, unsigned long b) { return safe_add_int32_uint32(a, b); }
0532 static inline long safe_add_long_longlong(long a, long long b) { return safe_add_int32_int64(a, b); }
0533 static inline long safe_add_long_ulonglong(long a, unsigned long long b) { return safe_add_int32_uint64(a, b); }
0534 
0535 static inline bool check_add_long_int(long a, int b, long* ret) { return check_add_int32_int32(a, b, (int32_t*)ret); }
0536 static inline bool check_add_long_uint(long a, unsigned int b, long* ret) { return check_add_int32_uint32(a, b, (int32_t*)ret); }
0537 static inline bool check_add_long_long(long a, long b, long* ret) { return check_add_int32_int32(a, b, (int32_t*)ret); }
0538 static inline bool check_add_long_ulong(long a, unsigned long b, long* ret) { return check_add_int32_uint32(a, b, (int32_t*)ret); }
0539 static inline bool check_add_long_longlong(long a, long long b, long* ret) { return check_add_int32_int64(a, b, (int32_t*)ret); }
0540 static inline bool check_add_long_ulonglong(long a, unsigned long long b, long* ret) { return check_add_int32_uint64(a, b, (int32_t*)ret); }
0541 
0542 static inline unsigned long safe_add_ulong_int(unsigned long a, int b) { return safe_add_uint32_int32(a, b); }
0543 static inline unsigned long safe_add_ulong_uint(unsigned long a, unsigned int b) { return safe_add_uint32_uint32(a, b); }
0544 static inline unsigned long safe_add_ulong_long(unsigned long a, long b) { return safe_add_uint32_int32(a, b); }
0545 static inline unsigned long safe_add_ulong_ulong(unsigned long a, unsigned long b) { return safe_add_uint32_uint32(a, b); }
0546 static inline unsigned long safe_add_ulong_longlong(unsigned long a, long long b) { return safe_add_uint32_int64(a, b); }
0547 static inline unsigned long safe_add_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_add_uint32_uint64(a, b); }
0548 
0549 static inline bool check_add_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_add_uint32_int32(a, b, (uint32_t*)ret); }
0550 static inline bool check_add_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_add_uint32_uint32(a, b, (uint32_t*)ret); }
0551 static inline bool check_add_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_add_uint32_int32(a, b, (uint32_t*)ret); }
0552 static inline bool check_add_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_add_uint32_uint32(a, b, (uint32_t*)ret); }
0553 static inline bool check_add_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_add_uint32_int64(a, b, (uint32_t*)ret); }
0554 static inline bool check_add_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_add_uint32_uint64(a, b, (uint32_t*)ret); }
0555 
0556 static inline long long safe_add_longlong_long(long long a, long b) { return safe_add_int64_int32(a, b); }
0557 static inline long long safe_add_longlong_ulong(long long a, unsigned long b) { return safe_add_int64_uint32(a, b); }
0558 
0559 static inline bool check_add_longlong_long(long long a, long b, long long* ret) { return check_add_int64_int32(a, b, ret); }
0560 static inline bool check_add_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_add_int64_uint32(a, b, ret); }
0561 
0562 static inline unsigned long long safe_add_ulonglong_long(unsigned long long a, long b) { return safe_add_uint64_int32(a, b); }
0563 static inline unsigned long long safe_add_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_add_uint64_uint32(a, b); }
0564 
0565 static inline bool check_add_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_add_uint64_int32(a, b, ret); }
0566 static inline bool check_add_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_add_uint64_uint32(a, b, ret); }
0567 #endif
0568 
0569 static inline long long safe_add_longlong_int(long long a, int b) { return safe_add_int64_int32(a, b); }
0570 static inline long long safe_add_longlong_uint(long long a, unsigned int b) { return safe_add_int64_uint32(a, b); }
0571 static inline long long safe_add_longlong_longlong(long long a, long long b) { return safe_add_int64_int64(a, b); }
0572 static inline long long safe_add_longlong_ulonglong(long long a, unsigned long long b) { return safe_add_int64_uint64(a, b); }
0573 
0574 static inline bool check_add_longlong_int(long long a, int b, long long* ret) { return check_add_int64_int32(a, b, (int64_t*)ret); }
0575 static inline bool check_add_longlong_uint(long long a, unsigned int b, long long* ret) { return check_add_int64_uint32(a, b, (int64_t*)ret); }
0576 static inline bool check_add_longlong_longlong(long long a, long long b, long long* ret) { return check_add_int64_int64(a, b, (int64_t*)ret); }
0577 static inline bool check_add_longlong_ulonglong(long long a, unsigned long long b, long long* ret) { return check_add_int64_uint64(a, b, (int64_t*)ret); }
0578 
0579 static inline unsigned long long safe_add_ulonglong_int(unsigned long long a, int b) { return safe_add_uint64_int32(a, b); }
0580 static inline unsigned long long safe_add_ulonglong_uint(unsigned long long a, unsigned int b) { return safe_add_uint64_uint32(a, b); }
0581 static inline unsigned long long safe_add_ulonglong_longlong(unsigned long long a, long long b) { return safe_add_uint64_int64(a, b); }
0582 static inline unsigned long long safe_add_ulonglong_ulonglong(unsigned long long a, unsigned long long b) { return safe_add_uint64_uint64(a, b); }
0583 
0584 static inline bool check_add_ulonglong_int(unsigned long long a, int b, unsigned long long* ret) { return check_add_uint64_int32(a, b, (uint64_t*)ret); }
0585 static inline bool check_add_ulonglong_uint(unsigned long long a, unsigned int b, unsigned long long* ret) { return check_add_uint64_uint32(a, b, (uint64_t*)ret); }
0586 static inline bool check_add_ulonglong_longlong(unsigned long long a, long long b, unsigned long long* ret) { return check_add_uint64_int64(a, b, (uint64_t*)ret); }
0587 static inline bool check_add_ulonglong_ulonglong(unsigned long long a, unsigned long long b, unsigned long long* ret) { return check_add_uint64_uint64(a, b, (uint64_t*)ret); }
0588 
0589 // Multiplication
0590 static inline int safe_mul_int_int(int a, int b) { return safe_mul_int32_int32(a, b); }
0591 static inline int safe_mul_int_uint(int a, unsigned int b) { return safe_mul_int32_uint32(a, b); }
0592 static inline int safe_mul_int_longlong(int a, long long b) { return safe_mul_int32_int64(a, b); }
0593 static inline int safe_mul_int_ulonglong(int a, unsigned long long b) { return safe_mul_int32_uint64(a, b); }
0594 
0595 static inline bool check_mul_int_int(int a, int b, int* ret) { return check_mul_int32_int32(a, b, (int32_t*)ret); }
0596 static inline bool check_mul_int_uint(int a, unsigned int b, int* ret) { return check_mul_int32_uint32(a, b, (int32_t*)ret); }
0597 static inline bool check_mul_int_longlong(int a, long long b, int* ret) { return check_mul_int32_int64(a, b, (int32_t*)ret); }
0598 static inline bool check_mul_int_ulonglong(int a, unsigned long long b, int* ret) { return check_mul_int32_uint64(a, b, (int32_t*)ret); }
0599 
0600 static inline unsigned int safe_mul_uint_int(unsigned int a, int b) { return safe_mul_uint32_int32(a, b); }
0601 static inline unsigned int safe_mul_uint_uint(unsigned int a, unsigned int b) { return safe_mul_uint32_uint32(a, b); }
0602 static inline unsigned int safe_mul_uint_longlong(unsigned int a, long long b) { return safe_mul_uint32_int64(a, b); }
0603 static inline unsigned int safe_mul_uint_ulonglong(unsigned int a, unsigned long long b) { return safe_mul_uint32_uint64(a, b); }
0604 
0605 static inline bool check_mul_uint_int(unsigned int a, int b, unsigned int* ret) { return check_mul_uint32_int32(a, b, (uint32_t*)ret); }
0606 static inline bool check_mul_uint_uint(unsigned int a, unsigned int b, unsigned int* ret) { return check_mul_uint32_uint32(a, b, (uint32_t*)ret); }
0607 static inline bool check_mul_uint_longlong(unsigned int a, long long b, unsigned int* ret) { return check_mul_uint32_int64(a, b, (uint32_t*)ret); }
0608 static inline bool check_mul_uint_ulonglong(unsigned int a, unsigned long long b, unsigned int* ret) { return check_mul_uint32_uint64(a, b, (uint32_t*)ret); }
0609 
0610 #if SAFE_MATH_LONG == 64
0611 static inline int safe_mul_int_long(int a, long b) { return safe_mul_int32_int64(a, b); }
0612 static inline int safe_mul_int_ulong(int a, unsigned long b) { return safe_mul_int32_uint64(a, b); }
0613 
0614 static inline bool check_mul_int_long(int a, long b, int* ret) { return check_mul_int32_int64(a, b, (int32_t*)ret); }
0615 static inline bool check_mul_int_ulong(int a, unsigned long b, int* ret) { return check_mul_int32_uint64(a, b, (int32_t*)ret); }
0616 
0617 static inline unsigned int safe_mul_uint_long(unsigned int a, long b) { return safe_mul_uint32_int64(a, b); }
0618 static inline unsigned int safe_mul_uint_ulong(unsigned int a, unsigned long b) { return safe_mul_uint32_uint64(a, b); }
0619 
0620 static inline bool check_mul_uint_long(unsigned int a, long b, unsigned int* ret) { return check_mul_uint32_int64(a, b, (uint32_t*)ret); }
0621 static inline bool check_mul_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_mul_uint32_uint64(a, b, (uint32_t*)ret); }
0622 
0623 static inline long safe_mul_long_int(long a, int b) { return safe_mul_int64_int32(a, b); }
0624 static inline long safe_mul_long_uint(long a, unsigned int b) { return safe_mul_int64_uint32(a, b); }
0625 static inline long safe_mul_long_long(long a, long b) { return safe_mul_int64_int64(a, b); }
0626 static inline long safe_mul_long_ulong(long a, unsigned long b) { return safe_mul_int64_uint64(a, b); }
0627 static inline long safe_mul_long_longlong(long a, long long b) { return safe_mul_int64_int64(a, b); }
0628 static inline long safe_mul_long_ulonglong(long a, unsigned long long b) { return safe_mul_int64_uint64(a, b); }
0629 
0630 static inline bool check_mul_long_int(long a, int b, long* ret) { return check_mul_int64_int32(a, b, (int64_t*)ret); }
0631 static inline bool check_mul_long_uint(long a, unsigned int b, long* ret) { return check_mul_int64_uint32(a, b, (int64_t*)ret); }
0632 static inline bool check_mul_long_long(long a, long b, long* ret) { return check_mul_int64_int64(a, b, (int64_t*)ret); }
0633 static inline bool check_mul_long_ulong(long a, unsigned long b, long* ret) { return check_mul_int64_uint64(a, b, (int64_t*)ret); }
0634 static inline bool check_mul_long_longlong(long a, long long b, long* ret) { return check_mul_int64_int64(a, b, (int64_t*)ret); }
0635 static inline bool check_mul_long_ulonglong(long a, unsigned long long b, long* ret) { return check_mul_int64_uint64(a, b, (int64_t*)ret); }
0636 
0637 static inline unsigned long safe_mul_ulong_int(unsigned long a, int b) { return safe_mul_uint64_int32(a, b); }
0638 static inline unsigned long safe_mul_ulong_uint(unsigned long a, unsigned int b) { return safe_mul_uint64_uint32(a, b); }
0639 static inline unsigned long safe_mul_ulong_long(unsigned long a, long b) { return safe_mul_uint64_int64(a, b); }
0640 static inline unsigned long safe_mul_ulong_ulong(unsigned long a, unsigned long b) { return safe_mul_uint64_uint64(a, b); }
0641 static inline unsigned long safe_mul_ulong_longlong(unsigned long a, long long b) { return safe_mul_uint64_int64(a, b); }
0642 static inline unsigned long safe_mul_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_mul_uint64_uint64(a, b); }
0643 
0644 static inline bool check_mul_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_mul_uint64_int32(a, b, (uint64_t*)ret); }
0645 static inline bool check_mul_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_mul_uint64_uint32(a, b, (uint64_t*)ret); }
0646 static inline bool check_mul_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_mul_uint64_int64(a, b, (uint64_t*)ret); }
0647 static inline bool check_mul_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_mul_uint64_uint64(a, b, (uint64_t*)ret); }
0648 static inline bool check_mul_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_mul_uint64_int64(a, b, (uint64_t*)ret); }
0649 static inline bool check_mul_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_mul_uint64_uint64(a, b,(uint64_t*)ret); }
0650 
0651 static inline long long safe_mul_longlong_long(long long a, long b) { return safe_mul_int64_int64(a, b); }
0652 static inline long long safe_mul_longlong_ulong(long long a, unsigned long b) { return safe_mul_int64_uint64(a, b); }
0653 
0654 static inline bool check_mul_longlong_long(long long a, long b, long long* ret) { return check_mul_int64_int64(a, b, (int64_t*)ret); }
0655 static inline bool check_mul_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_mul_int64_uint64(a, b, (int64_t*)ret); }
0656 
0657 static inline unsigned long long safe_mul_ulonglong_long(unsigned long long a, long b) { return safe_mul_uint64_int64(a, b); }
0658 static inline unsigned long long safe_mul_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_mul_uint64_uint64(a, b); }
0659 
0660 static inline bool check_mul_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_mul_uint64_int64(a, b, (uint64_t*)ret); }
0661 static inline bool check_mul_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_mul_uint64_uint64(a, b, (uint64_t*)ret); }
0662 #else
0663 static inline int safe_mul_int_long(int a, long b) { return safe_mul_int32_int32(a, b); }
0664 static inline int safe_mul_int_ulong(int a, unsigned long b) { return safe_mul_int32_uint32(a, b); }
0665 
0666 static inline bool check_mul_int_long(int a, long b, int* ret) { return check_mul_int32_int32(a, b, (int32_t*)ret); }
0667 static inline bool check_mul_int_ulong(int a, unsigned long b, int* ret) { return check_mul_int32_uint32(a, b, (int32_t*)ret); }
0668 
0669 static inline unsigned int safe_mul_uint_long(unsigned int a, long b) { return safe_mul_uint32_int32(a, b); }
0670 static inline unsigned int safe_mul_uint_ulong(unsigned int a, unsigned long b) { return safe_mul_uint32_uint32(a, b); }
0671 
0672 static inline bool check_mul_uint_long(unsigned int a, long b, unsigned int* ret) { return check_mul_uint32_int32(a, b, (uint32_t*)ret); }
0673 static inline bool check_mul_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_mul_uint32_uint32(a, b, (uint32_t*)ret); }
0674 
0675 static inline long safe_mul_long_int(long a, int b) { return safe_mul_int32_int32(a, b); }
0676 static inline long safe_mul_long_uint(long a, unsigned int b) { return safe_mul_int32_uint32(a, b); }
0677 static inline long safe_mul_long_long(long a, long b) { return safe_mul_int32_int32(a, b); }
0678 static inline long safe_mul_long_ulong(long a, unsigned long b) { return safe_mul_int32_uint32(a, b); }
0679 static inline long safe_mul_long_longlong(long a, long long b) { return safe_mul_int32_int64(a, b); }
0680 static inline long safe_mul_long_ulonglong(long a, unsigned long long b) { return safe_mul_int32_uint64(a, b); }
0681 
0682 static inline bool check_mul_long_int(long a, int b, long* ret) { return check_mul_int32_int32(a, b, (int32_t*)ret); }
0683 static inline bool check_mul_long_uint(long a, unsigned int b, long* ret) { return check_mul_int32_uint32(a, b, (int32_t*)ret); }
0684 static inline bool check_mul_long_long(long a, long b, long* ret) { return check_mul_int32_int32(a, b, (int32_t*)ret); }
0685 static inline bool check_mul_long_ulong(long a, unsigned long b, long* ret) { return check_mul_int32_uint32(a, b, (int32_t*)ret); }
0686 static inline bool check_mul_long_longlong(long a, long long b, long* ret) { return check_mul_int32_int64(a, b, (int32_t*)ret); }
0687 static inline bool check_mul_long_ulonglong(long a, unsigned long long b, long* ret) { return check_mul_int32_uint64(a, b, (int32_t*)ret); }
0688 
0689 static inline unsigned long safe_mul_ulong_int(unsigned long a, int b) { return safe_mul_uint32_int32(a, b); }
0690 static inline unsigned long safe_mul_ulong_uint(unsigned long a, unsigned int b) { return safe_mul_uint32_uint32(a, b); }
0691 static inline unsigned long safe_mul_ulong_long(unsigned long a, long b) { return safe_mul_uint32_int32(a, b); }
0692 static inline unsigned long safe_mul_ulong_ulong(unsigned long a, unsigned long b) { return safe_mul_uint32_uint32(a, b); }
0693 static inline unsigned long safe_mul_ulong_longlong(unsigned long a, long long b) { return safe_mul_uint32_int64(a, b); }
0694 static inline unsigned long safe_mul_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_mul_uint32_uint64(a, b); }
0695 
0696 static inline bool check_mul_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_mul_uint32_int32(a, b, (uint32_t*)ret); }
0697 static inline bool check_mul_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_mul_uint32_uint32(a, b, (uint32_t*)ret); }
0698 static inline bool check_mul_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_mul_uint32_int32(a, b, (uint32_t*)ret); }
0699 static inline bool check_mul_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_mul_uint32_uint32(a, b, (uint32_t*)ret); }
0700 static inline bool check_mul_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_mul_uint32_int64(a, b, (uint32_t*)ret); }
0701 static inline bool check_mul_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_mul_uint32_uint64(a, b, (uint32_t*)ret); }
0702 
0703 static inline long long safe_mul_longlong_long(long long a, long b) { return safe_mul_int64_int32(a, b); }
0704 static inline long long safe_mul_longlong_ulong(long long a, unsigned long b) { return safe_mul_int64_uint32(a, b); }
0705 
0706 static inline bool check_mul_longlong_long(long long a, long b, long long* ret) { return check_mul_int64_int32(a, b, ret); }
0707 static inline bool check_mul_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_mul_int64_uint64(a, b, ret); }
0708 
0709 static inline unsigned long long safe_mul_ulonglong_long(unsigned long long a, long b) { return safe_mul_uint64_int32(a, b); }
0710 static inline unsigned long long safe_mul_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_mul_uint64_uint32(a, b); }
0711 
0712 static inline bool check_mul_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_mul_uint64_int32(a, b, ret); }
0713 static inline bool check_mul_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_mul_uint64_uint32(a, b, ret); }
0714 #endif
0715 
0716 static inline long long safe_mul_longlong_int(long long a, int b) { return safe_mul_int64_int32(a, b); }
0717 static inline long long safe_mul_longlong_uint(long long a, unsigned int b) { return safe_mul_int64_uint32(a, b); }
0718 static inline long long safe_mul_longlong_longlong(long long a, long long b) { return safe_mul_int64_int64(a, b); }
0719 static inline long long safe_mul_longlong_ulonglong(long long a, unsigned long long b) { return safe_mul_int64_uint64(a, b); }
0720 
0721 static inline bool check_mul_longlong_int(long long a, int b, long long* ret) { return check_mul_int64_int32(a, b, (int64_t*)ret); }
0722 static inline bool check_mul_longlong_uint(long long a, unsigned int b, long long* ret) { return check_mul_int64_uint32(a, b, (int64_t*)ret); }
0723 static inline bool check_mul_longlong_longlong(long long a, long long b, long long* ret) { return check_mul_int64_int64(a, b, (int64_t*)ret); }
0724 static inline bool check_mul_longlong_ulonglong(long long a, unsigned long long b, long long* ret) { return check_mul_int64_uint64(a, b, (int64_t*)ret); }
0725 
0726 static inline unsigned long long safe_mul_ulonglong_int(unsigned long long a, int b) { return safe_mul_uint64_int32(a, b); }
0727 static inline unsigned long long safe_mul_ulonglong_uint(unsigned long long a, unsigned int b) { return safe_mul_uint64_uint32(a, b); }
0728 static inline unsigned long long safe_mul_ulonglong_longlong(unsigned long long a, long long b) { return safe_mul_uint64_int64(a, b); }
0729 static inline unsigned long long safe_mul_ulonglong_ulonglong(unsigned long long a, unsigned long long b) { return safe_mul_uint64_uint64(a, b); }
0730 
0731 static inline bool check_mul_ulonglong_int(unsigned long long a, int b, unsigned long long* ret) { return check_mul_uint64_int32(a, b, (uint64_t*)ret); }
0732 static inline bool check_mul_ulonglong_uint(unsigned long long a, unsigned int b, unsigned long long* ret) { return check_mul_uint64_uint32(a, b, (uint64_t*)ret); }
0733 static inline bool check_mul_ulonglong_longlong(unsigned long long a, long long b, unsigned long long* ret) { return check_mul_uint64_int64(a, b, (uint64_t*)ret); }
0734 static inline bool check_mul_ulonglong_ulonglong(unsigned long long a, unsigned long long b, unsigned long long* ret) { return check_mul_uint64_uint64(a, b, (uint64_t*)ret); }
0735 
0736 // Subtraction
0737 static inline int safe_sub_int_int(int a, int b) { return safe_sub_int32_int32(a, b); }
0738 static inline int safe_sub_int_uint(int a, unsigned int b) { return safe_sub_int32_uint32(a, b); }
0739 static inline int safe_sub_int_longlong(int a, long long b) { return safe_sub_int32_int64(a, b); }
0740 static inline int safe_sub_int_ulonglong(int a, unsigned long long b) { return safe_sub_int32_uint64(a, b); }
0741 
0742 static inline bool check_sub_int_int(int a, int b, int* ret) { return check_sub_int32_int32(a, b, (int32_t*)ret); }
0743 static inline bool check_sub_int_uint(int a, unsigned int b, int* ret) { return check_sub_int32_uint32(a, b, (int32_t*)ret); }
0744 static inline bool check_sub_int_longlong(int a, long long b, int* ret) { return check_sub_int32_int64(a, b, (int32_t*)ret); }
0745 static inline bool check_sub_int_ulonglong(int a, unsigned long long b, int* ret) { return check_sub_int32_uint64(a, b, (int32_t*)ret); }
0746 
0747 static inline unsigned int safe_sub_uint_int(unsigned int a, int b) { return safe_sub_uint32_int32(a, b); }
0748 static inline unsigned int safe_sub_uint_uint(unsigned int a, unsigned int b) { return safe_sub_uint32_uint32(a, b); }
0749 static inline unsigned int safe_sub_uint_longlong(unsigned int a, long long b) { return safe_sub_uint32_int64(a, b); }
0750 static inline unsigned int safe_sub_uint_ulonglong(unsigned int a, unsigned long long b) { return safe_sub_uint32_uint64(a, b); }
0751 
0752 static inline bool check_sub_uint_int(unsigned int a, int b, unsigned int* ret) { return check_sub_uint32_int32(a, b, (uint32_t*)ret); }
0753 static inline bool check_sub_uint_uint(unsigned int a, unsigned int b, unsigned int* ret) { return check_sub_uint32_uint32(a, b, (uint32_t*)ret); }
0754 static inline bool check_sub_uint_longlong(unsigned int a, long long b, unsigned int* ret) { return check_sub_uint32_int64(a, b, (uint32_t*)ret); }
0755 static inline bool check_sub_uint_ulonglong(unsigned int a, unsigned long long b, unsigned int* ret) { return check_sub_uint32_uint64(a, b, (uint32_t*)ret); }
0756 
0757 #if SAFE_MATH_LONG == 64
0758 static inline int safe_sub_int_long(int a, long b) { return safe_sub_int32_int64(a, b); }
0759 static inline int safe_sub_int_ulong(int a, unsigned long b) { return safe_sub_int32_uint64(a, b); }
0760 
0761 static inline bool check_sub_int_long(int a, long b, int* ret) { return check_sub_int32_int64(a, b, (int32_t*)ret); }
0762 static inline bool check_sub_int_ulong(int a, unsigned long b, int* ret) { return check_sub_int32_uint64(a, b, (int32_t*)ret); }
0763 
0764 static inline unsigned int safe_sub_uint_long(unsigned int a, long b) { return safe_sub_uint32_int64(a, b); }
0765 static inline unsigned int safe_sub_uint_ulong(unsigned int a, unsigned long b) { return safe_sub_uint32_uint64(a, b); }
0766 
0767 static inline bool check_sub_uint_long(unsigned int a, long b, unsigned int* ret) { return check_sub_uint32_int64(a, b, (uint32_t*)ret); }
0768 static inline bool check_sub_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_sub_uint32_uint64(a, b, (uint32_t*)ret); }
0769 
0770 static inline long safe_sub_long_int(long a, int b) { return safe_sub_int64_int32(a, b); }
0771 static inline long safe_sub_long_uint(long a, unsigned int b) { return safe_sub_int64_uint32(a, b); }
0772 static inline long safe_sub_long_long(long a, long b) { return safe_sub_int64_int64(a, b); }
0773 static inline long safe_sub_long_ulong(long a, unsigned long b) { return safe_sub_int64_uint64(a, b); }
0774 static inline long safe_sub_long_longlong(long a, long long b) { return safe_sub_int64_int64(a, b); }
0775 static inline long safe_sub_long_ulonglong(long a, unsigned long long b) { return safe_sub_int64_uint64(a, b); }
0776 
0777 static inline bool check_sub_long_int(long a, int b, long* ret) { return check_sub_int64_int32(a, b, (int64_t*)ret); }
0778 static inline bool check_sub_long_uint(long a, unsigned int b, long* ret) { return check_sub_int64_uint32(a, b, (int64_t*)ret); }
0779 static inline bool check_sub_long_long(long a, long b, long* ret) { return check_sub_int64_int64(a, b, (int64_t*)ret); }
0780 static inline bool check_sub_long_ulong(long a, unsigned long b, long* ret) { return check_sub_int64_uint64(a, b, (int64_t*)ret); }
0781 static inline bool check_sub_long_longlong(long a, long long b, long* ret) { return check_sub_int64_int64(a, b, (int64_t*)ret); }
0782 static inline bool check_sub_long_ulonglong(long a, unsigned long long b, long* ret) { return check_sub_int64_uint64(a, b, (int64_t*)ret); }
0783 
0784 static inline unsigned long safe_sub_ulong_int(unsigned long a, int b) { return safe_sub_uint64_int32(a, b); }
0785 static inline unsigned long safe_sub_ulong_uint(unsigned long a, unsigned int b) { return safe_sub_uint64_uint32(a, b); }
0786 static inline unsigned long safe_sub_ulong_long(unsigned long a, long b) { return safe_sub_uint64_int64(a, b); }
0787 static inline unsigned long safe_sub_ulong_ulong(unsigned long a, unsigned long b) { return safe_sub_uint64_uint64(a, b); }
0788 static inline unsigned long safe_sub_ulong_longlong(unsigned long a, long long b) { return safe_sub_uint64_int64(a, b); }
0789 static inline unsigned long safe_sub_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_sub_uint64_uint64(a, b); }
0790 
0791 static inline bool check_sub_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_sub_uint64_int32(a, b, (uint64_t*)ret); }
0792 static inline bool check_sub_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_sub_uint64_uint32(a, b, (uint64_t*)ret); }
0793 static inline bool check_sub_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_sub_uint64_int64(a, b, (uint64_t*)ret); }
0794 static inline bool check_sub_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_sub_uint64_uint64(a, b, (uint64_t*)ret); }
0795 static inline bool check_sub_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_sub_uint64_int64(a, b, (uint64_t*)ret); }
0796 static inline bool check_sub_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_sub_uint64_uint64(a, b, (uint64_t*)ret); }
0797 
0798 static inline long long safe_sub_longlong_long(long long a, long b) { return safe_sub_int64_int64(a, b); }
0799 static inline long long safe_sub_longlong_ulong(long long a, unsigned long b) { return safe_sub_int64_uint64(a, b); }
0800 
0801 static inline bool check_sub_longlong_long(long long a, long b, long long* ret) { return check_sub_int64_int64(a, b, (int64_t*)ret); }
0802 static inline bool check_sub_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_sub_int64_uint64(a, b, (int64_t*)ret); }
0803 
0804 static inline unsigned long long safe_sub_ulonglong_long(unsigned long long a, long b) { return safe_sub_uint64_int64(a, b); }
0805 static inline unsigned long long safe_sub_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_sub_uint64_uint64(a, b); }
0806 
0807 static inline bool check_sub_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_sub_uint64_int64(a, b, (uint64_t*)ret); }
0808 static inline bool check_sub_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_sub_uint64_uint64(a, b, (uint64_t*)ret); }
0809 #else
0810 static inline int safe_sub_int_long(int a, long b) { return safe_sub_int32_int32(a, b); }
0811 static inline int safe_sub_int_ulong(int a, unsigned long b) { return safe_sub_int32_uint32(a, b); }
0812 
0813 static inline bool check_sub_int_long(int a, long b, int* ret) { return check_sub_int32_int32(a, b, (int32_t*)ret); }
0814 static inline bool check_sub_int_ulong(int a, unsigned long b, int* ret) { return check_sub_int32_uint32(a, b, (int32_t*)ret); }
0815 
0816 static inline unsigned int safe_sub_uint_long(unsigned int a, long b) { return safe_sub_uint32_int32(a, b); }
0817 static inline unsigned int safe_sub_uint_ulong(unsigned int a, unsigned long b) { return safe_sub_uint32_uint32(a, b); }
0818 
0819 static inline bool check_sub_uint_long(unsigned int a, long b, unsigned int* ret) { return check_sub_uint32_int32(a, b, (uint32_t*)ret); }
0820 static inline bool check_sub_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_sub_uint32_uint32(a, b, (uint32_t*)ret); }
0821 
0822 static inline long safe_sub_long_int(long a, int b) { return safe_sub_int32_int32(a, b); }
0823 static inline long safe_sub_long_uint(long a, unsigned int b) { return safe_sub_int32_uint32(a, b); }
0824 static inline long safe_sub_long_long(long a, long b) { return safe_sub_int32_int32(a, b); }
0825 static inline long safe_sub_long_ulong(long a, unsigned long b) { return safe_sub_int32_uint32(a, b); }
0826 static inline long safe_sub_long_longlong(long a, long long b) { return safe_sub_int32_int64(a, b); }
0827 static inline long safe_sub_long_ulonglong(long a, unsigned long long b) { return safe_sub_int32_uint64(a, b); }
0828 
0829 static inline bool check_sub_long_int(long a, int b, long* ret) { return check_sub_int32_int32(a, b, (int32_t*)ret); }
0830 static inline bool check_sub_long_uint(long a, unsigned int b, long* ret) { return check_sub_int32_uint32(a, b, (int32_t*)ret); }
0831 static inline bool check_sub_long_long(long a, long b, long* ret) { return check_sub_int32_int32(a, b, (int32_t*)ret); }
0832 static inline bool check_sub_long_ulong(long a, unsigned long b, long* ret) { return check_sub_int32_uint32(a, b, (int32_t*)ret); }
0833 static inline bool check_sub_long_longlong(long a, long long b, long* ret) { return check_sub_int32_int64(a, b, (int32_t*)ret); }
0834 static inline bool check_sub_long_ulonglong(long a, unsigned long long b, long* ret) { return check_sub_int32_uint64(a, b, (int32_t*)ret); }
0835 
0836 static inline unsigned long safe_sub_ulong_int(unsigned long a, int b) { return safe_sub_uint32_int32(a, b); }
0837 static inline unsigned long safe_sub_ulong_uint(unsigned long a, unsigned int b) { return safe_sub_uint32_uint32(a, b); }
0838 static inline unsigned long safe_sub_ulong_long(unsigned long a, long b) { return safe_sub_uint32_int32(a, b); }
0839 static inline unsigned long safe_sub_ulong_ulong(unsigned long a, unsigned long b) { return safe_sub_uint32_uint32(a, b); }
0840 static inline unsigned long safe_sub_ulong_longlong(unsigned long a, long long b) { return safe_sub_uint32_int64(a, b); }
0841 static inline unsigned long safe_sub_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_sub_uint32_uint64(a, b); }
0842 
0843 static inline bool check_sub_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_sub_uint32_int32(a, b, (uint32_t*)ret); }
0844 static inline bool check_sub_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_sub_uint32_uint32(a, b, (uint32_t*)ret); }
0845 static inline bool check_sub_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_sub_uint32_int32(a, b, (uint32_t*)ret); }
0846 static inline bool check_sub_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_sub_uint32_uint32(a, b, (uint32_t*)ret); }
0847 static inline bool check_sub_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_sub_uint32_int64(a, b, (uint32_t*)ret); }
0848 static inline bool check_sub_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_sub_uint32_uint64(a, b, (uint32_t*)ret); }
0849 
0850 static inline long long safe_sub_longlong_long(long long a, long b) { return safe_sub_int64_int32(a, b); }
0851 static inline long long safe_sub_longlong_ulong(long long a, unsigned long b) { return safe_sub_int64_uint32(a, b); }
0852 
0853 static inline bool check_sub_longlong_long(long long a, long b, long long* ret) { return check_sub_int64_int32(a, b, ret); }
0854 static inline bool check_sub_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_sub_int64_uint32(a, b, ret); }
0855 
0856 static inline unsigned long long safe_sub_ulonglong_long(unsigned long long a, long b) { return safe_sub_uint64_int32(a, b); }
0857 static inline unsigned long long safe_sub_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_sub_uint64_uint32(a, b); }
0858 
0859 static inline bool check_sub_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_sub_uint64_int32(a, b, ret); }
0860 static inline bool check_sub_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_sub_uint64_uint64(a, b, ret); }
0861 #endif
0862 
0863 static inline long long safe_sub_longlong_int(long long a, int b) { return safe_sub_int64_int32(a, b); }
0864 static inline long long safe_sub_longlong_uint(long long a, unsigned int b) { return safe_sub_int64_uint32(a, b); }
0865 static inline long long safe_sub_longlong_longlong(long long a, long long b) { return safe_sub_int64_int64(a, b); }
0866 static inline long long safe_sub_longlong_ulonglong(long long a, unsigned long long b) { return safe_sub_int64_uint64(a, b); }
0867 
0868 static inline bool check_sub_longlong_int(long long a, int b, long long* ret) { return check_sub_int64_int32(a, b, (int64_t*)ret); }
0869 static inline bool check_sub_longlong_uint(long long a, unsigned int b, long long* ret) { return check_sub_int64_uint32(a, b, (int64_t*)ret); }
0870 static inline bool check_sub_longlong_longlong(long long a, long long b, long long* ret) { return check_sub_int64_int64(a, b, (int64_t*)ret); }
0871 static inline bool check_sub_longlong_ulonglong(long long a, unsigned long long b, long long* ret) { return check_sub_int64_uint64(a, b, (int64_t*)ret); }
0872 
0873 static inline unsigned long long safe_sub_ulonglong_int(unsigned long long a, int b) { return safe_sub_uint64_int32(a, b); }
0874 static inline unsigned long long safe_sub_ulonglong_uint(unsigned long long a, unsigned int b) { return safe_sub_uint64_uint32(a, b); }
0875 static inline unsigned long long safe_sub_ulonglong_longlong(unsigned long long a, long long b) { return safe_sub_uint64_int64(a, b); }
0876 static inline unsigned long long safe_sub_ulonglong_ulonglong(unsigned long long a, unsigned long long b) { return safe_sub_uint64_uint64(a, b); }
0877 
0878 static inline bool check_sub_ulonglong_int(unsigned long long a, int b, unsigned long long* ret) { return check_sub_uint64_int32(a, b, (uint64_t*)ret); }
0879 static inline bool check_sub_ulonglong_uint(unsigned long long a, unsigned int b, unsigned long long* ret) { return check_sub_uint64_uint32(a, b, (uint64_t*)ret); }
0880 static inline bool check_sub_ulonglong_longlong(unsigned long long a, long long b, unsigned long long* ret) { return check_sub_uint64_int64(a, b, (uint64_t*)ret); }
0881 static inline bool check_sub_ulonglong_ulonglong(unsigned long long a, unsigned long long b, unsigned long long* ret) { return check_sub_uint64_uint64(a, b, (uint64_t*)ret); }
0882 
0883 // Division
0884 static inline int safe_div_int_int(int a, int b) { return safe_div_int32_int32(a, b); }
0885 static inline int safe_div_int_uint(int a, unsigned int b) { return safe_div_int32_uint32(a, b); }
0886 static inline int safe_div_int_longlong(int a, long long b) { return safe_div_int32_int64(a, b); }
0887 static inline int safe_div_int_ulonglong(int a, unsigned long long b) { return safe_div_int32_uint64(a, b); }
0888 
0889 static inline bool check_div_int_int(int a, int b, int* ret) { return check_div_int32_int32(a, b, (int32_t*)ret); }
0890 static inline bool check_div_int_uint(int a, unsigned int b, int* ret) { return check_div_int32_uint32(a, b, (int32_t*)ret); }
0891 static inline bool check_div_int_longlong(int a, long long b, int* ret) { return check_div_int32_int64(a, b, (int32_t*)ret); }
0892 static inline bool check_div_int_ulonglong(int a, unsigned long long b, int* ret) { return check_div_int32_uint64(a, b, (int32_t*)ret); }
0893 
0894 static inline unsigned int safe_div_uint_int(unsigned int a, int b) { return safe_div_uint32_int32(a, b); }
0895 static inline unsigned int safe_div_uint_uint(unsigned int a, unsigned int b) { return safe_div_uint32_uint32(a, b); }
0896 static inline unsigned int safe_div_uint_longlong(unsigned int a, long long b) { return safe_div_uint32_int64(a, b); }
0897 static inline unsigned int safe_div_uint_ulonglong(unsigned int a, unsigned long long b) { return safe_div_uint32_uint64(a, b); }
0898 
0899 static inline bool check_div_uint_int(unsigned int a, int b, unsigned int* ret) { return check_div_uint32_int32(a, b, (uint32_t*)ret); }
0900 static inline bool check_div_uint_uint(unsigned int a, unsigned int b, unsigned int* ret) { return check_div_uint32_uint32(a, b, (uint32_t*)ret); }
0901 static inline bool check_div_uint_longlong(unsigned int a, long long b, unsigned int* ret) { return check_div_uint32_int64(a, b, (uint32_t*)ret); }
0902 static inline bool check_div_uint_ulonglong(unsigned int a, unsigned long long b, unsigned int* ret) { return check_div_uint32_uint64(a, b, (uint32_t*)ret); }
0903 
0904 #if SAFE_MATH_LONG == 64
0905 static inline int safe_div_int_long(int a, long b) { return safe_div_int32_int64(a, b); }
0906 static inline int safe_div_int_ulong(int a, unsigned long b) { return safe_div_int32_uint64(a, b); }
0907 
0908 static inline bool check_div_int_long(int a, long b, int* ret) { return check_div_int32_int64(a, b, (int32_t*)ret); }
0909 static inline bool check_div_int_ulong(int a, unsigned long b, int* ret) { return check_div_int32_uint64(a, b, (int32_t*)ret); }
0910 
0911 static inline unsigned int safe_div_uint_long(unsigned int a, long b) { return safe_div_uint32_int64(a, b); }
0912 static inline unsigned int safe_div_uint_ulong(unsigned int a, unsigned long b) { return safe_div_uint32_uint64(a, b); }
0913 
0914 static inline bool check_div_uint_long(unsigned int a, long b, unsigned int* ret) { return check_div_uint32_int64(a, b, (uint32_t*)ret); }
0915 static inline bool check_div_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_div_uint32_uint64(a, b, (uint32_t*)ret); }
0916 
0917 static inline long safe_div_long_int(long a, int b) { return safe_div_int64_int32(a, b); }
0918 static inline long safe_div_long_uint(long a, unsigned int b) { return safe_div_int64_uint32(a, b); }
0919 static inline long safe_div_long_long(long a, long b) { return safe_div_int64_int64(a, b); }
0920 static inline long safe_div_long_ulong(long a, unsigned long b) { return safe_div_int64_uint64(a, b); }
0921 static inline long safe_div_long_longlong(long a, long long b) { return safe_div_int64_int64(a, b); }
0922 static inline long safe_div_long_ulonglong(long a, unsigned long long b) { return safe_div_int64_uint64(a, b); }
0923 
0924 static inline bool check_div_long_int(long a, int b, long* ret) { return check_div_int64_int32(a, b, (int64_t*)ret); }
0925 static inline bool check_div_long_uint(long a, unsigned int b, long* ret) { return check_div_int64_uint32(a, b, (int64_t*)ret); }
0926 static inline bool check_div_long_long(long a, long b, long* ret) { return check_div_int64_int64(a, b, (int64_t*)ret); }
0927 static inline bool check_div_long_ulong(long a, unsigned long b, long* ret) { return check_div_int64_uint64(a, b, (int64_t*)ret); }
0928 static inline bool check_div_long_longlong(long a, long long b, long* ret) { return check_div_int64_int64(a, b, (int64_t*)ret); }
0929 static inline bool check_div_long_ulonglong(long a, unsigned long long b, long* ret) { return check_div_int64_uint64(a, b, (int64_t*)ret); }
0930 
0931 static inline unsigned long safe_div_ulong_int(unsigned long a, int b) { return safe_div_uint64_int32(a, b); }
0932 static inline unsigned long safe_div_ulong_uint(unsigned long a, unsigned int b) { return safe_div_uint64_uint32(a, b); }
0933 static inline unsigned long safe_div_ulong_long(unsigned long a, long b) { return safe_div_uint64_int64(a, b); }
0934 static inline unsigned long safe_div_ulong_ulong(unsigned long a, unsigned long b) { return safe_div_uint64_uint64(a, b); }
0935 static inline unsigned long safe_div_ulong_longlong(unsigned long a, long long b) { return safe_div_uint64_int64(a, b); }
0936 static inline unsigned long safe_div_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_div_uint64_uint64(a, b); }
0937 
0938 static inline bool check_div_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_div_uint64_int32(a, b, (uint64_t*)ret); }
0939 static inline bool check_div_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_div_uint64_uint32(a, b, (uint64_t*)ret); }
0940 static inline bool check_div_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_div_uint64_int64(a, b, (uint64_t*)ret); }
0941 static inline bool check_div_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_div_uint64_uint64(a, b, (uint64_t*)ret); }
0942 static inline bool check_div_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_div_uint64_int64(a, b, (uint64_t*)ret); }
0943 static inline bool check_div_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_div_uint64_uint64(a, b, (uint64_t*)ret); }
0944 
0945 static inline long long safe_div_longlong_long(long long a, long b) { return safe_div_int64_int64(a, b); }
0946 static inline long long safe_div_longlong_ulong(long long a, unsigned long b) { return safe_div_int64_uint64(a, b); }
0947 
0948 static inline bool check_div_longlong_long(long long a, long b, long long* ret) { return check_div_int64_int64(a, b, (int64_t*)ret); }
0949 static inline bool check_div_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_div_int64_uint64(a, b, (int64_t*)ret); }
0950 
0951 static inline unsigned long long safe_div_ulonglong_long(unsigned long long a, long b) { return safe_div_uint64_int64(a, b); }
0952 static inline unsigned long long safe_div_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_div_uint64_uint64(a, b); }
0953 
0954 static inline bool check_div_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_div_uint64_int64(a, b, (uint64_t*)ret); }
0955 static inline bool check_div_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_div_uint64_uint64(a, b, (uint64_t*)ret); }
0956 #else
0957 static inline int safe_div_int_long(int a, long b) { return safe_div_int32_int32(a, b); }
0958 static inline int safe_div_int_ulong(int a, unsigned long b) { return safe_div_int32_uint32(a, b); }
0959 
0960 static inline bool check_div_int_long(int a, long b, int* ret) { return check_div_int32_int32(a, b, (int32_t*)ret); }
0961 static inline bool check_div_int_ulong(int a, unsigned long b, int* ret) { return check_div_int32_uint32(a, b, (int32_t*)ret); }
0962 
0963 static inline unsigned int safe_div_uint_long(unsigned int a, long b) { return safe_div_uint32_int32(a, b); }
0964 static inline unsigned int safe_div_uint_ulong(unsigned int a, unsigned long b) { return safe_div_uint32_uint32(a, b); }
0965 
0966 static inline bool check_div_uint_long(unsigned int a, long b, unsigned int* ret) { return check_div_uint32_int32(a, b, (uint32_t*)ret); }
0967 static inline bool check_div_uint_ulong(unsigned int a, unsigned long b, unsigned int* ret) { return check_div_uint32_uint32(a, b, (uint32_t*)ret); }
0968 
0969 static inline long safe_div_long_int(long a, int b) { return safe_div_int32_int32(a, b); }
0970 static inline long safe_div_long_uint(long a, unsigned int b) { return safe_div_int32_uint32(a, b); }
0971 static inline long safe_div_long_long(long a, long b) { return safe_div_int32_int32(a, b); }
0972 static inline long safe_div_long_ulong(long a, unsigned long b) { return safe_div_int32_uint32(a, b); }
0973 static inline long safe_div_long_longlong(long a, long long b) { return safe_div_int32_int64(a, b); }
0974 static inline long safe_div_long_ulonglong(long a, unsigned long long b) { return safe_div_int32_uint64(a, b); }
0975 
0976 static inline bool check_div_long_int(long a, int b, long* ret) { return check_div_int32_int32(a, b, (int32_t*)ret); }
0977 static inline bool check_div_long_uint(long a, unsigned int b, long* ret) { return check_div_int32_uint32(a, b, (int32_t*)ret); }
0978 static inline bool check_div_long_long(long a, long b, long* ret) { return check_div_int32_int32(a, b, (int32_t*)ret); }
0979 static inline bool check_div_long_ulong(long a, unsigned long b, long* ret) { return check_div_int32_uint32(a, b, (int32_t*)ret); }
0980 static inline bool check_div_long_longlong(long a, long long b, long* ret) { return check_div_int32_int64(a, b, (int32_t*)ret); }
0981 static inline bool check_div_long_ulonglong(long a, unsigned long long b, long* ret) { return check_div_int32_uint64(a, b, (int32_t*)ret); }
0982 
0983 static inline unsigned long safe_div_ulong_int(unsigned long a, int b) { return safe_div_uint32_int32(a, b); }
0984 static inline unsigned long safe_div_ulong_uint(unsigned long a, unsigned int b) { return safe_div_uint32_uint32(a, b); }
0985 static inline unsigned long safe_div_ulong_long(unsigned long a, long b) { return safe_div_uint32_int32(a, b); }
0986 static inline unsigned long safe_div_ulong_ulong(unsigned long a, unsigned long b) { return safe_div_uint32_uint32(a, b); }
0987 static inline unsigned long safe_div_ulong_longlong(unsigned long a, long long b) { return safe_div_uint32_int64(a, b); }
0988 static inline unsigned long safe_div_ulong_ulonglong(unsigned long a, unsigned long long b) { return safe_div_uint32_uint64(a, b); }
0989 
0990 static inline bool check_div_ulong_int(unsigned long a, int b, unsigned long* ret) { return check_div_uint32_int32(a, b, (uint32_t*)ret); }
0991 static inline bool check_div_ulong_uint(unsigned long a, unsigned int b, unsigned long* ret) { return check_div_uint32_uint32(a, b, (uint32_t*)ret); }
0992 static inline bool check_div_ulong_long(unsigned long a, long b, unsigned long* ret) { return check_div_uint32_int32(a, b, (uint32_t*)ret); }
0993 static inline bool check_div_ulong_ulong(unsigned long a, unsigned long b, unsigned long* ret) { return check_div_uint32_uint64(a, b, (uint32_t*)ret); }
0994 static inline bool check_div_ulong_longlong(unsigned long a, long long b, unsigned long* ret) { return check_div_uint32_int64(a, b, (uint32_t*)ret); }
0995 static inline bool check_div_ulong_ulonglong(unsigned long a, unsigned long long b, unsigned long* ret) { return check_div_uint32_uint64(a, b, (uint32_t*)ret); }
0996 
0997 static inline long long safe_div_longlong_long(long long a, long b) { return safe_div_int64_int32(a, b); }
0998 static inline long long safe_div_longlong_ulong(long long a, unsigned long b) { return safe_div_int64_uint32(a, b); }
0999 
1000 static inline bool check_div_longlong_long(long long a, long b, long long* ret) { return check_div_int64_int32(a, b, ret); }
1001 static inline bool check_div_longlong_ulong(long long a, unsigned long b, long long* ret) { return check_div_int64_uint32(a, b, ret); }
1002 
1003 static inline unsigned long long safe_div_ulonglong_long(unsigned long long a, long b) { return safe_div_uint64_int32(a, b); }
1004 static inline unsigned long long safe_div_ulonglong_ulong(unsigned long long a, unsigned long b) { return safe_div_uint64_uint32(a, b); }
1005 
1006 static inline bool check_div_ulonglong_long(unsigned long long a, long b, unsigned long long* ret) { return check_div_uint64_int32(a, b, ret); }
1007 static inline bool check_div_ulonglong_ulong(unsigned long long a, unsigned long b, unsigned long long* ret) { return check_div_uint64_uint32(a, b, ret); }
1008 #endif
1009 
1010 static inline long long safe_div_longlong_int(long long a, int b) { return safe_div_int64_int32(a, b); }
1011 static inline long long safe_div_longlong_uint(long long a, unsigned int b) { return safe_div_int64_uint32(a, b); }
1012 static inline long long safe_div_longlong_longlong(long long a, long long b) { return safe_div_int64_int64(a, b); }
1013 static inline long long safe_div_longlong_ulonglong(long long a, unsigned long long b) { return safe_div_int64_uint64(a, b); }
1014 
1015 static inline bool check_div_longlong_int(long long a, int b, long long* ret) { return check_div_int64_int32(a, b, (int64_t*)ret); }
1016 static inline bool check_div_longlong_uint(long long a, unsigned int b, long long* ret) { return check_div_int64_uint32(a, b, (int64_t*)ret); }
1017 static inline bool check_div_longlong_longlong(long long a, long long b, long long* ret) { return check_div_int64_int64(a, b, (int64_t*)ret); }
1018 static inline bool check_div_longlong_ulonglong(long long a, unsigned long long b, long long* ret) { return check_div_int64_uint64(a, b, (int64_t*)ret); }
1019 
1020 static inline unsigned long long safe_div_ulonglong_int(unsigned long long a, int b) { return safe_div_uint64_int32(a, b); }
1021 static inline unsigned long long safe_div_ulonglong_uint(unsigned long long a, unsigned int b) { return safe_div_uint64_uint32(a, b); }
1022 static inline unsigned long long safe_div_ulonglong_longlong(unsigned long long a, long long b) { return safe_div_uint64_int64(a, b); }
1023 static inline unsigned long long safe_div_ulonglong_ulonglong(unsigned long long a, unsigned long long b) { return safe_div_uint64_uint64(a, b); }
1024 
1025 static inline bool check_div_ulonglong_int(unsigned long long a, int b, unsigned long long* ret) { return check_div_uint64_int32(a, b, (uint64_t*)ret); }
1026 static inline bool check_div_ulonglong_uint(unsigned long long a, unsigned int b, unsigned long long* ret) { return check_div_uint64_uint32(a, b, (uint64_t*)ret); }
1027 static inline bool check_div_ulonglong_longlong(unsigned long long a, long long b, unsigned long long* ret) { return check_div_uint64_int64(a, b, (uint64_t*)ret); }
1028 static inline bool check_div_ulonglong_ulonglong(unsigned long long a, unsigned long long b, unsigned long long* ret) { return check_div_uint64_uint64(a, b, (uint64_t*)ret); }
1029 
1030 #ifdef __cplusplus
1031 }
1032 #endif
1033 
1034 #endif