X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/21b9b5e2925776b0b63a4f44558d325351013a0b..7b504551c292ecb4296693983161ac5ad03745f6:/src/common/longlong.cpp diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index e3d6a56586..b61b13d159 100644 --- a/src/common/longlong.cpp +++ b/src/common/longlong.cpp @@ -15,10 +15,6 @@ // headers // ============================================================================ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "longlong.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ @@ -35,6 +31,8 @@ #include // for memset() #endif +#include "wx/ioswrap.h" + // ============================================================================ // implementation // ============================================================================ @@ -49,14 +47,14 @@ void *wxLongLongNative::asArray() const { static unsigned char temp[8]; - temp[0] = (unsigned char)((m_ll >> 56) & 0xFF); - temp[1] = (unsigned char)((m_ll >> 48) & 0xFF); - temp[2] = (unsigned char)((m_ll >> 40) & 0xFF); - temp[3] = (unsigned char)((m_ll >> 32) & 0xFF); - temp[4] = (unsigned char)((m_ll >> 24) & 0xFF); - temp[5] = (unsigned char)((m_ll >> 16) & 0xFF); - temp[6] = (unsigned char)((m_ll >> 8) & 0xFF); - temp[7] = (unsigned char)((m_ll >> 0) & 0xFF); + temp[0] = wx_truncate_cast(unsigned char, ((m_ll >> 56) & 0xFF)); + temp[1] = wx_truncate_cast(unsigned char, ((m_ll >> 48) & 0xFF)); + temp[2] = wx_truncate_cast(unsigned char, ((m_ll >> 40) & 0xFF)); + temp[3] = wx_truncate_cast(unsigned char, ((m_ll >> 32) & 0xFF)); + temp[4] = wx_truncate_cast(unsigned char, ((m_ll >> 24) & 0xFF)); + temp[5] = wx_truncate_cast(unsigned char, ((m_ll >> 16) & 0xFF)); + temp[6] = wx_truncate_cast(unsigned char, ((m_ll >> 8) & 0xFF)); + temp[7] = wx_truncate_cast(unsigned char, ((m_ll >> 0) & 0xFF)); return temp; } @@ -65,14 +63,14 @@ void *wxULongLongNative::asArray() const { static unsigned char temp[8]; - temp[0] = (unsigned char)((m_ll >> 56) & 0xFF); - temp[1] = (unsigned char)((m_ll >> 48) & 0xFF); - temp[2] = (unsigned char)((m_ll >> 40) & 0xFF); - temp[3] = (unsigned char)((m_ll >> 32) & 0xFF); - temp[4] = (unsigned char)((m_ll >> 24) & 0xFF); - temp[5] = (unsigned char)((m_ll >> 16) & 0xFF); - temp[6] = (unsigned char)((m_ll >> 8) & 0xFF); - temp[7] = (unsigned char)((m_ll >> 0) & 0xFF); + temp[0] = wx_truncate_cast(unsigned char, ((m_ll >> 56) & 0xFF)); + temp[1] = wx_truncate_cast(unsigned char, ((m_ll >> 48) & 0xFF)); + temp[2] = wx_truncate_cast(unsigned char, ((m_ll >> 40) & 0xFF)); + temp[3] = wx_truncate_cast(unsigned char, ((m_ll >> 32) & 0xFF)); + temp[4] = wx_truncate_cast(unsigned char, ((m_ll >> 24) & 0xFF)); + temp[5] = wx_truncate_cast(unsigned char, ((m_ll >> 16) & 0xFF)); + temp[6] = wx_truncate_cast(unsigned char, ((m_ll >> 8) & 0xFF)); + temp[7] = wx_truncate_cast(unsigned char, ((m_ll >> 0) & 0xFF)); return temp; } @@ -132,6 +130,19 @@ wxLongLongWx& wxLongLongWx::Assign(double d) return *this; } +double wxLongLongWx::ToDouble() const +{ + double d = m_hi; + d *= 1.0 + (double)ULONG_MAX; + d += m_lo; + +#ifdef wxLONGLONG_TEST_MODE + wxASSERT( d == m_ll ); +#endif // wxLONGLONG_TEST_MODE + + return d; +} + wxLongLongWx wxLongLongWx::operator<<(int shift) const { wxLongLongWx ll(*this); @@ -777,9 +788,11 @@ wxULongLongWx& wxULongLongWx::operator*=(const wxULongLongWx& ll) // division +#define IS_MSB_SET(ll) ((ll.GetHi()) & (1 << (8*sizeof(long) - 1))) + void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, wxLongLongWx& quotient, - wxLongLongWx& remainder) const + wxLongLongWx& remainderIO) const { if ((divisorIn.m_lo == 0) && (divisorIn.m_hi == 0)) { @@ -803,8 +816,7 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, // all responsibility for using this code. // init everything - wxLongLongWx dividend = *this, - divisor = divisorIn; + wxULongLongWx dividend, divisor, remainder; quotient = 0l; remainder = 0l; @@ -817,17 +829,21 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, // dividend = quotient*divisor + remainder // // with 0 <= abs(remainder) < abs(divisor) - bool negRemainder = dividend.m_hi < 0; + bool negRemainder = GetHi() < 0; bool negQuotient = false; // assume positive - if ( dividend.m_hi < 0 ) + if ( GetHi() < 0 ) { negQuotient = !negQuotient; - dividend = -dividend; + dividend = -*this; + } else { + dividend = *this; } - if ( divisor.m_hi < 0 ) + if ( divisorIn.GetHi() < 0 ) { negQuotient = !negQuotient; - divisor = -divisor; + divisor = -divisorIn; + } else { + divisor = divisorIn; } // check for some particular cases @@ -845,8 +861,6 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, size_t nBits = 64u; wxLongLongWx d; - #define IS_MSB_SET(ll) ((ll.m_hi) & (1 << (8*sizeof(long) - 1))) - while ( remainder < divisor ) { remainder <<= 1; @@ -886,10 +900,12 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, } } + remainderIO = remainder; + // adjust signs if ( negRemainder ) { - remainder = -remainder; + remainderIO = -remainderIO; } if ( negQuotient ) @@ -945,8 +961,6 @@ void wxULongLongWx::Divide(const wxULongLongWx& divisorIn, size_t nBits = 64u; wxULongLongWx d; - #define IS_MSB_SET(ll) ((ll.m_hi) & (1 << (8*sizeof(long) - 1))) - while ( remainder < divisor ) { remainder <<= 1;