X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/617ec45690c340d059726a09ccfe4bab9a42d82e..ef3a5e0aae003c29941c7d41ed6becea4287752d:/src/common/longlong.cpp diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index 5fd1016b5f..d0cda3912d 100644 --- a/src/common/longlong.cpp +++ b/src/common/longlong.cpp @@ -28,7 +28,12 @@ #if wxUSE_LONGLONG #include "wx/longlong.h" +#if defined(__MWERKS__) && defined(__WXMSW__) +#include // for memset() +#else #include // for memset() +#endif + #include // for fabs() // ============================================================================ @@ -57,27 +62,6 @@ void *wxLongLongNative::asArray() const return temp; } -#if wxUSE_STD_IOSTREAM - -// input/output -ostream& operator<< (ostream& o, const wxLongLongNative& ll) -{ - char result[65]; - - memset(result, 'A', 64); - - result[64] = '\0'; - - for (int i = 0; i < 64; i++) - { - result[63 - i] = '0' + (char) ((ll.m_ll >> i) & 1); - } - - return o << result; -} - -#endif // wxUSE_STD_IOSTREAM - #endif // wxUSE_LONGLONG_NATIVE // ============================================================================ @@ -478,7 +462,7 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn, // Use of this program, for any purpose, is granted the author, Ian // Kaplan, as long as this copyright notice is included in the source // code or any source code derived from this program. The user assumes - // all responsibility for using this code. + // all responsibility for using this code. // init everything wxLongLongWx dividend = *this, @@ -591,7 +575,9 @@ wxLongLongWx& wxLongLongWx::operator/=(const wxLongLongWx& ll) Divide(ll, quotient, remainder); - return *this = quotient; + *this = quotient; + + return *this; } wxLongLongWx wxLongLongWx::operator%(const wxLongLongWx& ll) const @@ -624,27 +610,53 @@ void *wxLongLongWx::asArray(void) const return temp; } -#if wxUSE_STD_IOSTREAM +#endif // wxUSE_LONGLONG_WX -// input/output -ostream& operator<< (ostream& o, const wxLongLongWx& ll) +wxString +#if wxUSE_LONGLONG_NATIVE +wxLongLongNative::ToString() const +#else +wxLongLongWx::ToString() const +#endif { - char result[65]; + // TODO: this is awfully inefficient, anything better? + wxString result; - memset(result, 'A', 64); + wxLongLong ll = *this; - result[64] = '\0'; + bool neg; + if ( ll < 0 ) + { + ll.Negate(); + neg = TRUE; + } + else + { + neg = FALSE; + } - for (int i = 0; i < 32; i++) + while ( ll != 0 ) { - result[31 - i] = (char) ('0' + (int) ((ll.m_hi >> i) & 1)); - result[63 - i] = (char) ('0' + (int) ((ll.m_lo >> i) & 1)); + result.Prepend((wxChar)(_T('0') + (ll % 10).ToLong())); + ll /= 10; } - return o << result; + if ( result.empty() ) + result = _T('0'); + else if ( neg ) + result.Prepend(_T('-')); + + return result; } -#endif // wxUSE_STD_IOSTREAM -#endif // wxUSE_LONGLONG_NATIVE +#if wxUSE_STD_IOSTREAM + +// input/output +wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLong& ll) +{ + return o << ll.ToString(); +} + +#endif // wxUSE_STD_IOSTREAM #endif // wxUSE_LONGLONG