+
+class WXDLLIMPEXP_BASE wxULongLongNative
+{
+public:
+ // ctors
+ // default ctor initializes to 0
+ wxULongLongNative() : m_ll(0) { }
+ // from long long
+ wxULongLongNative(wxULongLong_t ll) : m_ll(ll) { }
+ // from 2 longs
+ wxULongLongNative(wxUint32 hi, wxUint32 lo) : m_ll(0)
+ {
+ // cast to wxLongLong_t first to avoid precision loss!
+ m_ll = ((wxULongLong_t) hi) << 32;
+ m_ll |= (wxULongLong_t) lo;
+ }
+
+#if wxUSE_LONGLONG_WX
+ wxULongLongNative(const class wxULongLongWx &ll);
+#endif
+
+ // default copy ctor is ok
+
+ // no dtor
+
+ // assignment operators
+ // from native 64 bit integer
+#ifndef wxLongLongIsLong
+ wxULongLongNative& operator=(wxULongLong_t ll)
+ { m_ll = ll; return *this; }
+ wxULongLongNative& operator=(wxLongLong_t ll)
+ { m_ll = ll; return *this; }
+#endif // !wxLongLongNative
+ wxULongLongNative& operator=(int l)
+ { m_ll = l; return *this; }
+ wxULongLongNative& operator=(long l)
+ { m_ll = l; return *this; }
+ wxULongLongNative& operator=(unsigned int l)
+ { m_ll = l; return *this; }
+ wxULongLongNative& operator=(unsigned long l)
+ { m_ll = l; return *this; }
+ wxULongLongNative& operator=(const wxLongLongNative &ll)
+ { m_ll = ll.GetValue(); return *this; }
+#if wxUSE_LONGLONG_WX
+ wxULongLongNative& operator=(wxLongLongWx ll);
+ wxULongLongNative& operator=(const class wxULongLongWx &ll);
+#endif
+
+ // assignment operators from wxULongLongNative is ok
+
+ // accessors
+ // get high part
+ wxUint32 GetHi() const
+ { return wx_truncate_cast(wxUint32, m_ll >> 32); }
+ // get low part
+ wxUint32 GetLo() const
+ { return wx_truncate_cast(wxUint32, m_ll); }
+
+ // convert to native ulong long
+ wxULongLong_t GetValue() const { return m_ll; }
+
+ // convert to ulong with range checking in debug mode (only!)
+ unsigned long ToULong() const
+ {
+ wxASSERT_MSG( m_ll <= ULONG_MAX,
+ wxT("wxULongLong to long conversion loss of precision") );
+
+ return wx_truncate_cast(unsigned long, m_ll);
+ }
+
+ // convert to double
+ //
+ // For some completely obscure reasons compiling the cast below with
+ // VC6 in DLL builds only (!) results in "error C2520: conversion from
+ // unsigned __int64 to double not implemented, use signed __int64" so
+ // we must use a different version for that compiler.
+#ifdef __VISUALC6__
+ double ToDouble() const;
+#else
+ double ToDouble() const { return wx_truncate_cast(double, m_ll); }
+#endif
+
+ // operations
+ // addition
+ wxULongLongNative operator+(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll + ll.m_ll); }
+ wxULongLongNative& operator+=(const wxULongLongNative& ll)
+ { m_ll += ll.m_ll; return *this; }
+
+ wxULongLongNative operator+(const wxULongLong_t ll) const
+ { return wxULongLongNative(m_ll + ll); }
+ wxULongLongNative& operator+=(const wxULongLong_t ll)
+ { m_ll += ll; return *this; }
+
+ // pre increment
+ wxULongLongNative& operator++()
+ { m_ll++; return *this; }
+
+ // post increment
+ wxULongLongNative operator++(int)
+ { wxULongLongNative value(*this); m_ll++; return value; }
+
+ // subtraction
+ wxULongLongNative operator-(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll - ll.m_ll); }
+ wxULongLongNative& operator-=(const wxULongLongNative& ll)
+ { m_ll -= ll.m_ll; return *this; }
+
+ wxULongLongNative operator-(const wxULongLong_t ll) const
+ { return wxULongLongNative(m_ll - ll); }
+ wxULongLongNative& operator-=(const wxULongLong_t ll)
+ { m_ll -= ll; return *this; }
+
+ // pre decrement
+ wxULongLongNative& operator--()
+ { m_ll--; return *this; }
+
+ // post decrement
+ wxULongLongNative operator--(int)
+ { wxULongLongNative value(*this); m_ll--; return value; }
+
+ // shifts
+ // left shift
+ wxULongLongNative operator<<(int shift) const
+ { return wxULongLongNative(m_ll << shift); }
+ wxULongLongNative& operator<<=(int shift)
+ { m_ll <<= shift; return *this; }
+
+ // right shift
+ wxULongLongNative operator>>(int shift) const
+ { return wxULongLongNative(m_ll >> shift); }
+ wxULongLongNative& operator>>=(int shift)
+ { m_ll >>= shift; return *this; }
+
+ // bitwise operators
+ wxULongLongNative operator&(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll & ll.m_ll); }
+ wxULongLongNative& operator&=(const wxULongLongNative& ll)
+ { m_ll &= ll.m_ll; return *this; }
+
+ wxULongLongNative operator|(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll | ll.m_ll); }
+ wxULongLongNative& operator|=(const wxULongLongNative& ll)
+ { m_ll |= ll.m_ll; return *this; }
+
+ wxULongLongNative operator^(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll ^ ll.m_ll); }
+ wxULongLongNative& operator^=(const wxULongLongNative& ll)
+ { m_ll ^= ll.m_ll; return *this; }
+
+ // multiplication/division
+ wxULongLongNative operator*(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll * ll.m_ll); }
+ wxULongLongNative operator*(unsigned long l) const
+ { return wxULongLongNative(m_ll * l); }
+ wxULongLongNative& operator*=(const wxULongLongNative& ll)
+ { m_ll *= ll.m_ll; return *this; }
+ wxULongLongNative& operator*=(unsigned long l)
+ { m_ll *= l; return *this; }
+
+ wxULongLongNative operator/(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll / ll.m_ll); }
+ wxULongLongNative operator/(unsigned long l) const
+ { return wxULongLongNative(m_ll / l); }
+ wxULongLongNative& operator/=(const wxULongLongNative& ll)
+ { m_ll /= ll.m_ll; return *this; }
+ wxULongLongNative& operator/=(unsigned long l)
+ { m_ll /= l; return *this; }
+
+ wxULongLongNative operator%(const wxULongLongNative& ll) const
+ { return wxULongLongNative(m_ll % ll.m_ll); }
+ wxULongLongNative operator%(unsigned long l) const
+ { return wxULongLongNative(m_ll % l); }
+
+ // comparison
+ bool operator==(const wxULongLongNative& ll) const
+ { return m_ll == ll.m_ll; }
+ bool operator==(unsigned long l) const
+ { return m_ll == l; }
+ bool operator!=(const wxULongLongNative& ll) const
+ { return m_ll != ll.m_ll; }
+ bool operator!=(unsigned long l) const
+ { return m_ll != l; }
+ bool operator<(const wxULongLongNative& ll) const
+ { return m_ll < ll.m_ll; }
+ bool operator<(unsigned long l) const
+ { return m_ll < l; }
+ bool operator>(const wxULongLongNative& ll) const
+ { return m_ll > ll.m_ll; }
+ bool operator>(unsigned long l) const
+ { return m_ll > l; }
+ bool operator<=(const wxULongLongNative& ll) const
+ { return m_ll <= ll.m_ll; }
+ bool operator<=(unsigned long l) const
+ { return m_ll <= l; }
+ bool operator>=(const wxULongLongNative& ll) const
+ { return m_ll >= ll.m_ll; }
+ bool operator>=(unsigned long l) 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;
+
+#if wxUSE_STD_IOSTREAM
+ // input/output
+ friend WXDLLIMPEXP_BASE
+ wxSTD ostream& operator<<(wxSTD ostream&, const wxULongLongNative&);
+#endif
+
+ friend WXDLLIMPEXP_BASE
+ wxString& operator<<(wxString&, const wxULongLongNative&);
+
+#if wxUSE_STREAMS
+ friend WXDLLIMPEXP_BASE
+ class wxTextOutputStream& operator<<(class wxTextOutputStream&, const wxULongLongNative&);
+ friend WXDLLIMPEXP_BASE
+ class wxTextInputStream& operator>>(class wxTextInputStream&, wxULongLongNative&);
+#endif
+
+private:
+ wxULongLong_t m_ll;
+};
+
+inline
+wxLongLongNative& wxLongLongNative::operator=(const wxULongLongNative &ll)
+{
+ m_ll = ll.GetValue();
+ return *this;
+}
+