]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/longlong.cpp
Move some OLE utilities to oleutils.cpp and simplified date conversion
[wxWidgets.git] / src / common / longlong.cpp
index f0dad06d3816ecce41a4c0257a43f67648b98d3b..b61b13d159a9f62398572a7ece70e8a5df3268e7 100644 (file)
 // headers
 // ============================================================================
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "longlong.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
@@ -27,6 +23,7 @@
 
 #if wxUSE_LONGLONG
 #include "wx/longlong.h"
+#include "wx/math.h"       // for fabs()
 
 #if defined(__MWERKS__) && defined(__WXMSW__)
 #include <string.h>     // for memset()
@@ -34,7 +31,7 @@
 #include <memory.h>     // for memset()
 #endif
 
-#include <math.h>       // for fabs()
+#include "wx/ioswrap.h"
 
 // ============================================================================
 // implementation
@@ -50,14 +47,14 @@ void *wxLongLongNative::asArray() const
 {
     static unsigned char temp[8];
 
-    temp[0] = (unsigned char)((m_ll >> 56) & 0xFF);
-    temp[1] = (unsigned char)((m_ll >> 48) & 0xFF);
-    temp[2] = (unsigned char)((m_ll >> 40) & 0xFF);
-    temp[3] = (unsigned char)((m_ll >> 32) & 0xFF);
-    temp[4] = (unsigned char)((m_ll >> 24) & 0xFF);
-    temp[5] = (unsigned char)((m_ll >> 16) & 0xFF);
-    temp[6] = (unsigned char)((m_ll >> 8)  & 0xFF);
-    temp[7] = (unsigned char)((m_ll >> 0)  & 0xFF);
+    temp[0] = wx_truncate_cast(unsigned char, ((m_ll >> 56) & 0xFF));
+    temp[1] = wx_truncate_cast(unsigned char, ((m_ll >> 48) & 0xFF));
+    temp[2] = wx_truncate_cast(unsigned char, ((m_ll >> 40) & 0xFF));
+    temp[3] = wx_truncate_cast(unsigned char, ((m_ll >> 32) & 0xFF));
+    temp[4] = wx_truncate_cast(unsigned char, ((m_ll >> 24) & 0xFF));
+    temp[5] = wx_truncate_cast(unsigned char, ((m_ll >> 16) & 0xFF));
+    temp[6] = wx_truncate_cast(unsigned char, ((m_ll >> 8)  & 0xFF));
+    temp[7] = wx_truncate_cast(unsigned char, ((m_ll >> 0)  & 0xFF));
 
     return temp;
 }
@@ -66,14 +63,14 @@ void *wxULongLongNative::asArray() const
 {
     static unsigned char temp[8];
 
-    temp[0] = (unsigned char)((m_ll >> 56) & 0xFF);
-    temp[1] = (unsigned char)((m_ll >> 48) & 0xFF);
-    temp[2] = (unsigned char)((m_ll >> 40) & 0xFF);
-    temp[3] = (unsigned char)((m_ll >> 32) & 0xFF);
-    temp[4] = (unsigned char)((m_ll >> 24) & 0xFF);
-    temp[5] = (unsigned char)((m_ll >> 16) & 0xFF);
-    temp[6] = (unsigned char)((m_ll >> 8)  & 0xFF);
-    temp[7] = (unsigned char)((m_ll >> 0)  & 0xFF);
+    temp[0] = wx_truncate_cast(unsigned char, ((m_ll >> 56) & 0xFF));
+    temp[1] = wx_truncate_cast(unsigned char, ((m_ll >> 48) & 0xFF));
+    temp[2] = wx_truncate_cast(unsigned char, ((m_ll >> 40) & 0xFF));
+    temp[3] = wx_truncate_cast(unsigned char, ((m_ll >> 32) & 0xFF));
+    temp[4] = wx_truncate_cast(unsigned char, ((m_ll >> 24) & 0xFF));
+    temp[5] = wx_truncate_cast(unsigned char, ((m_ll >> 16) & 0xFF));
+    temp[6] = wx_truncate_cast(unsigned char, ((m_ll >> 8)  & 0xFF));
+    temp[7] = wx_truncate_cast(unsigned char, ((m_ll >> 0)  & 0xFF));
 
     return temp;
 }
@@ -133,6 +130,19 @@ wxLongLongWx& wxLongLongWx::Assign(double d)
     return *this;
 }
 
+double wxLongLongWx::ToDouble() const
+{
+    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);
@@ -752,7 +762,7 @@ wxULongLongWx& wxULongLongWx::operator*=(const wxULongLongWx& ll)
     m_hi = m_lo = 0;
 
 #ifdef wxLONGLONG_TEST_MODE
-    unsigned wxLongLong_t llOld = m_ll;
+    wxULongLong_t llOld = m_ll;
     m_ll = 0;
 #endif // wxLONGLONG_TEST_MODE
 
