From 3a994742ab93d8cf6033f19dd7370553efb64a0f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 25 Aug 2001 16:42:11 +0000 Subject: [PATCH] added wxLongLong::ToString() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11475 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/longlong.tex | 6 +++ include/wx/longlong.h | 15 +++++-- samples/console/console.cpp | 85 +++++++++++++++++++++++++++++-------- src/common/longlong.cpp | 76 ++++++++++++++++++--------------- 4 files changed, 127 insertions(+), 55 deletions(-) diff --git a/docs/latex/wx/longlong.tex b/docs/latex/wx/longlong.tex index f2d56c1191..d0df8e6bb7 100644 --- a/docs/latex/wx/longlong.tex +++ b/docs/latex/wx/longlong.tex @@ -107,6 +107,12 @@ Truncate wxLongLong to long. If the conversion loses data (i.e. the wxLongLong value is outside the range of built-in long type), an assert will be triggered in debug mode. +\membersection{wxLongLong::ToString}\label{wxlonglongtostring} + +\constfunc{wxString}{ToString}{\void} + +Returns the string representation of a wxLongLong. + \membersection{wxLongLong::operator$+$}\label{wxlonglongoperatorplus} \constfunc{wxLongLong}{operator$+$}{\param{const wxLongLong\& }{ll}} diff --git a/include/wx/longlong.h b/include/wx/longlong.h index 621abc3e3d..26f9e1c112 100644 --- a/include/wx/longlong.h +++ b/include/wx/longlong.h @@ -18,7 +18,7 @@ #endif #include "wx/defs.h" -#include "wx/wxchar.h" +#include "wx/string.h" #include // for LONG_MAX @@ -203,6 +203,7 @@ public: // negation operator wxLongLongNative operator-() const { return wxLongLongNative(-m_ll); } + wxLongLongNative& Negate() { m_ll = -m_ll; return *this; } // subtraction wxLongLongNative operator-(const wxLongLongNative& ll) const @@ -303,6 +304,10 @@ public: { return m_ll >= l; } // miscellaneous + + // return the string representation of this number + wxString ToString() const; + // conversion to byte array: returns a pointer to static buffer! void *asArray() const; @@ -489,12 +494,16 @@ public: wxLongLongWx& remainder) const; // input/output + + // return the string representation of this number + wxString ToString() const; + + void *asArray() const; + #if wxUSE_STD_IOSTREAM friend wxSTD ostream& operator<<(wxSTD ostream&, const wxLongLongWx&); #endif // wxUSE_STD_IOSTREAM - void *asArray() const; - private: // long is at least 32 bits, so represent our 64bit number as 2 longs diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 2408494226..8a75d830ab 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -44,7 +44,7 @@ //#define TEST_ARRAYS //#define TEST_CHARSET //#define TEST_CMDLINE -#define TEST_DATETIME +//#define TEST_DATETIME //#define TEST_DIR //#define TEST_DLLLOADER //#define TEST_ENVIRON @@ -58,7 +58,7 @@ //#define TEST_LIST //#define TEST_LOCALE //#define TEST_LOG -//#define TEST_LONGLONG +#define TEST_LONGLONG //#define TEST_MIME //#define TEST_PATHLIST //#define TEST_REGCONF @@ -1364,6 +1364,35 @@ static void TestMimeAssociate() #include +static void TestDiskInfo() +{ + puts("*** Testing wxGetDiskSpace() ***\n"); + + for ( ;; ) + { + char pathname[128]; + printf("\nEnter a directory name: "); + if ( !fgets(pathname, WXSIZEOF(pathname), stdin) ) + break; + + // kill the last '\n' + pathname[strlen(pathname) - 1] = 0; + + wxLongLong total, free; + if ( !wxGetDiskSpace(pathname, &total, &free) ) + { + wxPuts(_T("ERROR: wxGetDiskSpace failed.")); + } + else + { + wxPrintf(_T("%s total bytes, %s free bytes on '%s'.\n"), + total.ToString().c_str(), + free.ToString().c_str(), + pathname); + } + } +} + static void TestOsInfo() { puts("*** Testing OS info functions ***\n"); @@ -1410,6 +1439,17 @@ static void TestUserInfo() // get a random 64 bit number #define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand()) +static const long testLongs[] = +{ + 0, + 1, + -1, + LONG_MAX, + LONG_MIN, + 0x1234, + -0x1234 +}; + #if wxUSE_LONGLONG_WX inline bool operator==(const wxLongLongWx& a, const wxLongLongNative& b) { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); } @@ -1635,17 +1675,6 @@ static void TestLongLongComparison() #if wxUSE_LONGLONG_WX puts("*** Testing wxLongLong comparison ***\n"); - static const long testLongs[] = - { - 0, - 1, - -1, - LONG_MAX, - LONG_MIN, - 0x1234, - -0x1234 - }; - static const long ls[2] = { 0x1234, @@ -1654,7 +1683,7 @@ static void TestLongLongComparison() wxLongLongWx lls[2]; lls[0] = ls[0]; - lls[1] = ls[1]; + lls[1] = ls[1]; for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ ) { @@ -1681,6 +1710,23 @@ static void TestLongLongComparison() #endif // wxUSE_LONGLONG_WX } +static void TestLongLongPrint() +{ + wxPuts(_T("*** Testing wxLongLong printing ***\n")); + + for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ ) + { + wxLongLong ll = testLongs[n]; + wxPrintf(_T("%ld == %s\n"), testLongs[n], ll.ToString().c_str()); + } + + wxLongLong ll(0x12345678, 0x87654321); + wxPrintf(_T("0x1234567887654321 = %s\n"), ll.ToString().c_str()); + + ll.Negate(); + wxPrintf(_T("-0x1234567887654321 = %s\n"), ll.ToString().c_str()); +} + #undef MAKE_LL #undef RAND_LL @@ -5084,8 +5130,9 @@ int main(int argc, char **argv) TestAddition(); TestLongLongConversion(); TestBitOperations(); + TestLongLongComparison(); } - TestLongLongComparison(); + TestLongLongPrint(); #endif // TEST_LONGLONG #ifdef TEST_HASH @@ -5105,8 +5152,12 @@ int main(int argc, char **argv) #endif // TEST_MIME #ifdef TEST_INFO_FUNCTIONS - TestOsInfo(); - TestUserInfo(); + TestDiskInfo(); + if ( 0 ) + { + TestOsInfo(); + TestUserInfo(); + } #endif // TEST_INFO_FUNCTIONS #ifdef TEST_PATHLIST diff --git a/src/common/longlong.cpp b/src/common/longlong.cpp index 319f92a40b..824f039db2 100644 --- a/src/common/longlong.cpp +++ b/src/common/longlong.cpp @@ -57,27 +57,6 @@ void *wxLongLongNative::asArray() const return temp; } -#if wxUSE_STD_IOSTREAM - -// input/output -wxSTD ostream& operator<< (wxSTD 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.GetValue() >> i) & 1); - } - - return o << result; -} - -#endif // wxUSE_STD_IOSTREAM - #endif // wxUSE_LONGLONG_NATIVE // ============================================================================ @@ -478,7 +457,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 +571,7 @@ wxLongLongWx& wxLongLongWx::operator/=(const wxLongLongWx& ll) Divide(ll, quotient, remainder); *this = quotient; - + return *this; } @@ -626,27 +605,54 @@ void *wxLongLongWx::asArray(void) const return temp; } -#if wxUSE_STD_IOSTREAM +#endif // wxUSE_LONGLONG_WX -// input/output -wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLongWx& ll) +wxString +#ifdef wxUSE_LONGLONG_NATIVE +wxLongLongNative +#else +wxLognLongWx +#endif +::ToString() const { - 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 -- 2.45.2