OSDN Git Service

Refactor <wtypes.h> vs. <nspapi.h> and WinSock headers.
[mingw/mingw-org-wsl.git] / w32api / include / largeint.h
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 */