X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/55dfa8d3eadbcad32bb7a779f10286dd49b60ce1..f47db8f0676be7807693de8bc38c4851c37f56a2:/src/common/longlong.cpp?ds=sidebyside diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index d85b5420fb..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, @@ -592,7 +576,7 @@ wxLongLongWx& wxLongLongWx::operator/=(const wxLongLongWx& ll) Divide(ll, quotient, remainder); *this = quotient; - + return *this; } @@ -626,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