17 #pragma pack(push, _CRT_PACKING)
28 #pragma warning(disable:4702)
38 #if _NATIVE_WCHAR_T_DEFINED
60 #pragma warning(suppress:4804)
77 #pragma warning(suppress:4804)
82 #pragma warning(disable:4310)
200 template <
typename T >
211 template < typename T, int Method = GetAbsMethod< T >::method >
class AbsValueHelper;
216 static unsigned __int32
Abs( T t )
throw()
219 return (
unsigned __int32)-t;
226 static unsigned __int64
Abs( T t )
throw()
229 return (
unsigned __int64)-t;
236 static T
Abs( T t )
throw()
239 _ASSERTE( (
"AbsValueHelper::Abs should not be called with an unsigned integer type", 0) );
258 E::SafeIntOnOverflow();
271 #pragma warning(suppress:4127)
274 #pragma warning(suppress:4146)
293 template <
typename ToType,
typename FromType >
313 sizeof( FromType ) >=
sizeof( ToType ) ) ||
326 template <
typename T,
typename U,
typename E,
353 E::SafeIntOnOverflow();
364 t = (T)( b ? 1 : 0 );
386 E::SafeIntOnOverflow();
402 E::SafeIntOnOverflow();
419 E::SafeIntOnOverflow();
436 E::SafeIntOnOverflow();
455 template <
typename T,
typename U >
461 #if _SAFEINT_USE_ANSI_CONVERSIONS
475 template <typename T, typename U, int Method = ValidComparison< T, U >::method >
class EqualityTest;
480 static bool IsEquals(
const T t,
const U u )
throw() {
return ( t == u ); }
486 static bool IsEquals(
const T t,
const U u )
throw() {
return ( (
int)t == (
int)u ); }
492 static bool IsEquals(
const T t,
const U u )
throw() {
return ( (__int64)t == (__int64)u ); }
498 static bool IsEquals(
const T t,
const U u )
throw()
507 return ( t == (T)u );
514 static bool IsEquals(
const T t,
const U u )
throw()
523 return ( (U)t == u );
527 template <typename T, typename U, int Method = ValidComparison< T, U >::method >
class GreaterThanTest;
532 static bool GreaterThan(
const T t,
const U u )
throw() {
return ( t > u ); }
538 static bool GreaterThan(
const T t,
const U u )
throw() {
return ( (
int)t > (
int)u ); }
544 static bool GreaterThan(
const T t,
const U u )
throw() {
return ( (__int64)t > (__int64)u ); }
581 template <typename T, typename U, typename E, int Method = ValidComparison< T, U >::method >
class ModulusHelper;
590 E::SafeIntOnDivZero();
595 #pragma warning(suppress:4127)
617 E::SafeIntOnDivZero();
622 #pragma warning(suppress:4127)
644 E::SafeIntOnDivZero();
648 #pragma warning(suppress:4127)
655 result = (T)((__int64)t % (__int64)u);
670 E::SafeIntOnDivZero();
697 E::SafeIntOnDivZero();
708 result = (T)((T)t % u);
737 template <
typename T,
typename U >
776 template <typename T, typename U, typename E, int Method = MultiplicationMethod< T, U >::method >
class MultiplicationHelper;
788 E::SafeIntOnOverflow();
803 unsigned int tmp = t * u;
807 E::SafeIntOnOverflow();
822 __int64 tmp = (__int64)t * (__int64)u;
826 E::SafeIntOnOverflow();
841 unsigned __int64 tmp = (
unsigned __int64)t * (
unsigned __int64)u;
845 E::SafeIntOnOverflow();
863 unsigned __int32 aHigh, aLow, bHigh, bLow;
870 aHigh = (
unsigned __int32)(a >> 32);
871 aLow = (
unsigned __int32)a;
872 bHigh = (
unsigned __int32)(b >> 32);
873 bLow = (
unsigned __int32)b;
881 ret = (
unsigned __int64)aLow * (
unsigned __int64)bHigh;
888 ret = (
unsigned __int64)aHigh * (
unsigned __int64)bLow;
893 E::SafeIntOnOverflow();
899 unsigned __int64 tmp;
901 if((
unsigned __int32)(ret >> 32) != 0)
903 E::SafeIntOnOverflow();
908 tmp = (
unsigned __int64)aLow * (
unsigned __int64)bLow;
913 E::SafeIntOnOverflow();
920 ret = (
unsigned __int64)aLow * (
unsigned __int64)bLow;
930 unsigned __int32 aHigh, aLow;
936 aHigh = (
unsigned __int32)(a >> 32);
937 aLow = (
unsigned __int32)a;
943 ret = (
unsigned __int64)aHigh * (
unsigned __int64)b;
945 unsigned __int64 tmp;
947 if((
unsigned __int32)(ret >> 32) != 0)
949 E::SafeIntOnOverflow();
954 tmp = (
unsigned __int64)aLow * (
unsigned __int64)b;
959 E::SafeIntOnOverflow();
966 ret = (
unsigned __int64)aLow * (
unsigned __int64)b;
976 if( b < 0 && a != 0 )
978 E::SafeIntOnOverflow();
991 if( b < 0 && a != 0 )
993 E::SafeIntOnOverflow();
1006 unsigned __int32 bHigh, bLow;
1007 bool fIsNegative =
false;
1013 bHigh = (
unsigned __int32)(b >> 32);
1014 bLow = (
unsigned __int32)b;
1018 if(bHigh != 0 && a != 0)
1020 E::SafeIntOnOverflow();
1030 unsigned __int64 tmp = (
unsigned __int32)a * (
unsigned __int64)bLow;
1037 ret = (
signed __int32)tmp;
1045 ret = -( (
signed __int32)tmp );
1050 E::SafeIntOnOverflow();
1066 if( (
unsigned __int32)(b >> 32) != 0 && a != 0 )
1068 E::SafeIntOnOverflow();
1072 unsigned __int64 tmp = b * (
unsigned __int64)a;
1074 if( (
unsigned __int32)(tmp >> 32) != 0 )
1076 E::SafeIntOnOverflow();
1080 ret = (
unsigned __int32)tmp;
1090 if( b < 0 && a != 0 )
1092 E::SafeIntOnOverflow();
1105 bool aNegative =
false;
1106 bool bNegative =
false;
1108 unsigned __int64 tmp;
1125 RegMultiply( (
unsigned __int64)a1, (
unsigned __int64)b1, (
unsigned __int64)tmp ) ==
SafeIntNoError )
1128 if( aNegative ^ bNegative )
1133 ret = -(
signed __int64)tmp;
1142 ret = (
signed __int64)tmp;
1148 E::SafeIntOnOverflow();
1158 bool aNegative =
false;
1159 unsigned __int64 tmp;
1176 ret = -(
signed __int64)tmp;
1185 ret = (
signed __int64)tmp;
1191 E::SafeIntOnOverflow();
1201 bool aNegative =
false;
1202 bool bNegative =
false;
1204 unsigned __int64 tmp;
1221 RegMultiply( (
unsigned __int64)a1, (
unsigned __int32)b1, (
unsigned __int64)tmp ) ==
SafeIntNoError )
1224 if( aNegative ^ bNegative )
1229 ret = -(
signed __int64)tmp;
1238 ret = (
signed __int64)tmp;
1244 E::SafeIntOnOverflow();
1254 bool aNegative =
false;
1255 bool bNegative =
false;
1257 unsigned __int32 tmp;
1273 RegMultiply( (
unsigned __int32)a, (
unsigned __int64)b1, tmp ) ==
SafeIntNoError )
1276 if( aNegative ^ bNegative )
1281 #pragma warning(suppress:4146)
1291 ret = (
signed __int32)tmp;
1297 E::SafeIntOnOverflow();
1307 bool aNegative =
false;
1309 unsigned __int64 tmp;
1319 RegMultiply( (
unsigned __int64)a1, (
unsigned __int64)b, tmp ) ==
SafeIntNoError )
1327 ret = -((
signed __int64)tmp);
1336 ret = (
signed __int64)tmp;
1342 E::SafeIntOnOverflow();
1373 unsigned __int32 tmp;
1381 E::SafeIntOnOverflow();
1411 unsigned __int32 tmp;
1419 E::SafeIntOnOverflow();
1467 E::SafeIntOnOverflow();
1496 E::SafeIntOnOverflow();
1527 template < typename T, typename U, typename E, int Method = DivisionMethod< T, U >::method >
class DivisionHelper;
1536 E::SafeIntOnDivZero();
1540 result = (T)( t/u );
1552 result = (T)( t/u );
1558 E::SafeIntOnDivZero();
1570 E::SafeIntOnOverflow();
1582 E::SafeIntOnDivZero();
1590 result = (T)( t/u );
1592 result = (T)( (__int64)t/(__int64)u );
1605 E::SafeIntOnDivZero();
1612 #pragma warning(suppress:4127)
1613 if(
sizeof( T ) <
sizeof( __int64 ) )
1614 result = (T)( (
int)t/(
int)u );
1616 result = (T)((__int64)t/(__int64)u);
1641 E::SafeIntOnDivZero();
1645 result = (T)( t/u );
1657 E::SafeIntOnDivZero();
1664 E::SafeIntOnOverflow();
1668 result = (T)( t/u );
1693 template<
typename T,
typename U >
1730 template < typename T, typename U, typename E, int Method = AdditionMethod< T, U >::method >
class AdditionHelper;
1738 __int32 tmp = lhs + rhs;
1746 E::SafeIntOnOverflow();
1757 unsigned __int32 tmp = (
unsigned __int32)lhs + (
unsigned __int32)rhs;
1765 E::SafeIntOnOverflow();
1776 unsigned __int32 tmp = (
unsigned __int32)lhs + (
unsigned __int32)rhs;
1784 E::SafeIntOnOverflow();
1795 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1804 E::SafeIntOnOverflow();
1815 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1824 E::SafeIntOnOverflow();
1835 __int32 tmp = lhs + rhs;
1843 E::SafeIntOnOverflow();
1848 #pragma warning(push)
1849 #pragma warning(disable:4702)
1856 __int64 tmp = (__int64)lhs + (__int64)rhs;
1864 E::SafeIntOnOverflow();
1869 #pragma warning(pop)
1877 __int64 tmp = (__int64)lhs + (__int64)rhs;
1885 E::SafeIntOnOverflow();
1896 unsigned __int64 tmp;
1912 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1922 E::SafeIntOnOverflow();
1935 if( lhs >= (
unsigned __int64)( -rhs ) )
1937 result = (T)( lhs + rhs );
1944 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)rhs;
1954 E::SafeIntOnOverflow();
1965 __int64 tmp = (__int64)lhs + (__int64)rhs;
1970 if( rhs >= 0 && tmp < lhs )
1972 E::SafeIntOnOverflow();
1979 if( rhs < 0 && tmp > lhs )
1981 E::SafeIntOnOverflow();
2008 E::SafeIntOnOverflow();
2019 __int64 tmp = lhs + (__int64)rhs;
2027 E::SafeIntOnOverflow();
2038 __int64 tmp = lhs + (__int64)rhs;
2046 E::SafeIntOnOverflow();
2058 if( (
unsigned __int32)( rhs >> 32 ) == 0 )
2062 __int32 tmp = (__int32)( (
unsigned __int32)rhs + (
unsigned __int32)lhs );
2069 E::SafeIntOnOverflow();
2175 template < typename T, typename U, typename E, int Method = SubtractionMethod< T, U >::method >
class SubtractionHelper;
2185 result = (T)( lhs - rhs );
2189 E::SafeIntOnOverflow();
2203 T tmp = (T)(lhs - rhs);
2207 E::SafeIntOnOverflow();
2219 __int32 tmp = lhs - rhs;
2227 E::SafeIntOnOverflow();
2239 __int32 tmp = lhs - rhs;
2252 __int32 tmp = lhs - rhs;
2260 E::SafeIntOnOverflow();
2272 __int64 tmp = (__int64)lhs - (__int64)rhs;
2285 __int64 tmp = (__int64)lhs - (__int64)rhs;
2298 __int64 tmp = (__int64)lhs - (__int64)rhs;
2306 E::SafeIntOnOverflow();
2320 if( (
unsigned __int64)rhs <= lhs )
2322 result = (T)( lhs - (
unsigned __int64)rhs );
2338 E::SafeIntOnOverflow();
2352 unsigned __int64 tmp;
2363 else if( (
unsigned __int64)rhs > lhs )
2368 result = (T)lhs - (T)rhs;
2374 unsigned __int64 tmp = (
unsigned __int64)lhs - (
unsigned __int64)rhs;
2383 E::SafeIntOnOverflow();
2397 if( (
unsigned __int64)rhs <= lhs )
2399 result = (T)( lhs - (T)rhs );
2408 unsigned __int64 tmp = lhs + (
unsigned __int64)( -rhs );
2418 E::SafeIntOnOverflow();
2432 result = (T)( (__int64)lhs - rhs );
2439 unsigned __int64 tmp = (
unsigned __int64)lhs + (
unsigned __int64)( -rhs );
2448 E::SafeIntOnOverflow();
2466 __int64 tmp = lhs - rhs;
2471 if( ( lhs >= 0 && rhs < 0 && tmp < lhs ) ||
2472 ( rhs >= 0 && tmp > lhs ) )
2474 E::SafeIntOnOverflow();
2489 __int64 tmp = lhs - rhs;
2502 #pragma warning(suppress:4127)
2504 ( rhs < 0 && tmp < lhs ) )
2506 E::SafeIntOnOverflow();
2513 #pragma warning(suppress:4127)
2515 ( rhs >=0 && tmp > lhs ) )
2517 E::SafeIntOnOverflow();
2540 __int64 tmp = (__int64)lhs - rhs;
2586 E::SafeIntOnOverflow();
2597 __int64 tmp = (__int64)lhs - rhs;
2599 if( ( lhs >= 0 && rhs < 0 && tmp < lhs ) ||
2600 ( rhs > 0 && tmp > lhs ) )
2602 E::SafeIntOnOverflow();
2619 __int64 tmp = lhs - (__int64)rhs;
2627 E::SafeIntOnOverflow();
2638 __int64 tmp = lhs - (__int64)rhs;
2646 E::SafeIntOnOverflow();
2667 result = (T)( lhs - rhs );
2673 if( rhs <= AbsMinIntT + (
unsigned __int64)lhs )
2675 result = (T)( lhs - rhs );
2680 E::SafeIntOnOverflow();
2691 if( lhs >= 0 && (T)lhs >= rhs )
2693 result = (T)((U)lhs - (U)rhs);
2697 E::SafeIntOnOverflow();
2708 __int64 tmp = lhs - (__int64)rhs;
2715 E::SafeIntOnOverflow();
2727 if( lhs >= 0 && (
unsigned __int64)lhs >= rhs )
2729 result = (
unsigned __int64)lhs - rhs;
2733 E::SafeIntOnOverflow();
2764 template < typename T, typename U, int Method = BinaryMethod< T, U >::method >
class BinaryAndHelper;
2769 static T
And( T lhs, U rhs ){
return (T)( lhs & rhs ); }
2779 return (T)( lhs & (
unsigned __int8)rhs );
2790 return (T)( lhs & (
unsigned __int16)rhs );
2801 return (T)( lhs & (
unsigned __int32)rhs );
2805 template < typename T, typename U, int Method = BinaryMethod< T, U >::method >
class BinaryOrHelper;
2810 static T
Or( T lhs, U rhs ){
return (T)( lhs | rhs ); }
2816 static T
Or( T lhs, U rhs )
2820 return (T)( lhs | (
unsigned __int8)rhs );
2827 static T
Or( T lhs, U rhs )
2831 return (T)( lhs | (
unsigned __int16)rhs );
2838 static T
Or( T lhs, U rhs )
2842 return (T)( lhs | (
unsigned __int32)rhs );
2846 template <typename T, typename U, int Method = BinaryMethod< T, U >::method >
class BinaryXorHelper;
2851 static T
Xor( T lhs, U rhs ){
return (T)( lhs ^ rhs ); }
2861 return (T)( lhs ^ (
unsigned __int8)rhs );
2872 return (T)( lhs ^ (
unsigned __int16)rhs );
2883 return (T)( lhs ^ (
unsigned __int32)rhs );
2887 #pragma warning(pop)
Definition: safeint_internal.h:732
Definition: safeint_internal.h:726
AdditionState
Definition: safeint_internal.h:1673
Definition: safeint_internal.h:105
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2268
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2786
Definition: safeint_internal.h:173
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:640
static unsigned __int64 Abs(T t)
Definition: safeint_internal.h:226
static const T maxInt
Definition: safeint_internal.h:83
Definition: safeint_internal.h:1676
Definition: safeint_internal.h:186
Definition: safeint_internal.h:1690
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2426
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:544
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:398
static T Abs(T t)
Definition: safeint_internal.h:236
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2294
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1962
Definition: safeint_internal.h:2096
Definition: safeint_internal.h:776
Definition: safeint_internal.h:1505
Definition: safeint_internal.h:581
Definition: safeint_internal.h:185
Definition: safeint_internal.h:201
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1874
Definition: safeint_internal.h:1689
Definition: safeint.h:264
Definition: safeint_internal.h:1503
Definition: safeint_internal.h:1680
DivisionState
Definition: safeint_internal.h:1501
Definition: safeint.h:255
Definition: safeint_internal.h:729
Definition: safeint_internal.h:283
static SafeIntError Negative(T t, T &ret)
Definition: safeint_internal.h:267
static SafeIntError Cast(bool b, T &t)
Definition: safeint_internal.h:362
Definition: safeint_internal.h:2090
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2688
Definition: safeint_internal.h:2085
Definition: safeint_internal.h:925
Definition: safeint_internal.h:723
Definition: safeint_internal.h:527
Definition: safeint_internal.h:2099
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1578
Definition: safeint_internal.h:51
Definition: safeint_internal.h:211
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1994
Definition: safeint_internal.h:2078
Definition: safeint_internal.h:1508
Definition: safeint_internal.h:165
Definition: safeint_internal.h:1506
Definition: safeint_internal.h:719
Definition: safeint_internal.h:2092
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:613
Definition: safeint_internal.h:206
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2810
_CRTIMP _In_opt_z_ const wchar_t _In_opt_z_ const wchar_t unsigned int
Definition: crtdefs.h:642
Definition: safeint_internal.h:106
Definition: safeint_internal.h:475
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1792
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:514
Definition: safeint_internal.h:54
Definition: safeint_internal.h:195
Definition: safeint_internal.h:738
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:344
Definition: safeint_internal.h:456
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:586
Definition: safeint_internal.h:2081
static SafeIntError RegMultiply(const unsigned __int64 &a, unsigned __int32 b, unsigned __int64 &ret)
Definition: safeint_internal.h:928
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2314
Definition: safeint_internal.h:63
Definition: safeint_internal.h:733
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2857
Definition: safeint_internal.h:722
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:801
Definition: safeint_internal.h:170
Definition: safeint_internal.h:289
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:431
Definition: safeint_internal.h:171
Definition: safeint_internal.h:299
static SafeIntError Subtract(const __int64 &lhs, const unsigned __int64 &rhs, __int64 &result)
Definition: safeint_internal.h:2705
Definition: safeint_internal.h:2086
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:532
Definition: safeint_internal.h:70
Definition: safeint_internal.h:74
Definition: safeint_internal.h:1683
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1853
Definition: safeint_internal.h:724
Definition: safeint_internal.h:163
static SafeIntError Cast(T t, bool &b)
Definition: safeint_internal.h:372
Definition: safeint_internal.h:1679
Definition: safeint_internal.h:67
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2615
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2827
Definition: safeint_internal.h:71
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1754
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:550
static SafeIntError RegMultiply(const unsigned __int64 &a, const unsigned __int64 &b, unsigned __int64 &ret)
Definition: safeint_internal.h:861
Definition: safeint_internal.h:734
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2879
Definition: safeint_internal.h:2742
static SafeIntError Subtract(const T &lhs, const U &rhs, U &result)
Definition: safeint_internal.h:2197
static SafeIntError RegMultiply(const signed __int64 &a, const signed __int64 &b, signed __int64 &ret)
Definition: safeint_internal.h:1103
Definition: safeint_internal.h:167
Definition: safeint_internal.h:68
MultiplicationState
Definition: safeint_internal.h:716
Definition: safeint_internal.h:2740
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2281
static SafeIntError Multiply(const unsigned __int64 &t, const U &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1360
Definition: safeint_internal.h:2098
Definition: safeint_internal.h:718
Definition: safeint_internal.h:166
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2775
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:820
#define _ASSERTE(expr)
Definition: crtdbg.h:216
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1637
Definition: safeint_internal.h:181
static SafeIntError Multiply(const __int64 &t, const __int64 &u, __int64 &ret)
Definition: safeint_internal.h:1437
Definition: safeint.h:265
Definition: safeint_internal.h:108
Definition: safeint_internal.h:450
unsigned short wchar_t
Definition: crtdefs.h:536
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2816
Definition: safeint_internal.h:2082
Definition: safeint_internal.h:2764
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1735
Definition: safeint_internal.h:196
static SafeIntError RegMultiply(const unsigned __int64 &a, signed __int64 b, unsigned __int64 &ret)
Definition: safeint_internal.h:989
Definition: safeint_internal.h:169
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:839
static void SafeIntOnDivZero()
Definition: safeint_internal.h:95
Definition: safeint_internal.h:2097
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:492
Definition: safeint_internal.h:1686
Definition: safeint_internal.h:285
#define bool
Definition: stdbool.h:10
Definition: safeint_internal.h:2093
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1832
Definition: safeint_internal.h:2741
Definition: safeint_internal.h:2077
static SafeIntError Divide(const T &t, const unsigned __int64 &u, T &result)
Definition: safeint_internal.h:1601
Definition: safeint_internal.h:100
Definition: safeint_internal.h:727
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:480
Definition: safeint_internal.h:721
Definition: safeint_internal.h:449
Definition: safeint_internal.h:1678
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:486
Definition: safeint_internal.h:76
Definition: safeint_internal.h:2091
Definition: safeint_internal.h:188
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2486
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2851
Definition: safeint_internal.h:1685
Definition: safeint_internal.h:464
static SafeIntError RegMultiply(const unsigned __int64 &a, signed __int32 b, unsigned __int64 &ret)
Definition: safeint_internal.h:974
static unsigned __int32 Abs(T t)
Definition: safeint_internal.h:216
Definition: safeint_internal.h:858
Definition: safeint_internal.h:731
Definition: safeint_internal.h:1511
static SafeIntError Multiply(const T &t, const __int64 &u, T &ret)
Definition: safeint_internal.h:1409
#define false
Definition: stdbool.h:11
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2054
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2391
Definition: safeint_internal.h:78
Definition: safeint_internal.h:294
Definition: safeint_internal.h:288
static SafeIntError Addition(const __int64 &lhs, const unsigned __int64 &rhs, __int64 &result)
Definition: safeint_internal.h:2035
static SafeIntError Multiply(const unsigned __int64 &t, const __int64 &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1399
Definition: safeint_internal.h:172
Definition: safeint_internal.h:66
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2769
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2215
Definition: safeint_internal.h:1527
Definition: safeint_internal.h:110
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2180
BinaryState
Definition: safeint_internal.h:2738
_STATIC_ASSERT(NumericType< T >::isInt||NumericType< T >::isBool)
Definition: safeint_internal.h:111
Definition: safeint_internal.h:187
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:666
Definition: safeint_internal.h:183
Definition: safeint_internal.h:164
Definition: safeint_internal.h:179
static SafeIntError Subtract(const __int64 &lhs, const unsigned __int64 &rhs, unsigned __int64 &result)
Definition: safeint_internal.h:2725
SafeIntError
Definition: safeint.h:261
Definition: safeint_internal.h:290
Definition: safeint_internal.h:180
Definition: safeint_internal.h:1730
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1548
Definition: safeint_internal.h:72
Definition: safeint_internal.h:69
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2654
Definition: safeint_internal.h:287
static SafeIntError Negative(T t, T &ret)
Definition: safeint_internal.h:249
static SafeIntError RegMultiply(signed __int32 a, const unsigned __int64 &b, signed __int32 &ret)
Definition: safeint_internal.h:1004
static T And(T lhs, U rhs)
Definition: safeint_internal.h:2797
static void SafeIntOnOverflow()
Definition: safeint_internal.h:91
Definition: safeint_internal.h:2084
Definition: safeint_internal.h:1675
Definition: safeint_internal.h:89
static SafeIntError Modulus(const T &t, const U &u, T &result)
Definition: safeint_internal.h:693
Definition: safeint_internal.h:2094
static const T minInt
Definition: safeint_internal.h:84
Definition: safeint_internal.h:2076
Definition: safeint.h:263
Definition: safeint_internal.h:451
static bool IsEquals(const T t, const U u)
Definition: safeint_internal.h:498
Definition: safeint_internal.h:157
AbsMethod
Definition: safeint_internal.h:193
Definition: safeint_internal.h:2139
Definition: safeint_internal.h:856
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1930
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:538
Definition: safeint_internal.h:1681
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:382
Definition: safeint_internal.h:64
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1812
static SafeIntError Multiply(const __int64 &t, U u, __int64 &ret)
Definition: safeint_internal.h:1447
Definition: safeint_internal.h:1507
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1893
static SafeIntError RegMultiply(const signed __int64 &a, const unsigned __int64 &b, signed __int64 &ret)
Definition: safeint_internal.h:1305
Definition: safeint_internal.h:2805
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1532
Definition: safeint_internal.h:452
Definition: safeint_internal.h:30
Definition: safeint_internal.h:725
static bool GreaterThan(const T t, const U u)
Definition: safeint_internal.h:566
Definition: safeint_internal.h:61
static SafeIntError RegMultiply(const signed __int64 &a, signed __int32 b, signed __int64 &ret)
Definition: safeint_internal.h:1199
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2248
Definition: safeint_internal.h:1688
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2594
Definition: safeint_internal.h:73
Definition: safeint_internal.h:1055
Definition: safeint_internal.h:2079
static SafeIntError Multiply(const __int64 &t, const U &u, __int64 &ret)
Definition: safeint_internal.h:1428
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:332
Definition: safeint_internal.h:2089
Definition: safeint_internal.h:1694
static SafeIntError RegMultiply(const signed __int64 &a, unsigned __int32 b, signed __int64 &ret)
Definition: safeint_internal.h:1156
Definition: safeint_internal.h:2087
Definition: safeint_internal.h:65
Definition: safeint_internal.h:2746
Definition: safeint_internal.h:62
Definition: safeint_internal.h:2080
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2235
Definition: safeint_internal.h:1684
static SafeIntError RegMultiply(unsigned __int32 a, const unsigned __int64 &b, unsigned __int32 &ret)
Definition: safeint_internal.h:1058
Definition: safeint_internal.h:178
Definition: safeint_internal.h:1682
Definition: safeint_internal.h:174
Definition: safeint_internal.h:327
Definition: safeint_internal.h:1677
Definition: safeint_internal.h:51
Definition: safeint_internal.h:107
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2346
static SafeIntError RegMultiply(signed __int32 a, const signed __int64 &b, signed __int32 &ret)
Definition: safeint_internal.h:1252
Definition: safeint_internal.h:197
static SafeIntError Multiply(const T &t, const U &u, T &ret)
Definition: safeint_internal.h:782
Definition: safeint_internal.h:720
ComparisonMethod
Definition: safeint_internal.h:446
Definition: safeint_internal.h:184
Definition: safeint_internal.h:244
Definition: safeint_internal.h:284
static SafeIntError Multiply(T t, const __int64 &u, T &ret)
Definition: safeint_internal.h:1486
static SafeIntError Multiply(const unsigned __int64 &t, const unsigned __int64 &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1350
static SafeIntError Multiply(const unsigned __int64 &t, const U &u, unsigned __int64 &ret)
Definition: safeint_internal.h:1390
Definition: safeint_internal.h:2175
static SafeIntError Divide(const T &t, const U &u, T &result)
Definition: safeint_internal.h:1653
Definition: safeint_internal.h:177
SubtractionState
Definition: safeint_internal.h:2074
Definition: safeint_internal.h:1687
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:1773
Definition: safeint_internal.h:730
Definition: safeint_internal.h:75
static SafeIntError Subtract(const U &lhs, const T &rhs, T &result)
Definition: safeint_internal.h:2636
Definition: safeint_internal.h:286
static SafeIntError Multiply(T t, const unsigned __int64 &u, T &ret)
Definition: safeint_internal.h:1457
static SafeIntError Cast(U u, T &t)
Definition: safeint_internal.h:414
Definition: safeint_internal.h:176
Definition: safeint_internal.h:2083
#define true
Definition: stdbool.h:12
Definition: safeint_internal.h:2743
static SafeIntError Addition(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2016
static SafeIntError Multiply(const __int64 &t, const unsigned __int64 &u, __int64 &ret)
Definition: safeint_internal.h:1476
static T Or(T lhs, U rhs)
Definition: safeint_internal.h:2838
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2530
Definition: safeint_internal.h:1504
CastMethod
Definition: safeint_internal.h:281
Definition: safeint_internal.h:2102
static T Xor(T lhs, U rhs)
Definition: safeint_internal.h:2868
Definition: safeint_internal.h:51
#define _SAFEINT_UNSIGNED_NEGATION_BEHAVIOR()
Definition: safeint.h:244
Definition: safeint_internal.h:2095
static SafeIntError Subtract(const T &lhs, const U &rhs, T &result)
Definition: safeint_internal.h:2456
static SafeIntError Multiply(const T &t, const unsigned __int64 &u, T &ret)
Definition: safeint_internal.h:1371
Definition: safeint_internal.h:448
Definition: safeint_internal.h:2846
static SafeIntError RegMultiply(unsigned __int32 a, const signed __int64 &b, unsigned __int32 &ret)
Definition: safeint_internal.h:1088
Definition: safeint_internal.h:728
#define _SAFEINT_BINARY_ASSERT(x)
Definition: safeint.h:233