Basic_Types.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file    Basic_Types.h
00006  *
00007  *  $Id: Basic_Types.h 80826 2008-03-04 14:51:23Z wotte $
00008  *
00009  *  @author David L. Levine
00010  *
00011  *  #defines the list of preprocessor macros below.  The config.h file can
00012  *  pre-define any of these to short-cut the definitions.  This is usually
00013  *  only necessary if the preprocessor does all of its math using integers.
00014  *
00015  *  Sizes of built-in types:
00016  *    - ACE_SIZEOF_CHAR
00017  *    - ACE_SIZEOF_WCHAR
00018  *    - ACE_SIZEOF_SHORT
00019  *    - ACE_SIZEOF_INT
00020  *    - ACE_SIZEOF_LONG
00021  *    - ACE_SIZEOF_LONG_LONG
00022  *    - ACE_SIZEOF_VOID_P
00023  *    - ACE_SIZEOF_FLOAT
00024  *    - ACE_SIZEOF_DOUBLE
00025  *    - ACE_SIZEOF_LONG_DOUBLE
00026  *
00027  *  Wrappers for built-in types of specific sizes:
00028  *    - ACE_USHORT16 (For backward compatibility.  Use ACE_UINT16 instead.)
00029  *    - ACE_INT8
00030  *    - ACE_UINT8
00031  *    - ACE_INT16
00032  *    - ACE_UINT16
00033  *    - ACE_INT32
00034  *    - ACE_UINT32
00035  *    - ACE_UINT64
00036  *  (@note ACE_INT64 is partly defined, there is no ACE_LongLong for
00037  *   platforms that don't have a native 8-byte integer type.)
00038  *
00039  *  Byte-order (endian-ness) determination:
00040  *    ACE_BYTE_ORDER, to either ACE_BIG_ENDIAN or ACE_LITTLE_ENDIAN
00041  *
00042  *
00043  */
00044 //=============================================================================
00045 
00046 #include "ace/config-lite.h"
00047 
00048 #ifndef ACE_BASIC_TYPES_H
00049 # define ACE_BASIC_TYPES_H
00050 
00051 # include /**/ "ace/pre.h"
00052 
00053 # if !defined (ACE_LACKS_PRAGMA_ONCE)
00054 #   pragma once
00055 # endif /* ACE_LACKS_PRAGMA_ONCE */
00056 
00057 // Pull in definitions
00058 # include "ace/os_include/os_limits.h"     // Integer limits
00059 # include "ace/os_include/os_float.h"      // Floating point limits
00060 # include "ace/os_include/os_stdlib.h"     // Other types
00061 # include "ace/os_include/os_stddef.h"     // Get ptrdiff_t - see further comments below
00062 
00063 # if defined(ACE_LACKS_LONGLONG_T)
00064 #   include "ace/os_include/os_stdio.h"  // For long long emulation
00065 # endif  /* ACE_LACKS_LONGLONG_T */
00066 
00067 # include "ace/os_include/sys/os_types.h"
00068 
00069 # if !defined (ACE_LACKS_SYS_PARAM_H)
00070 #  include /**/ <sys/param.h>
00071 # endif /* ACE_LACKS_SYS_PARAM_H */
00072 
00073 # include "ace/ACE_export.h"
00074 
00075 # if !defined (ACE_LACKS_STDINT_H)
00076 #  include <stdint.h>
00077 # endif
00078 # if !defined (ACE_LACKS_INTTYPES_H)
00079 #  include <inttypes.h>
00080 # endif
00081 
00082 #ifdef ACE_LACKS_INTPTR_T
00083 # include "ace/If_Then_Else.h"
00084 
00085 // This intptr_t typedef is here instead of
00086 // <ace/os_include/os_inttypes.h> since it depends on the template
00087 // metaprogramming in <ace/If_Then_Else.h>.
00088 
00089 // We could compare ACE_SIZEOF_VOID_P against ACE_SIZEOF_LONG, etc.
00090 // However, that depends on the ACE preprocessor symbol definitions in
00091 // the platform-specific configuration header being correct.
00092 // The template meta-programming approach we take below,
00093 // i.e. determining the type at compile-time rather than at
00094 // preprocessing-time, will work for all platforms, and does not
00095 // depend on ACE developer-defined configuration parameters.
00096 
00097 typedef ACE::If_Then_Else<
00098   (sizeof (void*) == sizeof (signed int)),
00099   signed int,
00100   ACE::If_Then_Else<
00101     (sizeof (void*) == sizeof (signed long)),
00102     signed long,
00103 #ifdef ACE_LACKS_LONGLONG_T
00104     void  /* Unknown. Force an invalid type */
00105 #else
00106     ACE::If_Then_Else<
00107       (sizeof (void*) == sizeof (signed long long)),
00108       signed long long,
00109       void /* Unknown. Force an invalid type */
00110       >::result_type
00111 #endif  /* ACE_LACKS_LONGLONG_T */
00112     >::result_type
00113   >::result_type intptr_t;
00114 
00115 typedef ACE::If_Then_Else<
00116   (sizeof (void*) == sizeof (unsigned int)),
00117   unsigned int,
00118   ACE::If_Then_Else<
00119     (sizeof (void*) == sizeof (unsigned long)),
00120     unsigned long,
00121 #ifdef ACE_LACKS_UNSIGNEDLONGLONG_T
00122     void  /* Unknown. Force an invalid type */
00123 #else
00124     ACE::If_Then_Else<
00125       (sizeof (void*) == sizeof (unsigned long long)),
00126       unsigned long long,
00127       void /* Unknown. Force an invalid type */
00128       >::result_type
00129 #endif  /* ACE_LACKS_UNSIGNEDLONGLONG_T */
00130     >::result_type
00131   >::result_type uintptr_t;
00132 
00133 #endif  /* ACE_LACKS_INTPTR_T */
00134 
00135 // A char always has 1 byte, by definition.
00136 # define ACE_SIZEOF_CHAR 1
00137 
00138 // Unfortunately, there isn't a portable way to determine the size of a wchar.
00139 // So we just define them on a platform basis. If the platform doesn't
00140 // define it and it's an XPG4 system, assume wchar_t is 4 bytes. Some code
00141 // uses ACE_SIZEOF_WCHAR in preprocessor statements, so sizeof() isn't valid.
00142 // If the platform config doesn't set this, and this guess is wrong,
00143 // Basic_Types_Test should catch the inconsistency.
00144 # if defined (ACE_HAS_WCHAR)
00145 #   if !defined (ACE_SIZEOF_WCHAR)
00146 #     if defined (ACE_HAS_XPG4_MULTIBYTE_CHAR)
00147 #       define ACE_SIZEOF_WCHAR 4
00148 #     else
00149 // 0 so the Basic_Types test will catch this.
00150 #       define ACE_SIZEOF_WCHAR 0
00151 #     endif /* ACE_HAS_XPG4_MULTIBYTE_CHAR */
00152 #   endif /* !ACE_SIZEOF_WCHAR */
00153 # endif /* ACE_HAS_WCHAR */
00154 
00155 // The number of bytes in a short.
00156 # if !defined (ACE_SIZEOF_SHORT)
00157 #   if (USHRT_MAX) == 255U
00158 #     define ACE_SIZEOF_SHORT 1
00159 #   elif (USHRT_MAX) == 65535U
00160 #     define ACE_SIZEOF_SHORT 2
00161 #   elif (USHRT_MAX) == 4294967295U
00162 #     define ACE_SIZEOF_SHORT 4
00163 #   elif (USHRT_MAX) == 18446744073709551615U
00164 #     define ACE_SIZEOF_SHORT 8
00165 #   else
00166 #     error: unsupported short size, must be updated for this platform!
00167 #   endif /* USHRT_MAX */
00168 # endif /* !defined (ACE_SIZEOF_SHORT) */
00169 
00170 // The number of bytes in an int.
00171 # if !defined (ACE_SIZEOF_INT)
00172 #   if (UINT_MAX) == 65535U
00173 #     define ACE_SIZEOF_INT 2
00174 #   elif (UINT_MAX) == 4294967295U
00175 #     define ACE_SIZEOF_INT 4
00176 #   elif (UINT_MAX) == 18446744073709551615U
00177 #     define ACE_SIZEOF_INT 8
00178 #   else
00179 #     error: unsupported int size, must be updated for this platform!
00180 #   endif /* UINT_MAX */
00181 # endif /* !defined (ACE_SIZEOF_INT) */
00182 
00183 // The number of bytes in a long.
00184 # if !defined (ACE_SIZEOF_LONG)
00185 #   if (ULONG_MAX) == 65535UL
00186 #     define ACE_SIZEOF_LONG 2
00187 #   elif ((ULONG_MAX) == 4294967295UL)
00188 #     define ACE_SIZEOF_LONG 4
00189 #   elif ((ULONG_MAX) == 18446744073709551615UL)
00190 #     define ACE_SIZEOF_LONG 8
00191 #   else
00192 #     error: unsupported long size, must be updated for this platform!
00193 #   endif /* ULONG_MAX */
00194 # endif /* !defined (ACE_SIZEOF_LONG) */
00195 
00196 // The number of bytes in a long long.
00197 # if !defined (ACE_SIZEOF_LONG_LONG)
00198 #   if defined (ACE_LACKS_LONGLONG_T)
00199 #     define ACE_SIZEOF_LONG_LONG 8
00200 #   elif defined (ULLONG_MAX)
00201 #     if ((ULLONG_MAX) == 4294967295ULL)
00202 #       define ACE_SIZEOF_LONG_LONG 4
00203 #     elif ((ULLONG_MAX) == 18446744073709551615ULL)
00204 #       define ACE_SIZEOF_LONG_LONG 8
00205 #     endif
00206 #   elif defined (ULONGLONG_MAX)
00207 #     if ((ULONGLONG_MAX) == 4294967295ULL)
00208 #       define ACE_SIZEOF_LONG_LONG 4
00209 #     elif ((ULONGLONG_MAX) == 18446744073709551615ULL)
00210 #       define ACE_SIZEOF_LONG_LONG 8
00211 #     endif
00212 #   endif
00213 #   // If we can't determine the size of long long, assume it is 8
00214 #   // instead of erroring out.  (Either ULLONG_MAX and ULONGLONG_MAX
00215 #   // may not be supported; or an extended C/C++ dialect may need to
00216 #   // be selected.  If this assumption is wrong, it can be addressed
00217 #   // in the platform-specific config header.
00218 #   if !defined (ACE_SIZEOF_LONG_LONG)
00219 #     define ACE_SIZEOF_LONG_LONG 8
00220 #   endif
00221 # endif /* !defined (ACE_SIZEOF_LONG_LONG) */
00222 
00223 
00224 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00225 
00226 // The sizes of the commonly implemented types are now known.  Set up
00227 // typedefs for whatever we can.  Some of these are needed for certain
00228 // cases of ACE_UINT64, so do them before the 64-bit stuff.
00229 
00230 #if defined (ACE_INT8_TYPE)
00231   typedef ACE_INT8_TYPE         ACE_INT8;
00232 #elif defined (ACE_HAS_INT8_T)
00233   typedef int8_t                ACE_INT8;
00234 #elif !defined (ACE_LACKS_SIGNED_CHAR)
00235   typedef signed char           ACE_INT8;
00236 #else
00237   typedef char                  ACE_INT8;
00238 #endif /* defined (ACE_INT8_TYPE) */
00239 
00240 #if defined (ACE_UINT8_TYPE)
00241   typedef ACE_UINT8_TYPE        ACE_UINT8;
00242 #elif defined (ACE_HAS_UINT8_T)
00243   typedef uint8_t               ACE_UINT8;
00244 #else
00245   typedef unsigned char         ACE_UINT8;
00246 #endif /* defined (ACE_UINT8_TYPE) */
00247 
00248 #if defined (ACE_INT16_TYPE)
00249   typedef ACE_INT16_TYPE        ACE_INT16;
00250 #elif defined (ACE_HAS_INT16_T)
00251   typedef int16_t               ACE_INT16;
00252 #elif ACE_SIZEOF_SHORT == 2
00253   typedef short                 ACE_INT16;
00254 #elif ACE_SIZEOF_INT == 2
00255   typedef int                   ACE_INT16;
00256 #else
00257 # error Have to add to the ACE_INT16 type setting
00258 #endif  /* defined (ACE_INT16_TYPE) */
00259 
00260 #if defined (ACE_UINT16_TYPE)
00261   typedef ACE_UINT16_TYPE       ACE_UINT16;
00262 #elif defined (ACE_HAS_UINT16_T)
00263   typedef uint16_t              ACE_UINT16;
00264 #elif ACE_SIZEOF_SHORT == 2
00265   typedef unsigned short        ACE_UINT16;
00266 #elif ACE_SIZEOF_INT == 2
00267   typedef unsigned int          ACE_UINT16;
00268 #else
00269 # error Have to add to the ACE_UINT16 type setting
00270 #endif /* defined (ACE_UINT16_TYPE) */
00271 
00272 #if defined (ACE_INT32_TYPE)
00273   typedef ACE_INT32_TYPE        ACE_INT32;
00274 #elif defined (ACE_HAS_INT32_T)
00275   typedef int32_t               ACE_INT32;
00276 #elif ACE_SIZEOF_INT == 4
00277   typedef int                   ACE_INT32;
00278 #elif ACE_SIZEOF_LONG == 4
00279   typedef long                  ACE_INT32;
00280 #else
00281 # error Have to add to the ACE_INT32 type setting
00282 #endif /* defined (ACE_INT32_TYPE) */
00283 
00284 #if defined (ACE_UINT32_TYPE)
00285   typedef ACE_UINT32_TYPE       ACE_UINT32;
00286 #elif defined (ACE_HAS_UINT32_T)
00287   typedef uint32_t              ACE_UINT32;
00288 #elif ACE_SIZEOF_INT == 4
00289   typedef unsigned int          ACE_UINT32;
00290 #elif ACE_SIZEOF_LONG == 4
00291   typedef unsigned long         ACE_UINT32;
00292 #else
00293 # error Have to add to the ACE_UINT32 type setting
00294 #endif /* defined (ACE_UINT32_TYPE) */
00295 
00296 #if defined (ACE_INT64_TYPE)
00297   typedef ACE_INT64_TYPE        ACE_INT64;
00298 #elif defined (ACE_HAS_INT64_T)
00299   typedef int64_t               ACE_INT64;
00300 #elif ACE_SIZEOF_LONG == 8
00301   typedef long                  ACE_INT64;
00302 #elif !defined (ACE_LACKS_LONGLONG_T) && ACE_SIZEOF_LONG_LONG == 8
00303 # ifdef __GNUC__
00304   // Silence g++ "-pedantic" warnings regarding use of "long long"
00305   // type.
00306   __extension__
00307 # endif  /* __GNUC__ */
00308   typedef long long             ACE_INT64;
00309 #endif /* defined (ACE_INT64_TYPE) */
00310 
00311 #if !(defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T))
00312 /* See matching #if around ACE_U_LongLong class declaration below */
00313 
00314 #  if defined (ACE_UINT64_TYPE)
00315   typedef ACE_UINT64_TYPE       ACE_UINT64;
00316 #  elif defined (ACE_HAS_UINT64_T)
00317   typedef uint64_t              ACE_UINT64;
00318 #  elif ACE_SIZEOF_LONG == 8
00319   typedef unsigned long         ACE_UINT64;
00320 #  elif ACE_SIZEOF_LONG_LONG == 8
00321 # ifdef __GNUC__
00322   // Silence g++ "-pedantic" warnings regarding use of "long long"
00323   // type.
00324   __extension__
00325 # endif  /* __GNUC__ */
00326   typedef unsigned long long    ACE_UINT64;
00327 #  endif /* defined (ACE_UINT64_TYPE) */
00328 #endif /* !(ACE_LACKS_LONGLONG_T || ACE_LACKS_UNSIGNEDLONGLONG_T) */
00329 
00330 
00331 typedef ACE_UINT16 ACE_USHORT16;  // @@ Backward compatibility.
00332 
00333 // Define a generic byte for use in codecs
00334 typedef unsigned char ACE_Byte;
00335 
00336 // Define a pseudo wide character type when wchar is not supported so we
00337 // can support basic wide character string operations.
00338 
00339 # if defined (ACE_HAS_WCHAR) || defined (ACE_HAS_XPG4_MULTIBYTE_CHAR)
00340 #   define ACE_WINT_T wint_t
00341 #   define ACE_WCHAR_T wchar_t
00342 # else
00343 #   define ACE_WINT_T ACE_UINT16
00344 #   define ACE_WCHAR_T ACE_UINT16
00345 # endif /* ACE_HAS_WCHAR */
00346 
00347 // The number of bytes in a void *.
00348 # ifndef ACE_SIZEOF_VOID_P
00349 #   define ACE_SIZEOF_VOID_P ACE_SIZEOF_LONG
00350 # endif /* ACE_SIZEOF_VOID_P */
00351 
00352 // Type for doing arithmetic on pointers ... as elsewhere, we assume
00353 // that unsigned versions of a type are the same size as the signed
00354 // version of the same type.
00355 # if defined (ACE_HAS_WINCE) && (_WIN32_WCE < 400)
00356 typedef unsigned long ptrdiff_t;    // evc3, PocketPC don't defined ptrdiff_t
00357 # endif
00358 
00359 ACE_END_VERSIONED_NAMESPACE_DECL
00360 
00361 // Byte-order (endian-ness) determination.
00362 # if defined (BYTE_ORDER)
00363 #   if (BYTE_ORDER == LITTLE_ENDIAN)
00364 #     define ACE_LITTLE_ENDIAN 0x0123
00365 #     define ACE_BYTE_ORDER ACE_LITTLE_ENDIAN
00366 #   elif (BYTE_ORDER == BIG_ENDIAN)
00367 #     define ACE_BIG_ENDIAN 0x3210
00368 #     define ACE_BYTE_ORDER ACE_BIG_ENDIAN
00369 #   else
00370 #     error: unknown BYTE_ORDER!
00371 #   endif /* BYTE_ORDER */
00372 # elif defined (_BYTE_ORDER)
00373 #   if (_BYTE_ORDER == _LITTLE_ENDIAN)
00374 #     define ACE_LITTLE_ENDIAN 0x0123
00375 #     define ACE_BYTE_ORDER ACE_LITTLE_ENDIAN
00376 #   elif (_BYTE_ORDER == _BIG_ENDIAN)
00377 #     define ACE_BIG_ENDIAN 0x3210
00378 #     define ACE_BYTE_ORDER ACE_BIG_ENDIAN
00379 #   else
00380 #     error: unknown _BYTE_ORDER!
00381 #   endif /* _BYTE_ORDER */
00382 # elif defined (__BYTE_ORDER)
00383 #   if (__BYTE_ORDER == __LITTLE_ENDIAN)
00384 #     define ACE_LITTLE_ENDIAN 0x0123
00385 #     define ACE_BYTE_ORDER ACE_LITTLE_ENDIAN
00386 #   elif (__BYTE_ORDER == __BIG_ENDIAN)
00387 #     define ACE_BIG_ENDIAN 0x3210
00388 #     define ACE_BYTE_ORDER ACE_BIG_ENDIAN
00389 #   else
00390 #     error: unknown __BYTE_ORDER!
00391 #   endif /* __BYTE_ORDER */
00392 # else /* ! BYTE_ORDER && ! __BYTE_ORDER */
00393   // We weren't explicitly told, so we have to figure it out . . .
00394 #   if defined (i386) || defined (__i386__) || defined (_M_IX86) || \
00395      defined (vax) || defined (__alpha) || defined (__LITTLE_ENDIAN__) || \
00396      defined (ARM) || defined (_M_IA64) || defined (__ia64__) || \
00397      defined (_M_AMD64) || defined (__amd64)
00398     // We know these are little endian.
00399 #     define ACE_LITTLE_ENDIAN 0x0123
00400 #     define ACE_BYTE_ORDER ACE_LITTLE_ENDIAN
00401 #   else
00402     // Otherwise, we assume big endian.
00403 #     define ACE_BIG_ENDIAN 0x3210
00404 #     define ACE_BYTE_ORDER ACE_BIG_ENDIAN
00405 #   endif
00406 # endif /* ! BYTE_ORDER && ! __BYTE_ORDER */
00407 
00408 // Byte swapping macros to deal with differences between little endian
00409 // and big endian machines.  Note that "long" here refers to 32 bit
00410 // quantities.
00411 # define ACE_SWAP_LONG(L) ((ACE_SWAP_WORD ((L) & 0xFFFF) << 16) \
00412             | ACE_SWAP_WORD(((L) >> 16) & 0xFFFF))
00413 # define ACE_SWAP_WORD(L) ((((L) & 0x00FF) << 8) | (((L) & 0xFF00) >> 8))
00414 
00415 # if defined (ACE_LITTLE_ENDIAN)
00416 #   define ACE_HTONL(X) ACE_SWAP_LONG (X)
00417 #   define ACE_NTOHL(X) ACE_SWAP_LONG (X)
00418 #   define ACE_IDL_NCTOHL(X) (X)
00419 #   define ACE_IDL_NSTOHL(X) (X)
00420 # else
00421 #   define ACE_HTONL(X) X
00422 #   define ACE_NTOHL(X) X
00423 #   define ACE_IDL_NCTOHL(X) (X << 24)
00424 #   define ACE_IDL_NSTOHL(X) ((X) << 16)
00425 # endif /* ACE_LITTLE_ENDIAN */
00426 
00427 # if defined (ACE_LITTLE_ENDIAN)
00428 #   define ACE_HTONS(x) ACE_SWAP_WORD(x)
00429 #   define ACE_NTOHS(x) ACE_SWAP_WORD(x)
00430 # else
00431 #   define ACE_HTONS(x) x
00432 #   define ACE_NTOHS(x) x
00433 # endif /* ACE_LITTLE_ENDIAN */
00434 
00435 #if defined (ACE_LACKS_LONGLONG_T)
00436   // This throws away the high 32 bits.  It's very unlikely that a
00437   // pointer will be more than 32 bits wide if the platform does not
00438   // support 64-bit integers.
00439 # define ACE_LONGLONG_TO_PTR(PTR_TYPE, L) \
00440   reinterpret_cast<PTR_TYPE> (L.lo ())
00441 #elif defined (ACE_OPENVMS) && (!defined (__INITIAL_POINTER_SIZE) || (__INITIAL_POINTER_SIZE < 64))
00442 # define ACE_LONGLONG_TO_PTR(PTR_TYPE, L) \
00443   reinterpret_cast<PTR_TYPE> (static_cast<int> (L))
00444 #else  /* ! ACE_LACKS_LONGLONG_T */
00445 # define ACE_LONGLONG_TO_PTR(PTR_TYPE, L) \
00446   reinterpret_cast<PTR_TYPE> (static_cast<intptr_t> (L))
00447 #endif /* ! ACE_LACKS_LONGLONG_T */
00448 
00449 // If the platform lacks an unsigned long long, define one.
00450 #if defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00451 // Forward declaration for streams
00452 #   include "ace/iosfwd.h"
00453 
00454 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00455 
00456 /**
00457  * @class ACE_U_LongLong
00458  *
00459  * @brief Unsigned long long for platforms that don't have one.
00460  *
00461  * Provide our own unsigned long long.  This is intended to be
00462  * use with ACE_High_Res_Timer, so the division operator assumes
00463  * that the quotient fits into a u_long.
00464  * Please note that the constructor takes (optionally) two values.
00465  * The high one contributes 0x100000000 times its value.  So,
00466  * for example, (0, 2) is _not_ 20000000000, but instead
00467  * 0x200000000.  To emphasize this, the default values are expressed
00468  * in hex, and output () dumps the value in hex.
00469  */
00470   class ACE_Export ACE_U_LongLong
00471   {
00472   public:
00473     // = Initialization and termination methods.
00474 #if defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00475     ACE_U_LongLong (const long long value = 0x0);
00476 #else
00477     ACE_U_LongLong (const ACE_UINT32 lo = 0x0, const ACE_UINT32 hi = 0x0);
00478 #endif
00479     ACE_U_LongLong (const ACE_U_LongLong &);
00480     ACE_U_LongLong &operator= (const ACE_U_LongLong &);
00481     ACE_U_LongLong &operator= (const ACE_INT32 &);
00482     ACE_U_LongLong &operator= (const ACE_UINT32 &);
00483     ~ACE_U_LongLong (void);
00484 
00485     // = Overloaded relation operators.
00486     bool operator== (const ACE_U_LongLong &) const;
00487     bool operator== (const ACE_UINT32) const;
00488     bool operator!= (const ACE_U_LongLong &) const;
00489     bool operator!= (const ACE_UINT32) const;
00490     bool operator< (const ACE_U_LongLong &) const;
00491     bool operator< (const ACE_UINT32) const;
00492     bool operator<= (const ACE_U_LongLong &) const;
00493     bool operator<= (const ACE_UINT32) const;
00494     bool operator> (const ACE_U_LongLong &) const;
00495     bool operator> (const ACE_UINT32) const;
00496     bool operator>= (const ACE_U_LongLong &) const;
00497     bool operator>= (const ACE_UINT32) const;
00498 
00499     ACE_U_LongLong operator+ (const ACE_U_LongLong &) const;
00500     ACE_U_LongLong operator+ (const ACE_UINT32) const;
00501     ACE_U_LongLong operator- (const ACE_U_LongLong &) const;
00502     ACE_U_LongLong operator- (const ACE_UINT32) const;
00503     ACE_U_LongLong operator* (const ACE_UINT32) const;
00504     ACE_U_LongLong &operator*= (const ACE_UINT32);
00505 
00506     ACE_U_LongLong operator<< (const unsigned int) const;
00507     ACE_U_LongLong &operator<<= (const unsigned int);
00508     ACE_U_LongLong operator>> (const unsigned int) const;
00509     ACE_U_LongLong &operator>>= (const unsigned int);
00510 
00511     double operator/ (const double) const;
00512 
00513     ACE_U_LongLong &operator+= (const ACE_U_LongLong &);
00514     ACE_U_LongLong &operator+= (const ACE_UINT32);
00515     ACE_U_LongLong &operator-= (const ACE_U_LongLong &);
00516     ACE_U_LongLong &operator-= (const ACE_UINT32);
00517     ACE_U_LongLong &operator++ ();
00518     ACE_U_LongLong &operator-- ();
00519     const ACE_U_LongLong operator++ (int);
00520     const ACE_U_LongLong operator-- (int);
00521     ACE_U_LongLong &operator|= (const ACE_U_LongLong);
00522     ACE_U_LongLong &operator|= (const ACE_UINT32);
00523     ACE_U_LongLong &operator&= (const ACE_U_LongLong);
00524     ACE_U_LongLong &operator&= (const ACE_UINT32);
00525 
00526     // Note that the following take ACE_UINT32 arguments.  These are
00527     // typical use cases, and easy to implement.  But, they limit the
00528     // return values to 32 bits as well.  There are no checks for
00529     // overflow.
00530     ACE_UINT32 operator/ (const ACE_UINT32) const;
00531     ACE_UINT32 operator% (const ACE_UINT32) const;
00532 
00533     // The following only operate on the lower 32 bits (they take only
00534     // 32 bit arguments).
00535     ACE_UINT32 operator| (const ACE_INT32) const;
00536     ACE_UINT32 operator& (const ACE_INT32) const;
00537 
00538     // The following operators convert their arguments to
00539     // ACE_UINT32.  So, there may be information loss if they are
00540     // used.
00541     ACE_U_LongLong operator* (const ACE_INT32) const;
00542     ACE_U_LongLong &operator*= (const ACE_INT32);
00543     ACE_UINT32 operator/ (const ACE_INT32) const;
00544 #   if ACE_SIZEOF_INT == 4
00545     ACE_UINT32 operator/ (const unsigned long) const;
00546     ACE_UINT32 operator/ (const long) const;
00547 #   else  /* ACE_SIZEOF_INT != 4 */
00548     ACE_UINT32 operator/ (const unsigned int) const;
00549     ACE_UINT32 operator/ (const int) const;
00550 #   endif /* ACE_SIZEOF_INT != 4 */
00551 
00552     // = Helper methods.
00553     /// Outputs the value to the FILE, in hex.
00554     void output (FILE * = stdout) const;
00555 
00556     ACE_TCHAR *as_string (ACE_TCHAR *string,
00557                           unsigned int base = 10,
00558                           unsigned int uppercase = 0) const;
00559 
00560     ACE_UINT32 hi (void) const;
00561     ACE_UINT32 lo (void) const;
00562 
00563     void hi (const ACE_UINT32 hi);
00564     void lo (const ACE_UINT32 lo);
00565 
00566 #if defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00567     long long to_int64 (void) const;
00568 #   endif
00569 
00570   private:
00571 
00572 #if defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00573     long long data_;
00574 #else
00575   public:
00576     struct ace_hi_lo_correct_endian
00577     {
00578 #  if defined (ACE_BIG_ENDIAN)
00579       /// High 32 bits.
00580       ACE_UINT32 hi_;
00581       /// Low 32 bits.
00582       ACE_UINT32 lo_;
00583 
00584 #  else
00585 
00586       /// Low 32 bits.
00587       ACE_UINT32 lo_;
00588       /// High 32 bits.
00589       ACE_UINT32 hi_;
00590 #  endif /* ! ACE_BIG_ENDIAN */
00591     };
00592   private:
00593     union
00594     {
00595       struct ace_hi_lo_correct_endian data_;
00596 
00597       /// To ensure alignment on 8-byte boundary.
00598       double for_alignment_;
00599     };
00600 
00601     // @note  the following four accessors are inlined here in
00602     // order to minimize the extent of the data_ struct.  It's
00603     // only used here; the .i and .cpp files use the accessors.
00604 
00605     /// Internal utility function to hide access through struct.
00606     const ACE_UINT32 &h_ () const { return data_.hi_; }
00607 
00608     /// Internal utility function to hide access through struct.
00609     ACE_UINT32 &h_ () { return data_.hi_; }
00610 
00611     /// Internal utility function to hide access through struct.
00612     const ACE_UINT32 &l_ () const { return data_.lo_; }
00613 
00614     /// Internal utility function to hide access through struct.
00615     ACE_UINT32 &l_ () { return data_.lo_; }
00616 
00617     // @note  the above four accessors are inlined here in
00618     // order to minimize the extent of the data_ struct.  It's
00619     // only used here; the .inl and .cpp files use the accessors.
00620 
00621     /// These functions are used to implement multiplication.
00622     ACE_UINT32 ul_shift (ACE_UINT32 a,
00623                          ACE_UINT32 c_in,
00624                          ACE_UINT32 *c_out) const;
00625     ACE_U_LongLong ull_shift (ACE_U_LongLong a,
00626                               ACE_UINT32 c_in,
00627                               ACE_UINT32 *c_out) const;
00628     ACE_U_LongLong ull_add (ACE_U_LongLong a,
00629                             ACE_U_LongLong b,
00630                             ACE_UINT32 *carry) const;
00631     ACE_U_LongLong ull_mult (ACE_U_LongLong a,
00632                              ACE_UINT32 b,
00633                              ACE_UINT32 *carry) const;
00634 #endif // ACE_LACKS_UNSIGNEDLONGLONG_T
00635   };
00636 
00637   typedef ACE_U_LongLong ACE_UINT64;
00638 
00639 #if !defined (ACE_LACKS_IOSTREAM_TOTALLY)
00640   ostream &operator<< (ostream &, const ACE_U_LongLong &);
00641 #endif /* ! ACE_LACKS_IOSTREAM_TOTALLY */
00642 
00643 ACE_END_VERSIONED_NAMESPACE_DECL
00644 
00645 # endif /* ACE_LACKS_LONGLONG_T */
00646 
00647 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00648 
00649 // Conversions from ACE_UINT64 to ACE_UINT32.  ACE_CU64_TO_CU32 should
00650 // be used on const ACE_UINT64's.
00651 # if defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00652 inline ACE_UINT32
00653 ACE_U64_TO_U32 (ACE_U_LongLong const & n)
00654 {
00655   /**
00656    * @note We could add a cast operator to ACE_U_LongLong but that may
00657    *       cause more problems than it solves.  Force users to perform
00658    *       an explicit cast via ACE_{C}U64_TO_{C}U32.
00659    */
00660   return n.lo ();
00661 }
00662 
00663 inline ACE_UINT32
00664 ACE_CU64_TO_CU32 (ACE_U_LongLong const & n)
00665 {
00666   return ACE_U64_TO_U32 (n);
00667 }
00668 # else  /* ! ACE_LACKS_LONGLONG_T */
00669 inline ACE_UINT32
00670 ACE_U64_TO_U32 (ACE_UINT64 n)
00671 {
00672   return static_cast<ACE_UINT32> (n);
00673 }
00674 
00675 inline ACE_UINT32
00676 ACE_CU64_TO_CU32 (ACE_UINT64 n)
00677 {
00678   return static_cast<ACE_UINT32> (n);
00679 }
00680 # endif /* ! ACE_LACKS_LONGLONG_T */
00681 
00682 ACE_END_VERSIONED_NAMESPACE_DECL
00683 
00684 // 64-bit literals require special marking on some platforms.
00685 # if defined (ACE_LACKS_LONGLONG_T)
00686     // Can only specify 32-bit arguments.
00687 #   define ACE_UINT64_LITERAL(n) n ## UL
00688       // This one won't really work, but it'll keep
00689       // some compilers happy until we have better support
00690 #   define ACE_INT64_LITERAL(n) n ## L
00691 # elif defined (ACE_WIN32)
00692 #  if defined (__MINGW32__)
00693 #   define ACE_UINT64_LITERAL(n) n ## ull
00694 #   define ACE_INT64_LITERAL(n) n ## ll
00695 #  else
00696 #   define ACE_UINT64_LITERAL(n) n ## ui64
00697 #   define ACE_INT64_LITERAL(n) n ## i64
00698 #  endif /* defined (__MINGW32__) */
00699 # elif defined (__TANDEM)
00700 #   define ACE_UINT64_LITERAL(n) n ## LL
00701 #   define ACE_INT64_LITERAL(n) n ## LL
00702 # else  /* ! ACE_WIN32  &&  ! ACE_LACKS_LONGLONG_T */
00703 #   define ACE_UINT64_LITERAL(n) n ## ull
00704 #   define ACE_INT64_LITERAL(n) n ## ll
00705 # endif /* ! ACE_WIN32  &&  ! ACE_LACKS_LONGLONG_T */
00706 
00707 #if !defined (ACE_INT8_FORMAT_SPECIFIER)
00708 #  if defined (PRId8)
00709 #    define ACE_INT8_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRId8)
00710 #  else
00711 #    define ACE_INT8_FORMAT_SPECIFIER ACE_TEXT ("%d")
00712 #  endif /* defined (PRId8) */
00713 #endif /* ACE_INT8_FORMAT_SPECIFIER */
00714 
00715 #if !defined (ACE_UINT8_FORMAT_SPECIFIER)
00716 #  if defined (PRIu8)
00717 #    define ACE_UINT8_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRIu8)
00718 #  else
00719 #    define ACE_UINT8_FORMAT_SPECIFIER ACE_TEXT ("%u")
00720 #  endif /* defined (PRIu8) */
00721 #endif /* ACE_UINT8_FORMAT_SPECIFIER */
00722 
00723 #if !defined (ACE_INT16_FORMAT_SPECIFIER)
00724 #  if defined (PRId16)
00725 #    define ACE_INT16_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRId16)
00726 #  else
00727 #    define ACE_INT16_FORMAT_SPECIFIER ACE_TEXT ("%d")
00728 #  endif /* defined (PRId16) */
00729 #endif /* ACE_INT16_FORMAT_SPECIFIER */
00730 
00731 #if !defined (ACE_UINT16_FORMAT_SPECIFIER)
00732 #  if defined (PRIu16)
00733 #    define ACE_UINT16_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRIu16)
00734 #  else
00735 #    define ACE_UINT16_FORMAT_SPECIFIER ACE_TEXT ("%u")
00736 #  endif /* defined (PRIu16) */
00737 #endif /* ACE_UINT16_FORMAT_SPECIFIER */
00738 
00739 #if !defined (ACE_INT32_FORMAT_SPECIFIER)
00740 #  if defined (PRId32)
00741 #    define ACE_INT32_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRId32)
00742 #  elif ACE_SIZEOF_INT == 4
00743 #    define ACE_INT32_FORMAT_SPECIFIER ACE_TEXT ("%d")
00744 #  else
00745 #    define ACE_INT32_FORMAT_SPECIFIER ACE_TEXT ("%ld")
00746 #  endif /* defined (PRId32) */
00747 #endif /* ACE_INT32_FORMAT_SPECIFIER */
00748 
00749 #if !defined (ACE_UINT32_FORMAT_SPECIFIER)
00750 #  if defined (PRIu32)
00751 #    define ACE_UINT32_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRIu32)
00752 #  elif ACE_SIZEOF_INT == 4
00753 #    define ACE_UINT32_FORMAT_SPECIFIER ACE_TEXT ("%u")
00754 #  else
00755 #    define ACE_UINT32_FORMAT_SPECIFIER ACE_TEXT ("%lu")
00756 #  endif /* defined (PRIu32) */
00757 #endif /* ACE_UINT32_FORMAT_SPECIFIER */
00758 
00759 #if !defined (ACE_INT64_FORMAT_SPECIFIER)
00760 #  if defined (PRId64)
00761 #    define ACE_INT64_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRId64)
00762 #  elif ACE_SIZEOF_LONG == 8
00763 #    define ACE_INT64_FORMAT_SPECIFIER ACE_TEXT ("%ld")
00764 #  else
00765 #    define ACE_INT64_FORMAT_SPECIFIER ACE_TEXT ("%lld")
00766 #  endif /* defined (PRId64) */
00767 #endif /* ACE_INT64_FORMAT_SPECIFIER */
00768 
00769 #if !defined (ACE_UINT64_FORMAT_SPECIFIER)
00770 #  if defined (PRIu64)
00771 #    define ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT ("%") ACE_TEXT (PRIu64)
00772 #  elif ACE_SIZEOF_LONG == 8
00773 #    define ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT ("%lu")
00774 #  else
00775 #    define ACE_UINT64_FORMAT_SPECIFIER ACE_TEXT ("%llu")
00776 #  endif /* defined (PRIu64) */
00777 #endif /* ACE_UINT64_FORMAT_SPECIFIER */
00778 
00779 #if !defined (ACE_SSIZE_T_FORMAT_SPECIFIER)
00780 # if defined (ACE_WIN64)
00781 #  define ACE_SSIZE_T_FORMAT_SPECIFIER ACE_TEXT ("%I64d")
00782 # else
00783 #  define ACE_SSIZE_T_FORMAT_SPECIFIER ACE_TEXT ("%d")
00784 # endif /* ACE_WIN64 */
00785 #endif /* ACE_SSIZE_T_FORMAT_SPECIFIER */
00786 
00787 #if !defined (ACE_SIZE_T_FORMAT_SPECIFIER)
00788 # if defined (ACE_WIN64)
00789 #  define ACE_SIZE_T_FORMAT_SPECIFIER ACE_TEXT ("%I64u")
00790 # else
00791 #  define ACE_SIZE_T_FORMAT_SPECIFIER ACE_TEXT ("%u")
00792 # endif /* ACE_WIN64 */
00793 #endif /* ACE_SIZE_T_FORMAT_SPECIFIER */
00794 
00795 // Cast from UINT64 to a double requires an intermediate cast to INT64
00796 // on some platforms.
00797 # if defined (ACE_LACKS_LONGLONG_T)
00798    // Only use the low 32 bits.
00799 #   define ACE_UINT64_DBLCAST_ADAPTER(n) ACE_U64_TO_U32 (n)
00800 # elif defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00801 #   define ACE_UINT64_DBLCAST_ADAPTER(n) ((n).to_int64 ())
00802 # elif defined (ACE_WIN32)
00803 #   define ACE_UINT64_DBLCAST_ADAPTER(n) static_cast<__int64> (n)
00804 # else  /* ! ACE_WIN32 && ! ACE_LACKS_LONGLONG_T */
00805 #   define ACE_UINT64_DBLCAST_ADAPTER(n) (n)
00806 # endif /* ! ACE_WIN32 && ! ACE_LACKS_LONGLONG_T */
00807 
00808 
00809 // The number of bytes in a float.
00810 # ifndef ACE_SIZEOF_FLOAT
00811 #   if FLT_MAX_EXP == 128
00812 #     define ACE_SIZEOF_FLOAT 4
00813 #   elif FLT_MAX_EXP == 1024
00814 #     define ACE_SIZEOF_FLOAT 8
00815 #   else
00816 #     error: unsupported float size, must be updated for this platform!
00817 #   endif /* FLT_MAX_EXP */
00818 # endif /* ACE_SIZEOF_FLOAT */
00819 
00820 // The number of bytes in a double.
00821 # ifndef ACE_SIZEOF_DOUBLE
00822 #   if DBL_MAX_EXP == 128
00823 #     define ACE_SIZEOF_DOUBLE 4
00824 #   elif DBL_MAX_EXP == 1024
00825 #     define ACE_SIZEOF_DOUBLE 8
00826 #   else
00827 #     error: unsupported double size, must be updated for this platform!
00828 #   endif /* DBL_MAX_EXP */
00829 # endif /* ACE_SIZEOF_DOUBLE */
00830 
00831 // The number of bytes in a long double.
00832 # ifndef ACE_SIZEOF_LONG_DOUBLE
00833 #   if LDBL_MAX_EXP == 128
00834 #     define ACE_SIZEOF_LONG_DOUBLE 4
00835 #   elif LDBL_MAX_EXP == 1024
00836 #     define ACE_SIZEOF_LONG_DOUBLE 8
00837 #   elif LDBL_MAX_EXP == 16384
00838 #     if defined (LDBL_DIG)  &&  LDBL_DIG == 18
00839 #       if defined (__ia64) || defined (__x86_64)
00840 #         define ACE_SIZEOF_LONG_DOUBLE 16
00841 #       else /* ! __ia64 */
00842 #       define ACE_SIZEOF_LONG_DOUBLE 12
00843 #       endif /* __ia64 */
00844 #     else  /* ! LDBL_DIG  ||  LDBL_DIG != 18 */
00845 #       define ACE_SIZEOF_LONG_DOUBLE 16
00846 #     endif /* ! LDBL_DIG  ||  LDBL_DIG != 18 */
00847 #   else
00848 #     error: unsupported double size, must be updated for this platform!
00849 #   endif /* LDBL_MAX_EXP */
00850 # endif /* ACE_SIZEOF_LONG_DOUBLE */
00851 
00852 // Max and min sizes for the ACE integer types.
00853 #define ACE_CHAR_MAX 0x7F
00854 #define ACE_CHAR_MIN -(ACE_CHAR_MAX)-1
00855 #define ACE_OCTET_MAX 0xFF
00856 #define ACE_INT16_MAX 0x7FFF
00857 #define ACE_INT16_MIN -(ACE_INT16_MAX)-1
00858 #define ACE_UINT16_MAX 0xFFFF
00859 #define ACE_WCHAR_MAX ACE_UINT16_MAX
00860 #define ACE_INT32_MAX 0x7FFFFFFF
00861 #define ACE_INT32_MIN -(ACE_INT32_MAX)-1
00862 #define ACE_UINT32_MAX 0xFFFFFFFF
00863 #define ACE_INT64_MAX ACE_INT64_LITERAL(0x7FFFFFFFFFFFFFFF)
00864 #define ACE_INT64_MIN -(ACE_INT64_MAX)-1
00865 
00866 #if defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
00867 // ACE_U_LongLong's constructor accepts a "long long" in this
00868 // case.  Set it to ACE_U_LongLong (-1) since the bit pattern for long
00869 // long (-1) is the same as the maximum unsigned long long value.
00870 # define ACE_UINT64_MAX ACE_U_LongLong (ACE_INT64_LITERAL (0xFFFFFFFFFFFFFFFF))
00871 #elif defined (ACE_LACKS_LONGLONG_T)
00872 // ACE_U_LongLong's constructor accepts an ACE_UINT32 low and high
00873 // pair of parameters.
00874 # define ACE_UINT64_MAX ACE_U_LongLong (0xFFFFFFFFu, 0xFFFFFFFFu)
00875 #else
00876 # define ACE_UINT64_MAX ACE_UINT64_LITERAL (0xFFFFFFFFFFFFFFFF)
00877 #endif  /* ACE_LACKS_UNSIGNEDLONGLONG_T */
00878 
00879 // These use ANSI/IEEE format.
00880 #define ACE_FLT_MAX 3.402823466e+38F
00881 #define ACE_FLT_MIN 1.175494351e-38F
00882 #define ACE_DBL_MAX 1.7976931348623158e+308
00883 #define ACE_DBL_MIN 2.2250738585072014e-308
00884 
00885 # if defined (__ACE_INLINE__)
00886 #   include "ace/Basic_Types.inl"
00887 # endif /* __ACE_INLINE__ */
00888 
00889 # include /**/ "ace/post.h"
00890 #endif /* ACE_BASIC_TYPES_H */

Generated on Tue Feb 2 17:18:38 2010 for ACE by  doxygen 1.4.7