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
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Licence: wxWindows license
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
@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
|
|
|
|
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
|
|
|
|
and division (not yet for the machines without native @e long long). It
|
2008-03-08 09:43:31 -05:00
|
|
|
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
|
|
|
|
want unsigned values use wxULongLong which has exactly the same API as
|
|
|
|
wxLongLong except when explicitly mentioned otherwise.
|
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-03-10 11:24:38 -04:00
|
|
|
wxLongLongFmtSpec() for printing 64 bit integers
|
2008-03-08 09:43:31 -05:00
|
|
|
using the standard @c printf() function (but see also
|
2008-03-08 08:52:38 -05:00
|
|
|
wxLongLong::ToString for a more portable solution) and
|
2008-03-10 11:24:38 -04:00
|
|
|
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:
|
|
|
|
/**
|
|
|
|
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)
|
|
|
|
or modifying it in place (the second one). Not in wxULongLong.
|
|
|
|
*/
|
|
|
|
wxLongLong Abs();
|
2008-03-09 12:24:26 -04:00
|
|
|
const wxLongLong& Abs();
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
This allows to convert a double value to wxLongLong type. Such conversion is
|
|
|
|
not always possible in which case the result will be silently truncated in a
|
|
|
|
platform-dependent way. Not in wxULongLong.
|
|
|
|
*/
|
|
|
|
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
|
|
|
|
|
|
|
/**
|
|
|
|
Convert to native long long (only for compilers supporting it)
|
|
|
|
*/
|
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
|
|
|
|
|
|
|
/**
|
|
|
|
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
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Pre/post increment operator.
|
|
|
|
*/
|
|
|
|
wxLongLong operator++();
|
2008-03-08 09:43:31 -05:00
|
|
|
wxLongLong operator++(int );
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Add another wxLongLong to this one.
|
|
|
|
*/
|
|
|
|
wxLongLong operator+(const wxLongLong& ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
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
|
|
|
|
|
|
|
//@{
|
|
|
|
/**
|
|
|
|
Pre/post decrement operator.
|
|
|
|
*/
|
|
|
|
wxLongLong operator--();
|
2008-03-08 09:43:31 -05:00
|
|
|
wxLongLong operator--(int );
|
2008-03-08 08:52:38 -05:00
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Subtracts another wxLongLong from this one.
|
|
|
|
*/
|
|
|
|
wxLongLong operator-(const wxLongLong& ll);
|
|
|
|
|
|
|
|
/**
|
|
|
|
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-03-09 08:33:59 -04:00
|
|
|
wxLongLong& operator operator=(const wxULongLong& ll);
|
2008-03-08 08:52:38 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-10 11:24:38 -04:00
|
|
|
|
2008-03-08 08:52:38 -05:00
|
|
|
// ============================================================================
|
|
|
|
// Global functions/macros
|
|
|
|
// ============================================================================
|
|
|
|
|
2008-03-23 14:24:32 -04:00
|
|
|
/** @ingroup group_funcmacro_misc */
|
|
|
|
//@{
|
|
|
|
|
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
|
|
|
|