mirror of
				https://github.com/boostorg/integer.git
				synced 2025-11-03 17:51:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			178 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Boost detail/extended_integer.hpp header file  ----------------------------//
 | 
						|
 | 
						|
// (C) Copyright Daryle Walker 2008.  Distributed under the Boost Software
 | 
						|
// License, Version 1.0.  (See the accompanying file LICENSE_1_0.txt or a copy
 | 
						|
// at <http://www.boost.org/LICENSE_1_0.txt>.)
 | 
						|
 | 
						|
// Encapsulates the double-long and __int64 type families as a single family,
 | 
						|
// as they are mutually exclusive.
 | 
						|
 | 
						|
/** \file
 | 
						|
    \brief  Common definition of extended integer types.
 | 
						|
 | 
						|
    Instead of other Boost headers making separate \#defines for the double-long
 | 
						|
    and __int64 type families, since they're mutually exclusive, make a single
 | 
						|
    set of types and macros for the family that exists (if either).
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef BOOST_DETAIL_EXTENDED_INTEGER_HPP
 | 
						|
#define BOOST_DETAIL_EXTENDED_INTEGER_HPP
 | 
						|
 | 
						|
#include <boost/config.hpp>  // for BOOST_HAS_LONG_LONG and BOOST_HAS_MS_INT64
 | 
						|
 | 
						|
#include <climits>  // for CHAR_BIT, etc.
 | 
						|
 | 
						|
 | 
						|
namespace boost
 | 
						|
{
 | 
						|
namespace detail
 | 
						|
{
 | 
						|
 | 
						|
 | 
						|
//  Extended integer type macro and alias definitions  -----------------------//
 | 
						|
 | 
						|
// (Unsigned) long long family
 | 
						|
#ifdef BOOST_HAS_LONG_LONG
 | 
						|
 | 
						|
// Existence
 | 
						|
#define BOOST_HAS_XINT  1
 | 
						|
 | 
						|
// Extents
 | 
						|
#ifdef ULLONG_MAX
 | 
						|
#define BOOST_XINT_MAX    LLONG_MAX
 | 
						|
#define BOOST_XINT_MIN    LLONG_MIN
 | 
						|
#define BOOST_UXINT_MAX  ULLONG_MAX
 | 
						|
#elif defined(ULONG_LONG_MAX)
 | 
						|
#define BOOST_XINT_MAX    LONG_LONG_MAX
 | 
						|
#define BOOST_XINT_MIN    LONG_LONG_MIN
 | 
						|
#define BOOST_UXINT_MAX  ULONG_LONG_MAX
 | 
						|
#elif defined(ULONGLONG_MAX)
 | 
						|
#define BOOST_XINT_MAX    LONGLONG_MAX
 | 
						|
#define BOOST_XINT_MIN    LONGLONG_MIN
 | 
						|
#define BOOST_UXINT_MAX  ULONGLONG_MAX
 | 
						|
#elif defined(_LLONG_MAX) && defined(_C2)
 | 
						|
#define BOOST_XINT_MAX    _LLONG_MAX
 | 
						|
#define BOOST_XINT_MIN    (-_LLONG_MAX - _C2)
 | 
						|
#define BOOST_UXINT_MAX  _ULLONG_MAX
 | 
						|
#else  // guess
 | 
						|
// Sometimes we get the double-long types without the corresponding constants,
 | 
						|
// e.g. GCC in "-ansi" mode.  In this case, we'll just have to work out the
 | 
						|
// values ourselves.  (Here we assume a two's complement representation.)
 | 
						|
#define BOOST_XINT_MIN   (1LL << (sizeof(::boost::long_long_type) * CHAR_BIT - 1))
 | 
						|
#define BOOST_XINT_MAX   (~ BOOST_XINT_MIN)
 | 
						|
#define BOOST_UXINT_MAX  (~ 0uLL)
 | 
						|
#endif
 | 
						|
 | 
						|
// Types
 | 
						|
typedef ::boost:: long_long_type   xint_t;
 | 
						|
typedef ::boost::ulong_long_type  uxint_t;
 | 
						|
 | 
						|
// (Unsigned) __int64 family
 | 
						|
#elif defined(BOOST_HAS_MS_INT64)
 | 
						|
 | 
						|
// Existence
 | 
						|
#define BOOST_HAS_XINT  1
 | 
						|
 | 
						|
// Extents
 | 
						|
#ifdef _UI64_MAX
 | 
						|
#define BOOST_XINT_MAX    _I64_MAX
 | 
						|
#define BOOST_XINT_MIN    _I64_MIN
 | 
						|
#define BOOST_UXINT_MAX  _UI64_MAX
 | 
						|
#else  // guess
 | 
						|
// The types are exactly 2's-compl. 64-bit, so we'll enter the values directly.
 | 
						|
#define BOOST_XINT_MAX   0x7FFFFFFFFFFFFFFFi64
 | 
						|
#define BOOST_XINT_MIN   0x8000000000000000i64
 | 
						|
#define BOOST_UXINT_MAX  0xFFFFFFFFFFFFFFFFui64
 | 
						|
#endif
 | 
						|
 | 
						|
// Types
 | 
						|
typedef          __int64   xint_t;
 | 
						|
typedef unsigned __int64  uxint_t;
 | 
						|
 | 
						|
// Neither
 | 
						|
#else
 | 
						|
 | 
						|
// Non-existence
 | 
						|
#define BOOST_HAS_XINT  0
 | 
						|
 | 
						|
// Dummy extents
 | 
						|
#define BOOST_XINT_MAX    LONG_MAX
 | 
						|
#define BOOST_XINT_MIN    LONG_MIN
 | 
						|
#define BOOST_UXINT_MAX  ULONG_MAX
 | 
						|
 | 
						|
// Dummy types
 | 
						|
typedef   signed long   xint_t;
 | 
						|
typedef unsigned long  uxint_t;
 | 
						|
 | 
						|
#endif  // defined(BOOST_HAS_LONG_LONG)/defined(BOOST_HAS_MS_INT64)/else
 | 
						|
 | 
						|
/** \def  BOOST_HAS_XINT
 | 
						|
 | 
						|
    \brief  Flag for extended integer types.
 | 
						|
 | 
						|
    Indicates the presence of one of the two common extended integer type
 | 
						|
    families, either (<code>unsigned</code>) <code>long long</code> or
 | 
						|
    (<code>unsigned</code>) <code>__int64</code>.  \c BOOST_HAS_XINT is \c 1 if
 | 
						|
    either type family is defined, and \c 0 if neither is.
 | 
						|
 */
 | 
						|
 | 
						|
