/*++ Copyright (c) 1991 Microsoft Corporation Module Name: bigint.hxx Abstract: The BIG_INT class models a 64 bit signed integer. This class is meant to be light and will occupy only 64 bits of space. It should be manipulated exactly as an INT would be. There will be no constructor or destructor. A BIG_INT will be uninitialized until a value is assigned to it. This implementation of BIG_INT uses the NT LARGE_INTEGER structure. --*/ #if !defined(BIG_INT_DEFN) #define BIG_INT_DEFN #include #if defined ( _AUTOCHECK_ ) || defined( _EFICHECK_ ) #define IFSUTIL_EXPORT #elif defined ( _IFSUTIL_MEMBER_ ) #define IFSUTIL_EXPORT __declspec(dllexport) #else #define IFSUTIL_EXPORT __declspec(dllimport) #endif DEFINE_POINTER_AND_REFERENCE_TYPES( LARGE_INTEGER ); DECLARE_CLASS( BIG_INT ); class BIG_INT { public: NONVIRTUAL BIG_INT( ); NONVIRTUAL BIG_INT( IN const INT LowPart ); NONVIRTUAL BIG_INT( IN const UINT LowPart ); NONVIRTUAL BIG_INT( IN const ULONG LowPart ); NONVIRTUAL BIG_INT( IN const SLONG LowPart ); NONVIRTUAL BIG_INT( IN const LARGE_INTEGER LargeInteger ); NONVIRTUAL BIG_INT( IN const ULONGLONG UlongLong ); NONVIRTUAL VOID operator=( IN const INT LowPart ); NONVIRTUAL VOID operator=( IN const UINT LowPart ); NONVIRTUAL VOID operator=( IN const SLONG LowPart ); NONVIRTUAL VOID operator=( IN const ULONG LowPart ); NONVIRTUAL VOID operator=( IN const LARGE_INTEGER LargeInteger ); NONVIRTUAL VOID operator=( IN const LONG64 Long64 ) { x = Long64; } NONVIRTUAL VOID operator=( IN const ULONG64 Ulong64 ) { x = Ulong64; } NONVIRTUAL VOID Set( IN const ULONG LowPart, IN const SLONG HighPart ); NONVIRTUAL IFSUTIL_EXPORT VOID Set( IN UCHAR ByteCount, IN PCUCHAR CompressedInteger ); NONVIRTUAL const ULONG GetLowPart( ) CONST; NONVIRTUAL const SLONG GetHighPart( ) CONST; NONVIRTUAL LARGE_INTEGER GetLargeInteger( ) CONST; NONVIRTUAL LONGLONG GetQuadPart( ) CONST; NONVIRTUAL IFSUTIL_EXPORT VOID QueryCompressedInteger( OUT PUCHAR ByteCount, OUT PUCHAR CompressedInteger ) CONST; NONVIRTUAL VOID operator+=( IN const BIG_INT BigInt ); NONVIRTUAL BIG_INT operator-( ) CONST; NONVIRTUAL VOID operator-=( IN const BIG_INT BigInt ); FRIEND BIG_INT operator+( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BIG_INT operator-( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BIG_INT operator*( IN const BIG_INT Left, IN const SLONG Right ); FRIEND BIG_INT operator*( IN const SLONG Left, IN const BIG_INT Right ); FRIEND BIG_INT operator/( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BIG_INT operator%( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN operator==( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN operator!=( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN operator<( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN operator<=( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN operator>( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN operator>=( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN CompareLT( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN CompareLTEQ( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN CompareGT( IN const BIG_INT Left, IN const BIG_INT Right ); FRIEND BOOLEAN CompareGTEQ( IN const BIG_INT Left, IN const BIG_INT Right ); private: __int64 x; }; INLINE BIG_INT::BIG_INT( ) /*++ Routine Description: Constructor for BIG_INT. Arguments: None. Return Value: None. --*/ { } INLINE VOID BIG_INT::operator=( IN const INT LowPart ) /*++ Routine Description: This routine copies an INT into a BIG_INT. Arguments: LowPart - Supplies an integer. Return Value: None. --*/ { x = LowPart; } INLINE VOID BIG_INT::operator=( IN const UINT LowPart ) /*++ Routine Description: This routine copies a UINT into a BIG_INT. Arguments: LowPart - Supplies an unsigned integer. Return Value: None. --*/ { x = LowPart; } INLINE VOID BIG_INT::operator=( IN const SLONG LowPart ) /*++ Routine Description: This routine copies a LONG into a BIG_INT. Arguments: LowPart - Supplies a long integer. Return Value: None. --*/ { x = LowPart; } INLINE VOID BIG_INT::operator=( IN const ULONG LowPart ) /*++ Routine Description: This routine copies a ULONG into a BIG_INT. Arguments: LowPart - Supplies an unsigned long integer. Return Value: None. --*/ { x = LowPart; } INLINE VOID BIG_INT::operator=( IN const LARGE_INTEGER LargeInteger ) /*++ Routine Description: This routine copies a LARGE_INTEGER into a BIG_INT. Arguments: LargeInteger -- supplies a large integer Return Value: None. --*/ { x = LargeInteger.QuadPart; } INLINE BIG_INT::BIG_INT( IN const INT LowPart ) /*++ Routine Description: Constructor for BIG_INT. Arguments: LowPart - Supplies an integer. Return Value: None. --*/ { x = LowPart; } INLINE BIG_INT::BIG_INT( IN const UINT LowPart ) /*++ Routine Description: Constructor for BIG_INT. Arguments: LowPart - Supplies an unsigned integer. Return Value: None. --*/ { x = LowPart; } INLINE BIG_INT::BIG_INT( IN const SLONG LowPart ) /*++ Routine Description: Constructor for BIG_INT. Arguments: LowPart - Supplies a long integer. Return Value: None. --*/ { x = LowPart; } INLINE BIG_INT::BIG_INT( IN const ULONG LowPart ) /*++ Routine Description: Constructor for BIG_INT. Arguments: LowPart - Supplies an unsigned long integer. Return Value: None. --*/ { x = LowPart; } INLINE BIG_INT::BIG_INT( IN const LARGE_INTEGER LargeInteger ) /*++ Routine Description: Constructor for BIG_INT to permit initialization with a LARGE_INTEGER Arguments: LargeInteger -- supplies a large integer. Return Value: None. --*/ { x = LargeInteger.QuadPart; } INLINE BIG_INT::BIG_INT( IN const ULONGLONG UlongLong ) /*++ Routine Description: Constructor for BIG_INT to permit initialization with a ULONGLOGN Arguments: UlongLong -- supplies a unsigned 64-bit int. Return Value: None. --*/ { x = UlongLong; } INLINE VOID BIG_INT::Set( IN const ULONG LowPart, IN const SLONG HighPart ) /*++ Routine Description: This routine sets a BIG_INT to an initial value. Arguments: LowPart - Supplies the low part of the BIG_INT. HighPart - Supplies the high part of the BIG_INT. Return Value: None. --*/ { x = (__int64)(((ULONGLONG)HighPart << 32) | LowPart); } INLINE const ULONG BIG_INT::GetLowPart( ) CONST /*++ Routine Description: This routine computes the low part of the BIG_INT. Arguments: None. Return Value: The low part of the BIG_INT. --*/ { return (ULONG)(((ULONGLONG)x) & 0xFFFFFFFF); } // Note: this could probably return an RCLONG, for // greater efficiency, but that generates warnings. INLINE const SLONG BIG_INT::GetHighPart( ) CONST /*++ Routine Description: This routine computes the high part of the BIG_INT. Arguments: None. Return Value: The high part of the BIG_INT. --*/ { LARGE_INTEGER r; r.QuadPart = x; return r.HighPart; } INLINE LARGE_INTEGER BIG_INT::GetLargeInteger( ) CONST /*++ Routine Description: This routine returns the large integer embedded in the BIG_INT. Arguments: None. Return Value: The large-integer value of the BIG_INT. --*/ { LARGE_INTEGER r; r.QuadPart = x; return r; } INLINE LONGLONG BIG_INT::GetQuadPart( ) CONST /*++ Routine Description: This routine returns the large integer embedded in the BIG_INT. Arguments: None. Return Value: The large-integer value of the BIG_INT. --*/ { return x; } INLINE VOID BIG_INT::operator+=( IN const BIG_INT BigInt ) /*++ Routine Description: This routine adds another BIG_INT to this one. Arguments: BigInt - Supplies the BIG_INT to add to the current BIG_INT. Return Value: None. --*/ { x += BigInt.x; } INLINE BIG_INT BIG_INT::operator-( ) CONST /*++ Routine Description: This routine computes the negation of the current BIG_INT. Arguments: None. Return Value: The negation of the current BIG_INT. --*/ { BIG_INT r; r.x = -x; return r; } INLINE VOID BIG_INT::operator-=( IN const BIG_INT BigInt ) /*++ Routine Description: This routine subtracts a BIG_INT from this one. Arguments: BigInt - Supplies a BIG_INT to subtract from the current BIG_INT. Return Value: None. --*/ { x -= BigInt.x; } INLINE BIG_INT operator+( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine computes the sum of two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: The sum of Left and Right. --*/ { BIG_INT r; r.x = Left.x + Right.x; return r; } INLINE BIG_INT operator-( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine computes the difference of two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: The difference between Left and Right. --*/ { BIG_INT r; r.x = Left.x - Right.x; return r; } INLINE BIG_INT operator*( IN const BIG_INT Left, IN const SLONG Right ) /*++ Routine Description: This routine computes the product of a BIG_INT and a LONG. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: The product of Left and Right. --*/ { BIG_INT r; r.x = Left.x * Right; return r; } INLINE BIG_INT operator*( IN const SLONG Left, IN const BIG_INT Right ) /*++ Routine Description: This routine computes the product of a BIG_INT and a LONG. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: The product of Left and Right. --*/ { return Right*Left; } INLINE BIG_INT operator/( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine computes the quotient of two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: The quotient of Left and Right. --*/ { BIG_INT r; r.x = Left.x / Right.x; return r; } INLINE BIG_INT operator%( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine computes the modulus of two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: The modulus of Left and Right. --*/ { BIG_INT r; r.x = Left.x % Right.x; return r; } INLINE BOOLEAN operator<( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not less than Right. TRUE - Left is less than Right. --*/ { return Left.x < Right.x; } INLINE BOOLEAN operator<=( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not less than or equal to Right. TRUE - Left is less than or equal to Right. --*/ { return Left.x <= Right.x; } INLINE BOOLEAN operator>( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not greater than Right. TRUE - Left is greater than Right. --*/ { return Left.x > Right.x; } INLINE BOOLEAN operator>=( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not greater than or equal to Right. TRUE - Left is greater than or equal to Right. --*/ { return Left.x >= Right.x; } INLINE BOOLEAN operator==( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs for equality. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not equal to Right. TRUE - Left is equal to Right. --*/ { return Left.x == Right.x; } INLINE BOOLEAN operator!=( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs for equality. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is equal to Right. TRUE - Left is not equal to Right. --*/ { return Left.x != Right.x; } INLINE BOOLEAN CompareGTEQ( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs by treating them as unsigned numbers. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not greater than or equal to Right. TRUE - Left is greater than or equal to Right. --*/ { return (unsigned __int64)Left.x >= (unsigned __int64)Right.x; } INLINE BOOLEAN CompareGT( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs by treating them as unsigned numbers. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not greater than Right. TRUE - Left is greater than Right. --*/ { return (unsigned __int64)Left.x > (unsigned __int64)Right.x; } INLINE BOOLEAN CompareLTEQ( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs by treating them as unsigned numbers. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not less than or equal to Right. TRUE - Left is less than or equal to Right. --*/ { return (unsigned __int64)Left.x <= (unsigned __int64)Right.x; } INLINE BOOLEAN CompareLT( IN const BIG_INT Left, IN const BIG_INT Right ) /*++ Routine Description: This routine compares two BIG_INTs by treating them as unsigned numbers. Arguments: Left - Supplies the left argument. Right - Supplies the right argument. Return Value: FALSE - Left is not less than Right. TRUE - Left is less than Right. --*/ { return (unsigned __int64)Left.x < (unsigned __int64)Right.x; } #endif // BIG_INT_DEFN