|
|
// Num64.h -- Classes for 64-bit integers and unsigned numbers
// We define two classes here which provide arithmetic and bit shifting functions
// for 64-bit signed and unsigned numbers. We use these classes instead of the
// LONGLONG and DWORDLONG types so this code can be ported to environments which
// don't have direct support for 64-bit data. In this implmentation we use inline
// functions as a thin layer around the 64-bit support available in the Win32
// environment.
class CULINT;
class CLINT { public:
CLINT(); CLINT(CLINT& cli); CLINT(LARGE_INTEGER li); CLINT(ULARGE_INTEGER uli); CLINT(LONGLONG ll); CLINT(CULINT culi);
BOOL NonZero();
friend CLINT operator- (const CLINT& cliRight); friend CLINT operator+ (const CLINT& cliLeft, const CLINT& cliRight); friend CLINT operator- (const CLINT& cliLeft, const CLINT& cliRight); friend CLINT operator* (const CLINT& cliLeft, const CLINT& cliRight); friend CLINT operator/ (const CLINT& cliLeft, const CLINT& cliRight); friend CLINT operator| (const CLINT& cliLeft, const CLINT& cliRight); friend CLINT operator<< (const CLINT& cliLeft, UINT cbits); friend CLINT operator>> (const CLINT& cliLeft, UINT cbits); friend BOOL operator< (const CLINT& cliLeft, const CLINT& cliRight); friend BOOL operator<= (const CLINT& cliLeft, const CLINT& cliRight); friend BOOL operator== (const CLINT& cliLeft, const CLINT& cliRight); friend BOOL operator>= (const CLINT& cliLeft, const CLINT& cliRight); friend BOOL operator> (const CLINT& cliLeft, const CLINT& cliRight); friend BOOL operator!= (const CLINT& cliLeft, const CLINT& cliRight); CLINT& operator= (const CLINT& cliRight); CLINT& operator+= (const CLINT& cliRight); CLINT& operator-= (const CLINT& cliRight); CLINT& operator*= (const CLINT& cliRight); CLINT& operator/= (const CLINT& cliRight); CLINT& operator|= (const CLINT& cliRight); CLINT& operator<<=(UINT cbits); CLINT& operator>>=(UINT cbits);
LARGE_INTEGER Li(); LONGLONG Ll();
private: LONGLONG QuadPart; };
typedef CLINT *PCLINT;
class CULINT { public:
CULINT(); CULINT(CULINT& cli); CULINT(LARGE_INTEGER li); CULINT(ULARGE_INTEGER uli); CULINT(DWORDLONG dwl); CULINT(CLINT cli);
BOOL NonZero();
friend CULINT operator- (const CULINT& culiRight); friend CULINT operator+ (const CULINT& culiLeft, const CULINT& culiRight); friend CULINT operator- (const CULINT& culiLeft, const CULINT& culiRight); friend CULINT operator* (const CULINT& culiLeft, const CULINT& culiRight); friend CULINT operator/ (const CULINT& culiLeft, const CULINT& culiRight); friend CULINT operator| (const CULINT& culiLeft, const CULINT& culiRight); friend CULINT operator<< (const CULINT& culiLeft, UINT cbits); friend CULINT operator>> (const CULINT& culiLeft, UINT cbits); friend BOOL operator< (const CULINT& culiLeft, const CULINT& culiRight); friend BOOL operator<= (const CULINT& culiLeft, const CULINT& culiRight); friend BOOL operator== (const CULINT& culiLeft, const CULINT& culiRight); friend BOOL operator>= (const CULINT& culiLeft, const CULINT& culiRight); friend BOOL operator> (const CULINT& culiLeft, const CULINT& culiRight); friend BOOL operator!= (const CULINT& culiLeft, const CULINT& culiRight); CULINT& operator= (const CULINT& culiRight); CULINT& operator+= (const CULINT& culiRight); CULINT& operator-= (const CULINT& culiRight); CULINT& operator*= (const CULINT& culiRight); CULINT& operator/= (const CULINT& culiRight); CULINT& operator|= (const CULINT& culiRight); CULINT& operator<<=(UINT cbits); CULINT& operator>>=(UINT cbits);
ULARGE_INTEGER Uli(); DWORDLONG Ull();
private: DWORDLONG QuadPart; };
typedef CULINT *PCULINT;
inline CLINT::CLINT() { }
inline CLINT::CLINT(CLINT& cli) { QuadPart = cli.QuadPart; }
inline CLINT::CLINT(LARGE_INTEGER li) { QuadPart = li.QuadPart; }
inline CLINT::CLINT(ULARGE_INTEGER uli) { QuadPart = (LONGLONG) uli.QuadPart; }
inline CLINT::CLINT(CULINT culi) { QuadPart = (LONGLONG) culi.Uli().QuadPart; }
inline CLINT::CLINT(LONGLONG ll) { QuadPart = ll; }
inline BOOL CLINT::NonZero() { return QuadPart != 0; }
inline CLINT operator- (const CLINT& cliRight) { CLINT cliResult(-cliRight.QuadPart);
return cliResult; }
inline CLINT operator+ (const CLINT& cliLeft, const CLINT& cliRight) { CLINT cliResult(cliLeft.QuadPart + cliRight.QuadPart);
return cliResult; }
inline CLINT operator- (const CLINT& cliLeft, const CLINT& cliRight) { CLINT cliResult(cliLeft.QuadPart - cliRight.QuadPart);
return cliResult; }
inline CLINT operator* (const CLINT& cliLeft, const CLINT& cliRight) { CLINT cliResult(cliLeft.QuadPart * cliRight.QuadPart);
return cliResult; }
inline CLINT operator/ (const CLINT& cliLeft, const CLINT& cliRight) { CLINT cliResult(cliLeft.QuadPart / cliRight.QuadPart);
return cliResult; }
inline CLINT operator| (const CLINT& cliLeft, const CLINT& cliRight) { CLINT cliResult(cliLeft.QuadPart | cliRight.QuadPart);
return cliResult; }
inline CLINT operator<< (const CLINT& cliLeft, UINT cbits) { CLINT cliResult(cliLeft.QuadPart << cbits);
return cliResult; }
inline CLINT operator>> (const CLINT& cliLeft, UINT cbits) { CLINT cliResult(cliLeft.QuadPart >> cbits);
return cliResult; }
inline BOOL operator< (const CLINT& cliLeft, const CLINT& cliRight) { return cliLeft.QuadPart < cliLeft.QuadPart; }
inline BOOL operator<= (const CLINT& cliLeft, const CLINT& cliRight) { return cliLeft.QuadPart <= cliLeft.QuadPart; }
inline BOOL operator== (const CLINT& cliLeft, const CLINT& cliRight) { return cliLeft.QuadPart == cliLeft.QuadPart; }
inline BOOL operator>= (const CLINT& cliLeft, const CLINT& cliRight) { return cliLeft.QuadPart >= cliLeft.QuadPart; }
inline BOOL operator> (const CLINT& cliLeft, const CLINT& cliRight) { return cliLeft.QuadPart > cliLeft.QuadPart; }
inline BOOL operator!= (const CLINT& cliLeft, const CLINT& cliRight) { return cliLeft.QuadPart != cliLeft.QuadPart; }
inline CLINT& CLINT::operator= (const CLINT& cliRight) { QuadPart = cliRight.QuadPart;
return *this; }
inline CLINT& CLINT::operator+= (const CLINT& cliRight) { QuadPart += cliRight.QuadPart;
return *this; }
inline CLINT& CLINT::operator-= (const CLINT& cliRight) { QuadPart -= cliRight.QuadPart;
return *this; }
inline CLINT& CLINT::operator*= (const CLINT& cliRight) { QuadPart *= cliRight.QuadPart;
return *this; }
inline CLINT& CLINT::operator/= (const CLINT& cliRight) { QuadPart /= cliRight.QuadPart;
return *this; }
inline CLINT& CLINT::operator|= (const CLINT& cliRight) { QuadPart |= cliRight.QuadPart;
return *this; }
inline CLINT& CLINT::operator<<=(UINT cbits) { QuadPart <<= cbits;
return *this; }
inline CLINT& CLINT::operator>>=(UINT cbits) { QuadPart >>= cbits;
return *this; }
inline LARGE_INTEGER CLINT::Li() { LARGE_INTEGER li;
li.QuadPart = QuadPart;
return li; }
inline LONGLONG CLINT::Ll() { return QuadPart; }
inline CULINT::CULINT() { }
inline CULINT::CULINT(CULINT& culi) { QuadPart = culi.QuadPart; }
inline CULINT::CULINT(LARGE_INTEGER li) { QuadPart = (DWORDLONG) li.QuadPart; }
inline CULINT::CULINT(ULARGE_INTEGER uli) { QuadPart = uli.QuadPart; } inline CULINT::CULINT(DWORDLONG dwl) { QuadPart = dwl; }
inline CULINT::CULINT(CLINT cli) { QuadPart = (DWORDLONG) cli.Li().QuadPart; }
inline BOOL CULINT::NonZero() { return QuadPart != 0; }
inline CULINT operator- (const CULINT& culiRight) { #pragma warning( disable : 4146 )
CULINT ulint(-culiRight.QuadPart);
return ulint; }
inline CULINT operator+ (const CULINT& culiLeft, const CULINT& culiRight) { CULINT ulint(culiLeft.QuadPart + culiRight.QuadPart);
return ulint; }
inline CULINT operator- (const CULINT& culiLeft, const CULINT& culiRight) { CULINT ulint(culiLeft.QuadPart - culiRight.QuadPart);
return ulint; }
inline CULINT operator* (const CULINT& culiLeft, const CULINT& culiRight) { CULINT ulint(culiLeft.QuadPart * culiRight.QuadPart);
return ulint; }
inline CULINT operator/ (const CULINT& culiLeft, const CULINT& culiRight) { CULINT ulint(culiLeft.QuadPart / culiRight.QuadPart);
return ulint; }
inline CULINT operator| (const CULINT& culiLeft, const CULINT& culiRight) { CULINT ulint(culiLeft.QuadPart | culiRight.QuadPart);
return ulint; }
inline CULINT operator<< (const CULINT& culiLeft, UINT cbits) { CULINT ulint(culiLeft.QuadPart << cbits);
return ulint; }
inline CULINT operator>> (const CULINT& culiLeft, UINT cbits) { CULINT ulint(culiLeft.QuadPart >> cbits);
return ulint; }
inline CULINT& CULINT::operator= (const CULINT& culiRight) { QuadPart = culiRight.QuadPart;
return *this; }
inline CULINT& CULINT::operator+= (const CULINT& culiRight) { QuadPart += culiRight.QuadPart;
return *this; }
inline CULINT& CULINT::operator-= (const CULINT& culiRight) { QuadPart -= culiRight.QuadPart;
return *this; }
inline CULINT& CULINT::operator*= (const CULINT& culiRight) { QuadPart *= culiRight.QuadPart;
return *this; }
inline CULINT& CULINT::operator/= (const CULINT& culiRight) { QuadPart /= culiRight.QuadPart;
return *this; }
inline CULINT& CULINT::operator|= (const CULINT& culiRight) { QuadPart |= culiRight.QuadPart;
return *this; }
inline CULINT& CULINT::operator<<=(UINT cbits) { QuadPart <<= cbits;
return *this; }
inline CULINT& CULINT::operator>>=(UINT cbits) { QuadPart >>= cbits;
return *this; }
inline BOOL operator< (const CULINT& culiLeft, const CULINT& culiRight) { return culiLeft.QuadPart < culiRight.QuadPart; }
inline BOOL operator<= (const CULINT& culiLeft, const CULINT& culiRight) { return culiLeft.QuadPart <= culiRight.QuadPart; }
inline BOOL operator== (const CULINT& culiLeft, const CULINT& culiRight) { return culiLeft.QuadPart == culiRight.QuadPart; }
inline BOOL operator>= (const CULINT& culiLeft, const CULINT& culiRight) { return culiLeft.QuadPart >= culiRight.QuadPart; }
inline BOOL operator> (const CULINT& culiLeft, const CULINT& culiRight) { return culiLeft.QuadPart > culiRight.QuadPart; }
inline BOOL operator!= (const CULINT& culiLeft, const CULINT& culiRight) { return culiLeft.QuadPart != culiRight.QuadPart; }
inline ULARGE_INTEGER CULINT::Uli() { ULARGE_INTEGER uli;
uli.QuadPart = QuadPart;
return uli; }
inline DWORDLONG CULINT::Ull() { return QuadPart; }
|