/** \def  BOOST_XINT_MAX
 | 
						|
 | 
						|
    \brief  Maximum value for the signed extended integer type.
 | 
						|
 | 
						|
    \pre  \c BOOST_HAS_XINT is \c \#defined to be \c 1.
 | 
						|
 | 
						|
    Macro constant representing the largest value the signed extended integer
 | 
						|
    type supports.  Its composition may be another macro, an expression, or a
 | 
						|
    literal.  Defaulted to \c LONG_MAX if \c BOOST_HAS_XINT is zero.
 | 
						|
 */
 | 
						|
/** \def  BOOST_XINT_MIN
 | 
						|
 | 
						|
    \brief  Minimum value for the signed extended integer type.
 | 
						|
 | 
						|
    \pre  \c BOOST_HAS_XINT is \c \#defined to be \c 1.
 | 
						|
 | 
						|
    Macro constant representing the smallest value the signed extended integer
 | 
						|
    type supports.  Its composition may be another macro, an expression, or a
 | 
						|
    literal.  Defaulted to \c LONG_MIN if \c BOOST_HAS_XINT is zero.
 | 
						|
 */
 | 
						|
/** \def  BOOST_UXINT_MAX
 | 
						|
 | 
						|
    \brief  Maximum value for the unsigned extended integer type.
 | 
						|
 | 
						|
    \pre  \c BOOST_HAS_XINT is \c \#defined to be \c 1.
 | 
						|
 | 
						|
    Macro constant representing the largest value the unsigned extended integer
 | 
						|
    type supports.  Its composition may be another macro, an expression, or a
 | 
						|
    literal.  Defaulted to \c ULONG_MAX if \c BOOST_HAS_XINT is zero.  (Use
 | 
						|
    \c 0u for the type's minimum value.)
 | 
						|
 */
 | 
						|
 | 
						|
/** \typedef  signed long  boost::detail::xint_t
 | 
						|
 | 
						|
    \brief  Alias for the signed extended integer type.
 | 
						|
 | 
						|
    \pre  \c BOOST_HAS_XINT is \c \#defined to be \c 1.
 | 
						|
 | 
						|
    Alias representing the signed extended integer type, no matter which type
 | 
						|
    family it came from.  Defaulted to <code>signed long</code> if
 | 
						|
    \c BOOST_HAS_XINT is zero.
 | 
						|
 */
 | 
						|
/** \typedef  unsigned long  ::boost::detail::uxint_t
 | 
						|
 | 
						|
    \brief  Alias for the signed extended integer type.
 | 
						|
 | 
						|
    \pre  \c BOOST_HAS_XINT is \c \#defined to be \c 1.
 | 
						|
 | 
						|
    Alias representing the unsigned extended integer type, no matter which type
 | 
						|
    family it came from.  Defaulted to <code>unsigned long</code> if
 | 
						|
    \c BOOST_HAS_XINT is zero.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
}  // namespace detail
 | 
						|
}  // namespace boost
 | 
						|
 | 
						|
 | 
						|
#endif  // BOOST_DETAIL_EXTENDED_INTEGER_HPP
 |