/////////////////////////////////////////////////////////////////////////////
-// Name: wx/longlong.cpp
+// Name: src/common/longlong.cpp
// Purpose: implementation of wxLongLongNative
// Author: Jeffrey C. Ollie <jeff@ollie.clive.ia.us>, Vadim Zeitlin
// Remarks: this class is not public in wxWidgets 2.0! It is intentionally
// not documented and is for private use only.
// Modified by:
// Created: 10.02.99
-// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#endif
#if wxUSE_LONGLONG
+
#include "wx/longlong.h"
-#include "wx/math.h" // for fabs()
-#if wxUSE_STREAMS
-#include "wx/txtstrm.h"
+#ifndef WX_PRECOMP
+ #include "wx/math.h" // for fabs()
#endif
-#if defined(__MWERKS__) && defined(__WXMSW__)
-#include <string.h> // for memset()
-#else
-#include <memory.h> // for memset()
+#if wxUSE_STREAMS
+ #include "wx/txtstrm.h"
#endif
+#include <string.h> // for memset()
+
#include "wx/ioswrap.h"
// ============================================================================
}
#endif
+#ifdef __VISUALC6__
+double wxULongLongNative::ToDouble() const
+{
+ // Work around the problem of casting unsigned __int64 to double in VC6
+ // (which for unknown reasons only manifests itself in DLL builds, i.e.
+ // when using /MD).
+ static const __int64 int64_t_max = 9223372036854775807i64;
+ if ( m_ll <= int64_t_max )
+ return wx_truncate_cast(double, (wxLongLong_t)m_ll);
+
+ double d = wx_truncate_cast(double, int64_t_max);
+ d += (__int64)(m_ll - int64_t_max - 1); // The cast is safe because of -1
+ return d + 1;
+}
+#endif // __VISUALC6__
+
#endif // wxUSE_LONGLONG_NATIVE
// ============================================================================
return d;
}
+double wxULongLongWx::ToDouble() const
+{
+ unsigned double d = m_hi;
+ d *= 1.0 + (double)ULONG_MAX;
+ d += m_lo;
+
+#ifdef wxLONGLONG_TEST_MODE
+ wxASSERT( d == m_ll );
+#endif // wxLONGLONG_TEST_MODE
+
+ return d;
+}
+
wxLongLongWx wxLongLongWx::operator<<(int shift) const
{
wxLongLongWx ll(*this);
while ( ll != 0 ) \
{ \
long digit = (ll % 10).ToLong(); \
- result.Prepend((wxChar)(_T('0') - digit)); \
+ result.Prepend((wxChar)(wxT('0') - digit)); \
ll /= 10; \
} \
} \
while ( ll != 0 ) \
{ \
long digit = (ll % 10).ToLong(); \
- result.Prepend((wxChar)(_T('0') + digit)); \
+ result.Prepend((wxChar)(wxT('0') + digit)); \
ll /= 10; \
} \
} \
\
if ( result.empty() ) \
- result = _T('0'); \
+ result = wxT('0'); \
else if ( neg ) \
- result.Prepend(_T('-')); \
+ result.Prepend(wxT('-')); \
\
return result; \
}
\
while ( ll != 0 ) \
{ \
- result.Prepend((wxChar)(_T('0') + (ll % 10).ToULong())); \
+ result.Prepend((wxChar)(wxT('0') + (ll % 10).ToULong())); \
ll /= 10; \
} \
\
if ( result.empty() ) \
- result = _T('0'); \
+ result = wxT('0'); \
\
return result; \
}
return o << ll.ToString();
}
-#define READ_STRING_CHAR(s, idx, len) ((wxChar) ((idx!=len) ? s[idx++] : 0))
+#define READ_STRING_CHAR(s, idx, len) ((idx!=len) ? (wxChar)s[idx++] : wxT('\0'))
WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &o, wxULongLong &ll)
{
wxString s = o.ReadWord();
ll = wxULongLong(0l, 0l);
- size_t length = s.Length();
+ size_t length = s.length();
size_t idx = 0;
wxChar ch = READ_STRING_CHAR(s, idx, length);
wxString s = o.ReadWord();
ll = wxLongLong(0l, 0l);
- size_t length = s.Length();
+ size_t length = s.length();
size_t idx = 0;
wxChar ch = READ_STRING_CHAR(s, idx, length);