+
+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(unsigned long hi, unsigned long lo) : m_ll(0)
+ {
+ // assign first to avoid precision loss!
+ m_ll = ((wxULongLong_t) hi) << 32;
+ m_ll |= (wxULongLong_t) lo;
+ }
+
+ // default copy ctor is ok
+
+ // no dtor
+
+ // assignment operators
+ // from native 64 bit integer
+ wxULongLongNative& operator=(wxULongLong_t ll)
+ { m_ll = ll; return *this; }
+
+ // assignment operators from wxULongLongNative is ok
+
+ // accessors
+ // get high part
+ unsigned long GetHi() const
+ { return wx_truncate_cast(unsigned long, m_ll >> 32); }
+ // get low part
+ unsigned long GetLo() const
+ { return wx_truncate_cast(unsigned long, 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 <= LONG_MAX,
+ _T("wxULongLong to long conversion loss of precision") );
+
+ return wx_truncate_cast(unsigned long, m_ll);
+ }
+
+ // 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&);
+
+private:
+ wxULongLong_t m_ll;
+};
+