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}}
#endif
#include "wx/defs.h"
-#include "wx/wxchar.h"
+#include "wx/string.h"
#include <limits.h> // for LONG_MAX
// negation operator
wxLongLongNative operator-() const
{ return wxLongLongNative(-m_ll); }
+ wxLongLongNative& Negate() { m_ll = -m_ll; return *this; }
// subtraction
wxLongLongNative operator-(const wxLongLongNative& ll) const
{ 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;
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
//#define TEST_ARRAYS
//#define TEST_CHARSET
//#define TEST_CMDLINE
-#define TEST_DATETIME
+//#define TEST_DATETIME
//#define TEST_DIR
//#define TEST_DLLLOADER
//#define TEST_ENVIRON
//#define TEST_LIST
//#define TEST_LOCALE
//#define TEST_LOG
-//#define TEST_LONGLONG
+#define TEST_LONGLONG
//#define TEST_MIME
//#define TEST_PATHLIST
//#define TEST_REGCONF
#include <wx/utils.h>
+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");
// 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(); }
#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,
wxLongLongWx lls[2];
lls[0] = ls[0];
- lls[1] = ls[1];
+ lls[1] = ls[1];
for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ )
{
#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
TestAddition();
TestLongLongConversion();
TestBitOperations();
+ TestLongLongComparison();
}
- TestLongLongComparison();
+ TestLongLongPrint();
#endif // TEST_LONGLONG
#ifdef TEST_HASH
#endif // TEST_MIME
#ifdef TEST_INFO_FUNCTIONS
- TestOsInfo();
- TestUserInfo();
+ TestDiskInfo();
+ if ( 0 )
+ {
+ TestOsInfo();
+ TestUserInfo();
+ }
#endif // TEST_INFO_FUNCTIONS
#ifdef TEST_PATHLIST
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
// ============================================================================
// 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,
Divide(ll, quotient, remainder);
*this = quotient;
-
+
return *this;
}
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