2008-03-08 08:52:38 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: longlong.h
|
2008-03-10 11:24:38 -04:00
|
|
|
// Purpose: interface of wxLongLong
|
2008-03-08 08:52:38 -05:00
|
|
|
// Author: wxWidgets team
|
2010-07-13 09:29:13 -04:00
|
|
|
// Licence: wxWindows licence
|
2008-03-08 08:52:38 -05:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
@class wxLongLong
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
This class represents a signed 64 bit long number. It is implemented using the
|
|
|
|
native 64 bit type where available (machines with 64 bit longs or compilers
|
|
|
|
which have (an analog of) @e long long type) and uses the emulation code in
|
|
|
|
the other cases which ensures that it is the most efficient solution for
|
|
|
|
working with 64 bit integers independently of the architecture.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2016-05-19 20:36:40 -04:00
|
|
|
@note This class is obsolete as there are no supported implementations not
|
|
|
|
providing a native 64 bit integer type any longer and the application code
|
|
|
|
can safely use "long long" or "std::int64_t" directly instead of using this
|
|
|
|
class.
|
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
wxLongLong defines all usual arithmetic operations such as addition,
|
|
|
|
subtraction, bitwise shifts and logical operations as well as multiplication
|
2008-12-01 16:37:43 -05:00
|
|
|
and division (not yet for the machines without native @e long long).
|
|
|
|
It also has operators for implicit construction from and conversion to the native
|
2008-03-08 08:52:38 -05:00
|
|
|
@e long long type if it exists and @e long.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
You would usually use this type in exactly the same manner as any other
|
|
|
|
(built-in) arithmetic type. Note that wxLongLong is a signed type, if you
|
2016-05-19 20:34:45 -04:00
|
|
|
want unsigned values use wxULongLong which has almost exactly the same API
|
|
|
|
as wxLongLong.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
If a native (i.e. supported directly by the compiler) 64 bit integer type was
|
|
|
|
found to exist, @e wxLongLong_t macro will be defined to correspond to it.
|
2008-03-08 09:43:31 -05:00
|
|
|
Also, in this case only, two additional macros will be defined:
|
2008-10-19 11:14:14 -04:00
|
|
|
- wxLongLongFmtSpec() for printing 64 bit integers using the standard @c printf()
|
|
|
|
function (but see also wxLongLong::ToString for a more portable solution);
|
|
|
|
- wxLL() for defining 64 bit integer compile-time constants.
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@library{wxbase}
|
|
|
|
@category{data}
|
|
|
|
*/
|
2008-03-08 09:43:31 -05:00
|
|
|
class wxLongLong
|
2008-03-08 08:52:38 -05:00
|
|
|
{
|
|
|
|
public:
|
2008-10-19 11:14:14 -04:00
|
|
|
/**
|
|
|
|
Default constructor initializes the object to 0.
|
|
|
|
*/
|
|
|
|
wxLongLong();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor from native long long (only for compilers supporting it).
|
|
|
|
*/
|
|
|
|
wxLongLong(wxLongLong_t ll);
|
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
|
|
|
Constructor from 2 longs: the high and low part are combined into one
|
|
|
|
wxLongLong.
|
|
|
|
*/
|
|
|
|
wxLongLong(long hi, unsigned long lo);
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Returns an absolute value of wxLongLong - either making a copy (const version)
|
2016-05-19 20:34:45 -04:00
|
|
|
or modifying it in place (the second one).
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-10-19 11:14:14 -04:00
|
|
|
wxLongLong Abs() const;
|
|
|
|
wxLongLong& Abs();
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
2019-01-25 21:14:20 -05:00
|
|
|
This allows converting a double value to wxLongLong type.
|
2008-10-19 11:14:14 -04:00
|
|
|
|
|
|
|
Such conversion is not always possible in which case the result will be
|
2016-05-19 20:34:45 -04:00
|
|
|
silently truncated in a platform-dependent way.
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
|
|
|
wxLongLong Assign(double d);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the high 32 bits of 64 bit integer.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
long GetHi() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the low 32 bits of 64 bit integer.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
unsigned long GetLo() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
2008-10-19 11:14:14 -04:00
|
|
|
Convert to native long long (only for compilers supporting it).
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
wxLongLong_t GetValue() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the value as @c double.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
double ToDouble() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Truncate wxLongLong to long. If the conversion loses data (i.e. the wxLongLong
|
|
|
|
value is outside the range of built-in long type), an assert will be triggered
|
|
|
|
in debug mode.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
long ToLong() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the string representation of a wxLongLong.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
wxString ToString() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
2008-10-19 11:14:14 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
|
|
|
Adds 2 wxLongLongs together and returns the result.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
wxLongLong operator+(const wxLongLong& ll) const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Add another wxLongLong to this one.
|
|
|
|
*/
|
2008-10-19 11:14:14 -04:00
|
|
|
wxLongLong& operator+(const wxLongLong& ll);
|
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Subtracts 2 wxLongLongs and returns the result.
|
|
|
|
*/
|
2008-03-09 12:24:26 -04:00
|
|
|
wxLongLong operator-(const wxLongLong& ll) const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
2008-10-19 11:14:14 -04:00
|
|
|
/**
|
|
|
|
Subtracts another wxLongLong from this one.
|
|
|
|
*/
|
|
|
|
wxLongLong& operator-(const wxLongLong& ll);
|
|
|
|
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Pre/post increment operator.
|
|
|
|
*/
|
|
|
|
wxLongLong operator++();
|
|
|
|
wxLongLong operator++(int);
|
|
|
|
//@}
|
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Pre/post decrement operator.
|
|
|
|
*/
|
|
|
|
wxLongLong operator--();
|
2008-10-19 11:14:14 -04:00
|
|
|
wxLongLong operator--(int);
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
2016-05-19 20:34:45 -04:00
|
|
|
Returns the value of this wxLongLong with opposite sign.
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-10-19 11:14:14 -04:00
|
|
|
wxLongLong operator-() const;
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from unsigned long long. The sign bit will be copied too.
|
2008-03-20 09:45:17 -04:00
|
|
|
|
2008-04-21 06:34:23 -04:00
|
|
|
@since 2.7.0
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-10-19 11:14:14 -04:00
|
|
|
wxLongLong& operator=(const wxULongLong& ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from native long long (only for compilers supporting it).
|
|
|
|
*/
|
|
|
|
wxLongLong& operator=(wxLongLong_t ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from native unsigned long long (only for compilers supporting it).
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxLongLong& operator=(wxULongLong_t ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from long.
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxLongLong& operator=(long l);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from unsigned long.
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxLongLong& operator=(unsigned long l);
|
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-12-01 16:37:43 -05:00
|
|
|
/**
|
|
|
|
@class wxULongLong
|
|
|
|
|
|
|
|
This class represents an unsigned 64 bit long number.
|
|
|
|
|
2016-05-19 20:34:45 -04:00
|
|
|
See wxLongLong for more details.
|
2008-12-01 16:37:43 -05:00
|
|
|
|
|
|
|
@library{wxbase}
|
|
|
|
@category{data}
|
|
|
|
*/
|
|
|
|
class wxULongLong
|
|
|
|
{
|
2016-05-19 20:34:45 -04:00
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Default constructor initializes the object to 0.
|
|
|
|
*/
|
|
|
|
wxULongLong();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor from native unsigned long long (only for compilers
|
|
|
|
supporting it).
|
|
|
|
*/
|
|
|
|
wxULongLong(wxLongLong_t ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor from 2 longs: the high and low part are combined into one
|
|
|
|
wxULongLong.
|
|
|
|
*/
|
|
|
|
wxULongLong(wxUint32 hi, wxUint32 lo);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the high 32 bits of 64 bit integer.
|
|
|
|
*/
|
|
|
|
wxUint32 GetHi() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the low 32 bits of 64 bit integer.
|
|
|
|
*/
|
|
|
|
wxUint32 long GetLo() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Convert to native long long (only for compilers supporting it).
|
|
|
|
*/
|
|
|
|
wxULongLong_t GetValue() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the value as @c double.
|
|
|
|
*/
|
|
|
|
double ToDouble() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Truncate wxULongLong to long. If the conversion loses data (i.e. the wxULongLong
|
|
|
|
value is outside the range of built-in long type), an assert will be triggered
|
|
|
|
in debug mode.
|
|
|
|
*/
|
|
|
|
unsigned long ToULong() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Returns the string representation of a wxULongLong.
|
|
|
|
*/
|
|
|
|
wxString ToString() const;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Adds 2 wxLongLongs together and returns the result.
|
|
|
|
*/
|
|
|
|
wxULongLong operator+(const wxULongLong& ll) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Add another wxULongLong to this one.
|
|
|
|
*/
|
|
|
|
wxULongLong& operator+(const wxULongLong& ll);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Subtracts 2 wxLongLongs and returns the result.
|
|
|
|
*/
|
|
|
|
wxULongLong operator-(const wxULongLong& ll) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Subtracts another wxULongLong from this one.
|
|
|
|
*/
|
|
|
|
wxULongLong& operator-(const wxULongLong& ll);
|
|
|
|
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Pre/post increment operator.
|
|
|
|
*/
|
|
|
|
wxULongLong operator++();
|
|
|
|
wxULongLong operator++(int);
|
|
|
|
//@}
|
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Pre/post decrement operator.
|
|
|
|
*/
|
|
|
|
wxULongLong operator--();
|
|
|
|
wxULongLong operator--(int);
|
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from signed long long. The sign bit will be copied too.
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxULongLong& operator=(const wxLongLong& ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from native long long (only for compilers supporting it).
|
|
|
|
*/
|
|
|
|
wxULongLong& operator=(wxLongLong_t ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from native unsigned long long (only for compilers supporting it).
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxULongLong& operator=(wxULongLong_t ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from long.
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxULongLong& operator=(long l);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Assignment operator from unsigned long.
|
|
|
|
|
|
|
|
@since 2.7.0
|
|
|
|
*/
|
|
|
|
wxULongLong& operator=(unsigned long l);
|
2008-12-01 16:37:43 -05:00
|
|
|
};
|
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
// ============================================================================
|
|
|
|
// Global functions/macros
|
|
|
|
// ============================================================================
|
|
|
|
|
2009-01-05 15:48:06 -05:00
|
|
|
/** @addtogroup group_funcmacro_misc */
|
2008-03-23 14:24:32 -04:00
|
|
|
//@{
|
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
/**
|
|
|
|
This macro is defined to contain the @c printf() format specifier using
|
|
|
|
which 64 bit integer numbers (i.e. those of type @c wxLongLong_t) can be
|
|
|
|
printed. Example of using it:
|
2008-03-09 08:33:59 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@code
|
|
|
|
#ifdef wxLongLong_t
|
2008-03-23 14:24:32 -04:00
|
|
|
wxLongLong_t ll = wxLL(0x1234567890abcdef);
|
|
|
|
printf("Long long = %" wxLongLongFmtSpec "x\n", ll);
|
|
|
|
#endif
|
2008-03-08 08:52:38 -05:00
|
|
|
@endcode
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
@see wxLL()
|
2008-03-08 08:52:38 -05:00
|
|
|
|
2008-03-23 14:24:32 -04:00
|
|
|
@header{wx/longlong.h}
|
|
|
|
*/
|
|
|
|
#define wxLongLongFmtSpec
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
2008-03-23 14:24:32 -04:00
|
|
|
This macro is defined for the platforms with a native 64 bit integer type
|
|
|
|
and allow the use of 64 bit compile time constants:
|
2008-03-09 08:33:59 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@code
|
|
|
|
#ifdef wxLongLong_t
|
2008-03-23 14:24:32 -04:00
|
|
|
wxLongLong_t ll = wxLL(0x1234567890abcdef);
|
|
|
|
#endif
|
2008-03-08 08:52:38 -05:00
|
|
|
@endcode
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-23 14:24:32 -04:00
|
|
|
@see wxULL(), wxLongLong
|
|
|
|
|
|
|
|
@header{wx/longlong.h}
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-03-23 14:24:32 -04:00
|
|
|
wxLongLong_t wxLL(number);
|
2008-03-08 08:52:38 -05:00
|
|
|
|
|
|
|
/**
|
2008-03-23 14:24:32 -04:00
|
|
|
This macro is defined for the platforms with a native 64 bit integer type
|
|
|
|
and allow the use of 64 bit compile time constants:
|
2008-03-09 08:33:59 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
@code
|
|
|
|
#ifdef wxLongLong_t
|
2008-03-23 14:24:32 -04:00
|
|
|
unsigned wxLongLong_t ll = wxULL(0x1234567890abcdef);
|
|
|
|
#endif
|
2008-03-08 08:52:38 -05:00
|
|
|
@endcode
|
2008-03-08 09:43:31 -05:00
|
|
|
|
2008-03-23 14:24:32 -04:00
|
|
|
@see wxLL(), wxLongLong
|
|
|
|
|
|
|
|
@header{wx/longlong.h}
|
2008-03-08 08:52:38 -05:00
|
|
|
*/
|
2008-03-23 14:24:32 -04:00
|
|
|
wxLongLong_t wxULL(number);
|
|
|
|
|
|
|
|
//@}
|
2008-03-08 08:52:38 -05:00
|
|
|
|