mingw-5.1.4/win32/include/largeint.h
changeset 0 76b1f169d9fe
equal deleted inserted replaced
-1:000000000000 0:76b1f169d9fe
       
     1 /*
       
     2   largeint.h
       
     3 
       
     4   Header for 64 bit integer arithmetics library
       
     5 
       
     6  */
       
     7 #ifndef _LARGEINT_H
       
     8 #define _LARGEINT_H
       
     9 #if __GNUC__ >=3
       
    10 #pragma GCC system_header
       
    11 #endif
       
    12 
       
    13 #include <windows.h>
       
    14 
       
    15 #ifdef __cplusplus
       
    16 extern "C" {
       
    17 #endif
       
    18 
       
    19 #ifdef _HAVE_INT64
       
    20 #define _toi (__int64)
       
    21 #define _toui (unsigned __int64)
       
    22 #else
       
    23 #error "64 bit integers not supported"
       
    24 #endif
       
    25 
       
    26 /*
       
    27   We don't let the compiler see the prototypes if we are compiling the
       
    28   library because if it does it will choke on conflicting types in the
       
    29   prototypes.
       
    30 */
       
    31 
       
    32 #if defined(LARGEINT_PROTOS) || defined(__COMPILING_LARGEINT)
       
    33 
       
    34 #ifndef __COMPILING_LARGEINT
       
    35 /* addition/subtraction */
       
    36 LARGE_INTEGER WINAPI LargeIntegerAdd (LARGE_INTEGER, LARGE_INTEGER);
       
    37 LARGE_INTEGER WINAPI LargeIntegerSubtract (LARGE_INTEGER, LARGE_INTEGER);
       
    38 
       
    39 /* bit operations */
       
    40 LARGE_INTEGER WINAPI LargeIntegerArithmeticShift (LARGE_INTEGER, int);
       
    41 LARGE_INTEGER WINAPI LargeIntegerShiftLeft (LARGE_INTEGER, int);
       
    42 LARGE_INTEGER WINAPI LargeIntegerShiftRight (LARGE_INTEGER, int);
       
    43 LARGE_INTEGER WINAPI LargeIntegerNegate (LARGE_INTEGER);
       
    44 
       
    45 /* conversion */
       
    46 LARGE_INTEGER WINAPI ConvertLongToLargeInteger (LONG);
       
    47 LARGE_INTEGER WINAPI ConvertUlongToLargeInteger (ULONG);
       
    48 
       
    49 /* multiplication */
       
    50 LARGE_INTEGER WINAPI EnlargedIntegerMultiply (LONG, LONG);
       
    51 LARGE_INTEGER WINAPI EnlargedUnsignedMultiply (ULONG, ULONG);
       
    52 LARGE_INTEGER WINAPI ExtendedIntegerMultiply (LARGE_INTEGER, LONG);
       
    53 /* FIXME: is this not part of largeint? */
       
    54 LARGE_INTEGER WINAPI LargeIntegerMultiply (LARGE_INTEGER, LARGE_INTEGER);
       
    55 #endif /* __COMPILING_LARGEINT */
       
    56 
       
    57 #else
       
    58 
       
    59 #define LargeIntegerAdd(a,b) (LARGE_INTEGER)(_toi(a) + _toi(b))
       
    60 #define LargeIntegerSubtract(a,b) (LARGE_INTEGER)(_toi(a) - _toi(b))
       
    61 #define LargeIntegerRightShift(i,n) (LARGE_INTEGER)(_toi(i) >> (n))
       
    62 #define LargeIntegerArithmeticShift LargeIntegerRightShift
       
    63 #define LargeIntegerLeftShift(i,n) (LARGE_INTEGER)(_toi(i) << (n))
       
    64 #define LargeIntegerNegate(i) (LARGE_INTEGER)(- _toi(i))
       
    65 #define EnlargedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
       
    66 #define EnlargedUnsignedMultiply(a,b) (LARGE_INTEGER)(_toui(a) * _toui(b))
       
    67 #define ExtendedIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
       
    68 /* FIXME: should this exist */
       
    69 #define LargeIntegerMultiply(a,b) (LARGE_INTEGER)(_toi(a) * _toi(b))
       
    70 #define ConvertLongToLargeInteger(l) (LARGE_INTEGER)(_toi(l))
       
    71 #define ConvertUlongToLargeInteger(ul) (LARGE_INTEGER)(_toui(ul))
       
    72 
       
    73 #endif /* LARGEINT_PROTOS || __COMPILING_LARGEINT */
       
    74 
       
    75 #ifndef __COMPILING_LARGEINT
       
    76 /* division; no macros of these because of multiple expansion */
       
    77 LARGE_INTEGER WINAPI LargeIntegerDivide (LARGE_INTEGER, LARGE_INTEGER, PLARGE_INTEGER);
       
    78 ULONG WINAPI EnlargedUnsignedDivide (ULARGE_INTEGER, ULONG, PULONG);
       
    79 LARGE_INTEGER WINAPI ExtendedLargeIntegerDivide (LARGE_INTEGER, ULONG, PULONG);
       
    80 LARGE_INTEGER WINAPI ExtendedMagicDivide (LARGE_INTEGER, LARGE_INTEGER, int);
       
    81 #endif /* __COMPILING_LARGEINT */
       
    82 
       
    83 #define LargeIntegerAnd(dest, src, m) \
       
    84 { \
       
    85   dest._STRUCT_NAME(u.)LowPart = s._STRUCT_NAME(u.)LowPart & m._STRUCT_NAME(u.)LowPart; \
       
    86   dest._STRUCT_NAME(u.)HighPart = s._STRUCT_NAME(u.)HighPart & m._STRUCT_NAME(u.)HighPart; \
       
    87 }
       
    88 
       
    89 /* comparision */
       
    90 #define LargeIntegerGreaterThan(a,b) (_toi(a) > _toi(b))
       
    91 #define LargeIntegerGreaterThanOrEqual(a,b) (_toi(a) >= _toi(b))
       
    92 #define LargeIntegerEqualTo(a,b) (_toi(a) == _toi(b))
       
    93 #define LargeIntegerNotEqualTo(a,b) (_toi(a) != _toi(b))
       
    94 #define LargeIntegerLessThan(a,b) (_toi(a) < _toi(b))
       
    95 #define LargeIntegerLessThanOrEqualTo(a,b) (_toi(a) <= _toi(b))
       
    96 #define LargeIntegerGreaterThanZero(a) (_toi(a) > 0)
       
    97 #define LargeIntegerGreaterOrEqualToZero(a) ((a)._STRUCT_NAME(u.)HighPart > 0)
       
    98 #define LargeIntegerEqualToZero(a) !((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart)
       
    99 #define LargeIntegerNotEqualToZero(a) ((a)._STRUCT_NAME(u.)LowPart | (a)._STRUCT_NAME(u.)HighPart)
       
   100 #define LargeIntegerLessThanZero(a) ((a)._STRUCT_NAME(u.)HighPart < 0)
       
   101 #define LargeIntegerLessOrEqualToZero(a) (_toi(a) <= 0)
       
   102 
       
   103 #ifndef __COMPILING_LARGEINT
       
   104 #undef _toi
       
   105 #undef _toui
       
   106 #endif
       
   107 
       
   108 #ifdef __cplusplus
       
   109 }
       
   110 #endif
       
   111 
       
   112 #endif /* _LARGEINT_H */