@@ -778,9 +788,11 @@ wxULongLongWx& wxULongLongWx::operator*=(const wxULongLongWx& ll)
 
 // division
 
+#define IS_MSB_SET(ll)  ((ll.GetHi()) & (1 << (8*sizeof(long) - 1)))
+
 void wxLongLongWx::Divide(const wxLongLongWx& divisorIn,
                           wxLongLongWx& quotient,
-                          wxLongLongWx& remainder) const
+                          wxLongLongWx& remainderIO) const
 {
     if ((divisorIn.m_lo == 0) && (divisorIn.m_hi == 0))
     {
@@ -804,8 +816,7 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn,
     //     all responsibility for using this code.
 
     // init everything
-    wxLongLongWx dividend = *this,
-                 divisor = divisorIn;
+    wxULongLongWx dividend, divisor, remainder;
 
     quotient = 0l;
     remainder = 0l;
@@ -818,17 +829,21 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn,
     //      dividend = quotient*divisor + remainder
     //
     // with 0 <= abs(remainder) < abs(divisor)
-    bool negRemainder = dividend.m_hi < 0;
+    bool negRemainder = GetHi() < 0;
     bool negQuotient = false;   // assume positive
-    if ( dividend.m_hi < 0 )
+    if ( GetHi() < 0 )
     {
         negQuotient = !negQuotient;
-        dividend = -dividend;
+        dividend = -*this;
+    } else {
+        dividend = *this;
     }
-    if ( divisor.m_hi < 0 )
+    if ( divisorIn.GetHi() < 0 )
     {
         negQuotient = !negQuotient;
-        divisor = -divisor;
+        divisor = -divisorIn;
+    } else {
+        divisor = divisorIn;
     }
 
     // check for some particular cases
@@ -846,8 +861,6 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn,
         size_t nBits = 64u;
         wxLongLongWx d;
 
-        #define IS_MSB_SET(ll)  ((ll.m_hi) & (1 << (8*sizeof(long) - 1)))
-
         while ( remainder < divisor )
         {
             remainder <<= 1;
@@ -887,10 +900,12 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn,
         }
     }
 
+    remainderIO = remainder;
+
     // adjust signs
     if ( negRemainder )
     {
-        remainder = -remainder;
+        remainderIO = -remainderIO;
     }
 
     if ( negQuotient )
@@ -946,8 +961,6 @@ void wxULongLongWx::Divide(const wxULongLongWx& divisorIn,
         size_t nBits = 64u;
         wxULongLongWx d;
 
-        #define IS_MSB_SET(ll)  ((ll.m_hi) & (1 << (8*sizeof(long) - 1)))
-
         while ( remainder < divisor )
         {
             remainder <<= 1;
@@ -1093,21 +1106,24 @@ void *wxULongLongWx::asArray(void) const
                                                                      \
         name ll = *this;                                             \
                                                                      \
-        bool neg;                                                    \
-        if ( ll < 0 )                                                \
+        bool neg = ll < 0;                                           \
+        if ( neg )                                                   \
         {                                                            \
-            ll.Negate();                                             \
-            neg = true;                                              \
+            while ( ll != 0 )                                        \
+            {                                                        \
+                long digit = (ll % 10).ToLong();                     \
+                result.Prepend((wxChar)(_T('0') - digit));           \
+                ll /= 10;                                            \
+            }                                                        \
         }                                                            \
         else                                                         \
         {                                                            \
-            neg = false;                                             \
-        }                                                            \
-                                                                     \
-        while ( ll != 0 )                                            \
-        {                                                            \
-            result.Prepend((wxChar)(_T('0') + (ll % 10).ToLong()));  \
-            ll /= 10;                                                \
+            while ( ll != 0 )                                        \
+            {                                                        \
+                long digit = (ll % 10).ToLong();                     \
+                result.Prepend((wxChar)(_T('0') + digit));           \
+                ll /= 10;                                            \
+            }                                                        \
         }                                                            \
                                                                      \
         if ( result.empty() )                                        \
@@ -1151,11 +1167,13 @@ void *wxULongLongWx::asArray(void) const
 #if wxUSE_STD_IOSTREAM
 
 // input/output
+WXDLLIMPEXP_BASE
 wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLong& ll)
 {
     return o << ll.ToString();
 }
 
+WXDLLIMPEXP_BASE
 wxSTD ostream& operator<< (wxSTD ostream& o, const wxULongLong& ll)
 {
     return o << ll.ToString();
@@ -1163,4 +1181,14 @@ wxSTD ostream& operator<< (wxSTD ostream& o, const wxULongLong& ll)
 
 #endif // wxUSE_STD_IOSTREAM
 
+WXDLLIMPEXP_BASE wxString& operator<< (wxString& s, const wxLongLong& ll)
+{
+    return s << ll.ToString();
+}
+
+WXDLLIMPEXP_BASE wxString& operator<< (wxString& s, const wxULongLong& ll)
+{
+    return s << ll.ToString();
+}
+
 #endif // wxUSE_LONGLONG