17 #pragma pack(push, _CRT_PACKING)
28 #pragma warning(disable:4702)
30 template <
typename T >
41 #ifdef _NATIVE_WCHAR_T_DEFINED
63 #pragma warning(suppress:4804)
80 #pragma warning(suppress:4804)
85 #pragma warning(disable:4310)
86 #pragma warning(disable:4804) // suppress warning about '<<' being an unsafe operation when T is bool
204 template <
typename T >
215 template < typename T, int Method = GetAbsMethod< T >::method >
class AbsValueHelper;
220 static unsigned __int32
Abs( T t )
throw()
223 return (
unsigned __int32)-t;
230 static unsigned __int64
Abs( T t )
throw()
233 return (
unsigned __int64)-t;
240 static T
Abs( T t )
throw()
243 _ASSERTE( (
"AbsValueHelper::Abs should not be called with an unsigned integer type", 0) );
262 E::SafeIntOnOverflow();
275 #pragma warning(suppress:4127)
278 #pragma warning(suppress:4146)
297 template <
typename ToType,
typename FromType >
317 sizeof( FromType ) >=
sizeof( ToType ) ) ||
330 template <
typename T,
typename U,
typename E,
357 E::SafeIntOnOverflow();
368 t = (T)( b ? 1 : 0 );
390 E::SafeIntOnOverflow();
406 E::SafeIntOnOverflow();
423 E::SafeIntOnOverflow();
440 E::SafeIntOnOverflow();
459 template <
typename T,
typename U >
465 #if _SAFEINT_USE_ANSI_CONVERSIONS
479 template <typename T, typename U, int Method = ValidComparison< T, U >::method >
class EqualityTest;
484 static bool IsEquals(
const T t,
const U u )
throw() {
return ( t == u ); }
490 static bool IsEquals(
const T t,
const U u )
throw() {
return ( (
int)t == (
int)u ); }
496 static bool IsEquals(
const T t,
const U u )
throw() {
return ( (__int64)t == (__int64)u ); }
502 static bool IsEquals(
const T t,
const U u )
throw()
511 return ( t == (T)u );
518 static bool IsEquals(
const T t,
const U u )
throw()
527 return ( (U)t == u );
531 template <typename T, typename U, int Method = ValidComparison< T, U >::method >
class GreaterThanTest;
536 static bool GreaterThan(
const T t,
const U u )
throw() {
return ( t > u ); }
542 static bool GreaterThan(
const T t,
const U u )
throw() {
return ( (
int)t > (
int)u ); }
548 static bool GreaterThan(
const T t,
const U u )
throw() {
return ( (__int64)t > (__int64)u ); }
585 template <typename T, typename U, typename E, int Method = ValidComparison< T, U >::method >
class ModulusHelper;
594 E::SafeIntOnDivZero();
599 #pragma warning(suppress:4127)
621 E::SafeIntOnDivZero();
626 #pragma warning(suppress:4127)
648 E::SafeIntOnDivZero();
652 #pragma warning(suppress:4127)
659 result = (T)((__int64)t % (__int64)u);
674 E::SafeIntOnDivZero();
701 E::SafeIntOnDivZero();
712 result = (T)((T)t % u);
741 template <
typename T,
typename U >
780 template <typename T, typename U, typename E, int Method = MultiplicationMethod< T, U >::method >
class MultiplicationHelper;
792 E::SafeIntOnOverflow();
807 unsigned int tmp = t * u;
811 E::SafeIntOnOverflow();
826 __int64 tmp = (__int64)t * (__int64)u;
830 E::SafeIntOnOverflow();
845 unsigned __int64 tmp = (
unsigned __int64)t * (
unsigned __int64)u;
849 E::SafeIntOnOverflow();
867 unsigned __int32 aHigh, aLow, bHigh, bLow;
874 aHigh = (
unsigned __int32)(a >> 32);
875 aLow = (
unsigned __int32)a;
876 bHigh = (
unsigned __int32)(b >> 32);
877 bLow = (
unsigned __int32)b;
885 ret = (
unsigned __int64)aLow * (
unsigned __int64)bHigh;
892 ret = (
unsigned __int64)aHigh * (
unsigned __int64)bLow;
897 E::SafeIntOnOverflow();
903 unsigned __int64 tmp;
905 if((
unsigned __int32)(ret >> 32) != 0)
907 E::SafeIntOnOverflow();
912 tmp = (
unsigned __int64)aLow * (
unsigned __int64)bLow;
917 E::SafeIntOnOverflow();
924 ret = (
unsigned __int64)aLow * (
unsigned __int64)bLow;
934 unsigned __int32 aHigh, aLow;
940 aHigh = (
unsigned __int32)(a >> 32);
941 aLow = (
unsigned __int32)a;
947 ret = (
unsigned __int64)aHigh * (
unsigned __int64)b;
949 unsigned __int64 tmp;
951 if((
unsigned __int32)(ret >> 32) != 0)
953 E::SafeIntOnOverflow();
958 tmp = (
unsigned __int64)aLow * (
unsigned __int64)b;
963 E::SafeIntOnOverflow();
970 ret = (
unsigned __int64)aLow * (
unsigned __int64)b;
980 if( b < 0 && a != 0 )
982 E::SafeIntOnOverflow();
995 if( b < 0 && a != 0 )
997 E::SafeIntOnOverflow();
1010 unsigned __int32 bHigh, bLow;
1011 bool fIsNegative =
false;
1017 bHigh = (
unsigned __int32)(b >> 32);
1018 bLow = (
unsigned __int32)b;
1022 if(bHigh != 0 && a != 0)
1024 E::SafeIntOnOverflow();
1034 unsigned __int64 tmp = (
unsigned __int32)a * (
unsigned __int64)bLow;
1041 ret = (
signed __int32)tmp;
1049 ret = -( (
signed __int32)tmp );
1054 E::SafeIntOnOverflow();
1070 if( (
unsigned __int32)(b >> 32) != 0 && a != 0 )
1072 E::SafeIntOnOverflow();
1076 unsigned __int64 tmp = b * (
unsigned __int64)a;
1078 if( (
unsigned __int32)(tmp >> 32) != 0 )
1080 E::SafeIntOnOverflow();
1084 ret = (
unsigned __int32)tmp;
1094 if( b < 0 && a != 0 )
1096 E::SafeIntOnOverflow();
1109 bool aNegative =
false;
1110 bool bNegative =
false;
1112 unsigned __int64 tmp;
1129 RegMultiply( (
unsigned __int64)a1, (
unsigned __int64)b1, tmp ) ==
SafeIntNoError )
1132 if( aNegative ^ bNegative )
1137 ret = -(
signed __int64)tmp;
1146 ret = (
signed __int64)tmp;
1152 E::SafeIntOnOverflow();
1162 bool aNegative =
false;
1163 unsigned __int64 tmp;
1180 ret = -(
signed __int64)tmp;
1189 ret = (
signed __int64)tmp;
1195 E::SafeIntOnOverflow();
1205 bool aNegative =
false;
1206 bool bNegative =
false;
1208 unsigned __int64 tmp;
1225 RegMultiply( (
unsigned __int64)a1, (
unsigned __int32)b1, tmp ) ==
SafeIntNoError )
1228 if( aNegative ^ bNegative )
1233 ret = -(
signed __int64)tmp;
1242 ret = (
signed __int64)tmp;
1248 E::SafeIntOnOverflow();
1258 bool aNegative =
false;
1259 bool bNegative =
false;
1261 unsigned __int32 tmp;
1277 RegMultiply( (
unsigned __int32)a, (
unsigned __int64)b1, tmp ) ==
SafeIntNoError )
1280 if( aNegative ^ bNegative )
1285 #pragma warning(suppress:4146)
1295 ret = (
signed __int32)tmp;
1301 E::SafeIntOnOverflow();
1311 bool aNegative =
false;
1313 unsigned __int64 tmp;
1323 RegMultiply( (
unsigned __int64)a1, (
unsigned __int64)b, tmp ) ==
SafeIntNoError )
1331 ret = -((
signed __int64)tmp);
1340 ret = (
signed __int64)tmp;
1346 E::SafeIntOnOverflow();
1377 unsigned __int32 tmp;
1385 E::SafeIntOnOverflow();
1415 unsigned __int32 tmp;
1423 E::SafeIntOnOverflow();
1471 E::SafeIntOnOverflow();
1500 E::SafeIntOnOverflow();
1531 template < typename T, typename U, typename E, int Method = DivisionMethod< T, U >::method >
class DivisionHelper;
1540 E::SafeIntOnDivZero();
1544 result = (T)( t/u );
1556 result = (T)( t/u );
1562 E::SafeIntOnDivZero();
1574 E::SafeIntOnOverflow();
1586 E::SafeIntOnDivZero();
1594 result = (T)( t/u );
1596 result = (T)( (__int64)t/(__int64)u );
1609 E::SafeIntOnDivZero();
1616 #pragma warning(suppress:4127)
1617 if(
sizeof( T ) <
sizeof( __int64 ) )
1618 result = (T)( (
int)t/(
int)u );
1620 result = (T)((__int64)t/(__int64)u);
1645 E::SafeIntOnDivZero();
1649 result = (T)( t/u );
1661 E::SafeIntOnDivZero();
1668 E::SafeIntOnOverflow();
1672 result = (T)( t/u );
1697 template<
typename T,
typename U >
1734 template < typename T, typename U, typename E, int Method = AdditionMethod< T, U >::method >
class AdditionHelper;
1742 __int32 tmp = lhs + rhs;
1750 E::SafeIntOnOverflow();
1761 unsigned __int32 tmp = (
unsigned __int32)lhs + (
unsigned __int32)rhs;
1769 E::SafeIntOnOverflow();
1780 unsigned __int32 tmp = (
unsigned __int32)lhs + (
unsigned __int32)rhs;
1788 E::SafeIntOnOverflow();
1799 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1808 E::SafeIntOnOverflow();
1819 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1828 E::SafeIntOnOverflow();
1839 __int32 tmp = lhs + rhs;
1847 E::SafeIntOnOverflow();
1852 #pragma warning(push)
1853 #pragma warning(disable:4702)
1860 __int64 tmp = (__int64)lhs + (__int64)rhs;
1868 E::SafeIntOnOverflow();
1873 #pragma warning(pop)
1881 __int64 tmp = (__int64)lhs + (__int64)rhs;
1889 E::SafeIntOnOverflow();
1900 unsigned __int64 tmp;
1916 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1926 E::SafeIntOnOverflow();
1939 if( lhs >= (
unsigned __int64)( -rhs ) )
1941 result = (T)( lhs + rhs );
1948 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1958 E::SafeIntOnOverflow();
1969 __int64 tmp = (__int64)lhs + (__int64)rhs;
1974 if( rhs >= 0 && tmp < lhs )
1976 E::SafeIntOnOverflow();
1983 if( rhs < 0 && tmp > lhs )
1985 E::SafeIntOnOverflow();
2012 E::SafeIntOnOverflow();
2023 __int64 tmp = lhs + (__int64)rhs;
2031 E::SafeIntOnOverflow();
2042 __int64 tmp = lhs + (__int64)rhs;
2050 E::SafeIntOnOverflow();
2062 if( (
unsigned __int32)( rhs >> 32 ) == 0 )
2066 __int32 tmp = (__int32)( (
unsigned __int32)rhs + (
unsigned __int32)lhs );
2073 E::SafeIntOnOverflow();
2179 template < typename T, typename U, typename E, int Method = SubtractionMethod< T, U >::method >
class SubtractionHelper;
2189 result = (T)( lhs - rhs );
2193 E::SafeIntOnOverflow();
2207 T tmp = (T)(lhs - rhs);
2211 E::SafeIntOnOverflow();
2223 __int32 tmp = lhs - rhs;
2231 E::SafeIntOnOverflow();
2243 __int32 tmp = lhs - rhs;
2256 __int32 tmp = lhs - rhs;
2264 E::SafeIntOnOverflow();
2276 __int64 tmp = (__int64)lhs - (__int64)rhs;
2289 __int64 tmp = (__int64)lhs - (__int64)rhs;
2302 __int64 tmp = (__int64)lhs - (__int64)rhs;
2310 E::SafeIntOnOverflow();
2324 if( (
unsigned __int64)rhs <= lhs )
2326 result = (T)( lhs - (
unsigned __int64)rhs );
2342 E::SafeIntOnOverflow();
2356 unsigned __int64 tmp;
2367 else if( (
unsigned __int64)rhs > lhs )
2372 result = (T)lhs - (T)rhs;
2378 unsigned __int64 tmp = (
unsigned __int64)lhs - (
unsigned __int64)rhs;
2387 E::SafeIntOnOverflow();
2401 if( (
unsigned __int64)rhs <= lhs )
2403 result = (T)( lhs - (T)rhs );
2412 unsigned __int64 tmp = lhs + (
unsigned __int64)( -rhs );
2422 E::SafeIntOnOverflow();
2436 result = (T)( (__int64)lhs - rhs );
2443 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)( -rhs );
2452 E::SafeIntOnOverflow();
2470 __int64 tmp = lhs - rhs;
2475 if( ( lhs >= 0 && rhs < 0 && tmp < lhs ) ||
2476 ( rhs >= 0 && tmp > lhs ) )
2478 E::SafeIntOnOverflow();
2493 __int64 tmp = lhs - rhs;
2506 #pragma warning(suppress:4127)
2508 ( rhs < 0 && tmp < lhs ) )
2510 E::SafeIntOnOverflow();
2517 #pragma warning(suppress:4127)
2519 ( rhs >=0 && tmp > lhs ) )
2521 E::SafeIntOnOverflow();
2544 __int64 tmp = (__int64)lhs - rhs;
2590 E::SafeIntOnOverflow();
2601 __int64 tmp = (__int64)lhs - rhs;
2603 if( ( lhs >= 0 && rhs < 0 && tmp < lhs ) ||
2604 ( rhs > 0 && tmp > lhs ) )
2606 E::SafeIntOnOverflow();
2623 __int64 tmp = lhs - (__int64)rhs;
2631 E::SafeIntOnOverflow();
2642 __int64 tmp = lhs - (__int64)rhs;
2650 E::SafeIntOnOverflow();
2671 result = (T)( lhs - rhs );
2677 if( rhs <= AbsMinIntT + (
unsigned __int64)lhs )
2679 result = (T)( lhs - rhs );
2684 E::SafeIntOnOverflow();
2695 if( lhs >= 0 && (T)lhs >= rhs )
2697 result = (T)((U)lhs - (U)rhs);
2701 E::SafeIntOnOverflow();
2712 __int64 tmp = lhs - (__int64)rhs;
2719 E::SafeIntOnOverflow();
2731 if( lhs >= 0 && (
unsigned __int64)lhs >= rhs )
2733 result = (
unsigned __int64)lhs - rhs;
2737 E::SafeIntOnOverflow();
2768 template < typename T, typename U, int Method = BinaryMethod< T, U >::method >
class BinaryAndHelper;
2773 static T
And( T lhs, U rhs ){
return (T)( lhs & rhs ); }
2783 return (T)( lhs & (
unsigned __int8)rhs );
2794 return (T)( lhs & (
unsigned __int16)rhs );
2805 return (T)( lhs & (
unsigned __int32)rhs );
2809 template < typename T, typename U, int Method = BinaryMethod< T, U >::method >
class BinaryOrHelper;
2814 static T
Or( T lhs, U rhs ){
return (T)( lhs | rhs ); }
2820 static T
Or( T lhs, U rhs )
2824 return (T)( lhs | (
unsigned __int8)rhs );
2831 static T
Or( T lhs, U rhs )
2835 return (T)( lhs | (
unsigned __int16)rhs );
2842 static T
Or( T lhs, U rhs )
2846 return (T)( lhs | (
unsigned __int32)rhs );
2850 template <typename T, typename U, int Method = BinaryMethod< T, U >::method >
class BinaryXorHelper;
2855 static T
Xor( T lhs, U rhs ){
return (T)( lhs ^ rhs ); }
2865 return (T)( lhs ^ (
unsigned __int8)rhs );
2876 return (T)( lhs ^ (
unsigned __int16)rhs );
2887 return (T)( lhs ^ (
unsigned __int32)rhs );
2891 #pragma warning(pop)
Definition: safeint_internal.h:736
Definition: safeint_internal.h:114
Definition: safeint_internal.h:730
AdditionState
Definition: safeint_internal.h:1677
Definition: safeint_internal.h:70
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2272
Definition: safeint_internal.h:191
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2790
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:644
static unsigned __int64 Abs(T t)
Definition: safeint_internal.h:230
static const T maxInt
Definition: safeint_internal.h:87
Definition: safeint_internal.h:1680
Definition: safeint_internal.h:1694
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2430
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:548
Definition: safeint_internal.h:64
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:402
static T Abs(T t)
Definition: safeint_internal.h:240
Definition: safeint_internal.h:178
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2298
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1966
Definition: safeint_internal.h:2100
Definition: safeint_internal.h:192
Definition: safeint_internal.h:780
Definition: safeint_internal.h:1509
Definition: safeint_internal.h:585
Definition: safeint_internal.h:115
Definition: safeint_internal.h:205
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1878
Definition: safeint_internal.h:1693
Definition: safeint.h:264
Definition: safeint_internal.h:1507
Definition: safeint_internal.h:1684
Definition: safeint_internal.h:77
DivisionState
Definition: safeint_internal.h:1505
Definition: safeint.h:255
Definition: safeint_internal.h:733
Definition: safeint_internal.h:66
Definition: safeint_internal.h:287
static SafeIntError Negative(T t, T &ret)
Definition: safeint_internal.h:271
static SafeIntError Cast(bool b, T &t)
Definition: safeint_internal.h:366
Definition: safeint_internal.h:2094
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2692
Definition: safeint_internal.h:2089
Definition: safeint_internal.h:929
Definition: safeint_internal.h:727
Definition: safeint_internal.h:189
Definition: safeint_internal.h:183
Definition: safeint_internal.h:76
Definition: safeint_internal.h:531
Definition: safeint_internal.h:2103
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1582
Definition: safeint_internal.h:215
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1998
Definition: safeint_internal.h:2082
Definition: safeint_internal.h:1512
Definition: safeint_internal.h:1510
_In_ long
Definition: corecrt_wstdlib.h:88
Definition: safeint_internal.h:182
Definition: safeint_internal.h:723
Definition: safeint_internal.h:2096
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:617
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2814
Definition: safeint_internal.h:479
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1796
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:518
Definition: safeint_internal.h:57
Definition: safeint_internal.h:199
Definition: safeint_internal.h:67
Definition: safeint_internal.h:742
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:348
Definition: safeint_internal.h:460
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:590
Definition: safeint_internal.h:2085
static SafeIntError RegMultiply(const unsigned __int64 &a, unsigned __int32 b, unsigned __int64 &ret)
Definition: safeint_internal.h:932
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2318
Definition: safeint_internal.h:184
Definition: safeint_internal.h:737
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2861
Definition: safeint_internal.h:726
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:805
Definition: safeint_internal.h:293
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:435
Definition: safeint_internal.h:187
Definition: safeint_internal.h:31
static SafeIntError Subtract(const __int64 &lhs, const unsigned __int64 &rhs, __int64 &result)
Definition: safeint_internal.h:2709
Definition: safeint_internal.h:2090
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:536
Definition: safeint_internal.h:54
Definition: safeint_internal.h:1687
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1857
Definition: safeint_internal.h:54
Definition: safeint_internal.h:728
Definition: safeint_internal.h:171
static SafeIntError Cast(T t, bool &b)
Definition: safeint_internal.h:376
Definition: safeint_internal.h:468
Definition: safeint_internal.h:1683
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2619
Definition: safeint_internal.h:75
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2831
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1758
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:554
static SafeIntError RegMultiply(const unsigned __int64 &a, const unsigned __int64 &b, unsigned __int64 &ret)
Definition: safeint_internal.h:865
Definition: safeint_internal.h:738
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2883
Definition: safeint_internal.h:2746
static SafeIntError Subtract(const T &lhs, const U &rhs, U &result)
Definition: safeint_internal.h:2201
Definition: safeint_internal.h:167
static SafeIntError RegMultiply(const signed __int64 &a, const signed __int64 &b, signed __int64 &ret)
Definition: safeint_internal.h:1107
Definition: safeint_internal.h:110
Definition: safeint_internal.h:79
MultiplicationState
Definition: safeint_internal.h:720
Definition: safeint_internal.h:2744
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2285
static SafeIntError Multiply(const unsigned __int64 &t, const U &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1364
Definition: safeint_internal.h:2102
Definition: safeint_internal.h:722
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2779
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:824
#define _ASSERTE(expr)
Definition: crtdbg.h:707
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1641
static SafeIntError Multiply(const __int64 &t, const __int64 &u, __int64 &ret)
Definition: safeint_internal.h:1441
Definition: safeint_internal.h:112
Definition: safeint.h:265
Definition: safeint_internal.h:454
Definition: safeint_internal.h:173
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2820
Definition: safeint_internal.h:2086
Definition: safeint_internal.h:2768
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1739
Definition: safeint_internal.h:200
Definition: safeint_internal.h:175
static SafeIntError RegMultiply(const unsigned __int64 &a, signed __int64 b, unsigned __int64 &ret)
Definition: safeint_internal.h:993
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:843
static void SafeIntOnDivZero()
Definition: safeint_internal.h:99
Definition: safeint_internal.h:2101
Definition: safeint_internal.h:74
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:496
Definition: safeint_internal.h:1690
Definition: safeint_internal.h:289
#define bool
Definition: stdbool.h:15
Definition: safeint_internal.h:2097
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1836
Definition: safeint_internal.h:177
Definition: safeint_internal.h:2745
Definition: safeint_internal.h:2081
static SafeIntError Divide(const T &t, const unsigned __int64 &u, T &result)
Definition: safeint_internal.h:1605
Definition: safeint_internal.h:104
Definition: safeint_internal.h:731
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:484
Definition: safeint_internal.h:725
Definition: safeint_internal.h:71
Definition: safeint_internal.h:453
Definition: safeint_internal.h:1682
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:490
Definition: safeint_internal.h:2095
Definition: safeint_internal.h:180
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2490
unsigned char
Definition: mbstring.h:107
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2855
Definition: safeint_internal.h:1689
char int *typedef int(__CRTDECL *_CRT_REPORT_HOOKW)(int
Definition: crtdbg.h:45
static SafeIntError RegMultiply(const unsigned __int64 &a, signed __int32 b, unsigned __int64 &ret)
Definition: safeint_internal.h:978
static unsigned __int32 Abs(T t)
Definition: safeint_internal.h:220
Definition: safeint_internal.h:862
Definition: safeint_internal.h:735
Definition: safeint_internal.h:72
Definition: safeint_internal.h:1515
Definition: safeint_internal.h:54
static SafeIntError Multiply(const T &t, const __int64 &u, T &ret)
Definition: safeint_internal.h:1413
#define false
Definition: stdbool.h:16
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2058
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2395
Definition: safeint_internal.h:298
Definition: safeint_internal.h:292
static SafeIntError Addition(const __int64 &lhs, const unsigned __int64 &rhs, __int64 &result)
Definition: safeint_internal.h:2039
static SafeIntError Multiply(const unsigned __int64 &t, const __int64 &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1403
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2773
Definition: safeint_internal.h:188
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2219
Definition: safeint_internal.h:1531
Definition: safeint_internal.h:170
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2184
BinaryState
Definition: safeint_internal.h:2742
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:670
static SafeIntError Subtract(const __int64 &lhs, const unsigned __int64 &rhs, unsigned __int64 &result)
Definition: safeint_internal.h:2729
SafeIntError
Definition: safeint.h:261
Definition: safeint_internal.h:294
Definition: safeint_internal.h:65
Definition: safeint_internal.h:31
Definition: safeint_internal.h:185
Definition: safeint_internal.h:1734
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1552
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2658
Definition: safeint_internal.h:291
static SafeIntError Negative(T t, T &ret)
Definition: safeint_internal.h:253
static SafeIntError RegMultiply(signed __int32 a, const unsigned __int64 &b, signed __int32 &ret)
Definition: safeint_internal.h:1008
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2801
static void SafeIntOnOverflow()
Definition: safeint_internal.h:95
Definition: safeint_internal.h:2088
Definition: safeint_internal.h:169
Definition: safeint_internal.h:1679
Definition: safeint_internal.h:93
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:697
Definition: safeint_internal.h:2098
static const T minInt
Definition: safeint_internal.h:88
Definition: safeint_internal.h:2080
Definition: safeint.h:263
Definition: safeint_internal.h:455
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:502
Definition: safeint_internal.h:161
AbsMethod
Definition: safeint_internal.h:197
Definition: safeint_internal.h:2143
Definition: safeint_internal.h:860
unsigned short wchar_t
Definition: sourceannotations.h:25
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1934
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:542
Definition: safeint_internal.h:1685
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:386
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1816
static SafeIntError Multiply(const __int64 &t, U u, __int64 &ret)
Definition: safeint_internal.h:1451
Definition: safeint_internal.h:1511
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1897
static SafeIntError RegMultiply(const signed __int64 &a, const unsigned __int64 &b, signed __int64 &ret)
Definition: safeint_internal.h:1309
Definition: safeint_internal.h:2809
Definition: safeint_internal.h:303
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1536
Definition: safeint_internal.h:456
Definition: safeint_internal.h:33
Definition: safeint_internal.h:181
Definition: safeint_internal.h:729
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:570
Definition: safeint_internal.h:68
static SafeIntError RegMultiply(const signed __int64 &a, signed __int32 b, signed __int64 &ret)
Definition: safeint_internal.h:1203
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2252
Definition: safeint_internal.h:1692
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2598
Definition: safeint_internal.h:174
Definition: safeint_internal.h:1059
Definition: safeint_internal.h:2083
static SafeIntError Multiply(const __int64 &t, const U &u, __int64 &ret)
Definition: safeint_internal.h:1432
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:336
Definition: safeint_internal.h:2093
Definition: safeint_internal.h:1698
static SafeIntError RegMultiply(const signed __int64 &a, unsigned __int32 b, signed __int64 &ret)
Definition: safeint_internal.h:1160
Definition: safeint_internal.h:2091
Definition: safeint_internal.h:111
Definition: safeint_internal.h:2750
Definition: safeint_internal.h:168
Definition: safeint_internal.h:210
Definition: safeint_internal.h:2084
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2239
Definition: safeint_internal.h:1688
static SafeIntError RegMultiply(unsigned __int32 a, const unsigned __int64 &b, unsigned __int32 &ret)
Definition: safeint_internal.h:1062
Definition: safeint_internal.h:1686
Definition: safeint_internal.h:331
Definition: safeint_internal.h:1681
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2350
static SafeIntError RegMultiply(signed __int32 a, const signed __int64 &b, signed __int32 &ret)
Definition: safeint_internal.h:1256
Definition: safeint_internal.h:201
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:786
Definition: safeint_internal.h:724
ComparisonMethod
Definition: safeint_internal.h:450
Definition: safeint_internal.h:69
Definition: safeint_internal.h:248
Definition: safeint_internal.h:288
static SafeIntError Multiply(T t, const __int64 &u, T &ret)
Definition: safeint_internal.h:1490
static SafeIntError Multiply(const unsigned __int64 &t, const unsigned __int64 &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1354
static SafeIntError Multiply(const unsigned __int64 &t, const U &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1394
Definition: safeint_internal.h:2179
Definition: safeint_internal.h:176
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1657
Definition: safeint_internal.h:81
SubtractionState
Definition: safeint_internal.h:2078
Definition: safeint_internal.h:1691
Definition: safeint_internal.h:78
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1777
Definition: safeint_internal.h:734
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2640
Definition: safeint_internal.h:290
static SafeIntError Multiply(T t, const unsigned __int64 &u, T &ret)
Definition: safeint_internal.h:1461
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:418
Definition: safeint_internal.h:2087
#define true
Definition: stdbool.h:17
Definition: safeint_internal.h:2747
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2020
static SafeIntError Multiply(const __int64 &t, const unsigned __int64 &u, __int64 &ret)
Definition: safeint_internal.h:1480
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2842
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2534
Definition: safeint_internal.h:1508
CastMethod
Definition: safeint_internal.h:285
Definition: safeint_internal.h:2106
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2872
#define _SAFEINT_UNSIGNED_NEGATION_BEHAVIOR()
Definition: safeint.h:244
Definition: safeint_internal.h:2099
Definition: safeint_internal.h:109
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2460
Definition: safeint_internal.h:190
static SafeIntError Multiply(const T &t, const unsigned __int64 &u, T &ret)
Definition: safeint_internal.h:1375
Definition: safeint_internal.h:452
Definition: safeint_internal.h:2850
static SafeIntError RegMultiply(unsigned __int32 a, const signed __int64 &b, unsigned __int32 &ret)
Definition: safeint_internal.h:1092
Definition: safeint_internal.h:732
#define _SAFEINT_BINARY_ASSERT(x)
Definition: safeint.h:233
Definition: safeint_internal.h:73