X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f644b28c1154d638270d0d1abbc41f760be6abbd..a98ce49a41630c2eabb266fe1597d4e279545023:/src/common/longlong.cpp?ds=sidebyside diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index ba2c4100fb..e3d6a56586 100644 --- a/src/common/longlong.cpp +++ b/src/common/longlong.cpp @@ -27,6 +27,7 @@ #if wxUSE_LONGLONG #include "wx/longlong.h" +#include "wx/math.h" // for fabs() #if defined(__MWERKS__) && defined(__WXMSW__) #include // for memset() @@ -34,8 +35,6 @@ #include // for memset() #endif -#include // for fabs() - // ============================================================================ // implementation // ============================================================================ @@ -50,14 +49,14 @@ void *wxLongLongNative::asArray() const { static unsigned char temp[8]; - temp[0] = (m_ll >> 56) & 0xFF; - temp[1] = (m_ll >> 48) & 0xFF; - temp[2] = (m_ll >> 40) & 0xFF; - temp[3] = (m_ll >> 32) & 0xFF; - temp[4] = (m_ll >> 24) & 0xFF; - temp[5] = (m_ll >> 16) & 0xFF; - temp[6] = (m_ll >> 8) & 0xFF; - temp[7] = (m_ll >> 0) & 0xFF; + 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); return temp; } @@ -66,18 +65,37 @@ void *wxULongLongNative::asArray() const { static unsigned char temp[8]; - temp[0] = (m_ll >> 56) & 0xFF; - temp[1] = (m_ll >> 48) & 0xFF; - temp[2] = (m_ll >> 40) & 0xFF; - temp[3] = (m_ll >> 32) & 0xFF; - temp[4] = (m_ll >> 24) & 0xFF; - temp[5] = (m_ll >> 16) & 0xFF; - temp[6] = (m_ll >> 8) & 0xFF; - temp[7] = (m_ll >> 0) & 0xFF; + 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); return temp; } +#if wxUSE_LONGLONG_WX +wxLongLongNative::wxLongLongNative(wxLongLongWx ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ll.GetLo(); +} + +wxLongLongNative& wxLongLongNative::operator=(wxLongLongWx ll) +{ + // assign first to avoid precision loss! + m_ll = ll.GetHi(); + m_ll <<= 32; + m_ll |= ll.GetLo(); + return *this; +} +#endif + #endif // wxUSE_LONGLONG_NATIVE // ============================================================================ @@ -426,10 +444,14 @@ wxLongLongWx wxLongLongWx::operator-(const wxLongLongWx& ll) const return res; } -wxULongLongWx wxULongLongWx::operator-(const wxULongLongWx& ll) const +wxLongLongWx wxULongLongWx::operator-(const wxULongLongWx& ll) const { - wxULongLongWx res(*this); - res -= ll; + wxASSERT(m_hi <= LONG_MAX ); + wxASSERT(ll.m_hi <= LONG_MAX ); + + wxLongLongWx res( (long)m_hi , m_lo ); + wxLongLongWx op( (long)ll.m_hi , ll.m_lo ); + res -= op; return res; } @@ -729,7 +751,7 @@ wxULongLongWx& wxULongLongWx::operator*=(const wxULongLongWx& ll) m_hi = m_lo = 0; #ifdef wxLONGLONG_TEST_MODE - unsigned wxLongLong_t llOld = m_ll; + wxULongLong_t llOld = m_ll; m_ll = 0; #endif // wxLONGLONG_TEST_MODE @@ -819,7 +841,7 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, } else { - // here: dividend > divisor and both are positibe: do unsigned division + // here: dividend > divisor and both are positive: do unsigned division size_t nBits = 64u; wxLongLongWx d; @@ -1062,75 +1084,82 @@ void *wxULongLongWx::asArray(void) const #endif // wxUSE_LONGLONG_WX -wxString -#if wxUSE_LONGLONG_NATIVE -wxLongLongNative::ToString() const -#else -wxLongLongWx::ToString() const -#endif -{ - // TODO: this is awfully inefficient, anything better? - wxString result; - - wxLongLong ll = *this; - - bool neg; - if ( ll < 0 ) - { - ll.Negate(); - neg = true; - } - else - { - neg = false; +#define LL_TO_STRING(name) \ + wxString name::ToString() const \ + { \ + /* TODO: this is awfully inefficient, anything better? */ \ + wxString result; \ + \ + name ll = *this; \ + \ + bool neg = ll < 0; \ + if ( neg ) \ + { \ + while ( ll != 0 ) \ + { \ + long digit = (ll % 10).ToLong(); \ + result.Prepend((wxChar)(_T('0') - digit)); \ + ll /= 10; \ + } \ + } \ + else \ + { \ + while ( ll != 0 ) \ + { \ + long digit = (ll % 10).ToLong(); \ + result.Prepend((wxChar)(_T('0') + digit)); \ + ll /= 10; \ + } \ + } \ + \ + if ( result.empty() ) \ + result = _T('0'); \ + else if ( neg ) \ + result.Prepend(_T('-')); \ + \ + return result; \ } - while ( ll != 0 ) - { - result.Prepend((wxChar)(_T('0') + (ll % 10).ToLong())); - ll /= 10; +#define ULL_TO_STRING(name) \ + wxString name::ToString() const \ + { \ + /* TODO: this is awfully inefficient, anything better? */ \ + wxString result; \ + \ + name ll = *this; \ + \ + while ( ll != 0 ) \ + { \ + result.Prepend((wxChar)(_T('0') + (ll % 10).ToULong())); \ + ll /= 10; \ + } \ + \ + if ( result.empty() ) \ + result = _T('0'); \ + \ + return result; \ } - if ( result.empty() ) - result = _T('0'); - else if ( neg ) - result.Prepend(_T('-')); - - return result; -} - -wxString #if wxUSE_LONGLONG_NATIVE -wxULongLongNative::ToString() const -#else -wxULongLongWx::ToString() const + LL_TO_STRING(wxLongLongNative) + ULL_TO_STRING(wxULongLongNative) #endif -{ - // TODO: this is awfully inefficient, anything better? - wxString result; - - wxULongLong ll = *this; - - while ( ll != 0 ) - { - result.Prepend((wxChar)(_T('0') + (ll % 10).ToULong())); - ll /= 10; - } - if ( result.empty() ) - result = _T('0'); - - return result; -} +#if wxUSE_LONGLONG_WX + LL_TO_STRING(wxLongLongWx) + ULL_TO_STRING(wxULongLongWx) +#endif #if wxUSE_STD_IOSTREAM // input/output +WXDLLIMPEXP_BASE wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLong& ll) { return o << ll.ToString(); } +WXDLLIMPEXP_BASE wxSTD ostream& operator<< (wxSTD ostream& o, const wxULongLong& ll) { return o << ll.ToString(); @@ -1138,4 +1167,14 @@ wxSTD ostream& operator<< (wxSTD ostream& o, const wxULongLong& ll) #endif // wxUSE_STD_IOSTREAM +WXDLLIMPEXP_BASE wxString& operator<< (wxString& s, const wxLongLong& ll) +{ + return s << ll.ToString(); +} + +WXDLLIMPEXP_BASE wxString& operator<< (wxString& s, const wxULongLong& ll) +{ + return s << ll.ToString(); +} + #endif // wxUSE_LONGLONG