1 // boost cstdint.hpp header file ------------------------------------------// 2 3 // (C) Copyright Beman Dawes 1999. 4 // (C) Copyright Jens Mauer 2001 5 // (C) Copyright John Maddock 2001 6 // Distributed under the Boost 7 // Software License, Version 1.0. (See accompanying file 8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 10 // See http://www.boost.org/libs/integer for documentation. 11 12 // Revision History 13 // 31 Oct 01 use BOOST_HAS_LONG_LONG to check for "long long" (Jens M.) 14 // 16 Apr 01 check LONGLONG_MAX when looking for "long long" (Jens Maurer) 15 // 23 Jan 01 prefer "long" over "int" for int32_t and intmax_t (Jens Maurer) 16 // 12 Nov 00 Merged <boost/stdint.h> (Jens Maurer) 17 // 23 Sep 00 Added INTXX_C macro support (John Maddock). 18 // 22 Sep 00 Better 64-bit support (John Maddock) 19 // 29 Jun 00 Reimplement to avoid including stdint.h within namespace boost 20 // 8 Aug 99 Initial version (Beman Dawes) 21 22 23 #ifndef BOOST_CSTDINT_HPP 24 #define BOOST_CSTDINT_HPP 25 26 // 27 // Since we always define the INT#_C macros as per C++0x, 28 // define __STDC_CONSTANT_MACROS so that <stdint.h> does the right 29 // thing if possible, and so that the user knows that the macros 30 // are actually defined as per C99. 31 // 32 #ifndef __STDC_CONSTANT_MACROS 33 # define __STDC_CONSTANT_MACROS 34 #endif 35 36 #include <boost/config.hpp> 37 38 // 39 // Note that GLIBC is a bit inconsistent about whether int64_t is defined or not 40 // depending upon what headers happen to have been included first... 41 // so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG. 42 // See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990 43 // 44 #if defined(BOOST_HAS_STDINT_H) && (!defined(__GLIBC__) || defined(__GLIBC_HAVE_LONG_LONG)) 45 46 // The following #include is an implementation artifact; not part of interface. 47 # ifdef __hpux 48 // HP-UX has a vaguely nice <stdint.h> in a non-standard location 49 # include <inttypes.h> 50 # ifdef __STDC_32_MODE__ 51 // this is triggered with GCC, because it defines __cplusplus < 199707L 52 # define BOOST_NO_INT64_T 53 # endif 54 # elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX) 55 # include <inttypes.h> 56 # else 57 # include <stdint.h> 58 59 // There is a bug in Cygwin two _C macros 60 # if defined(__STDC_CONSTANT_MACROS) && defined(__CYGWIN__) 61 # undef INTMAX_C 62 # undef UINTMAX_C 63 # define INTMAX_C(c) c##LL 64 # define UINTMAX_C(c) c##ULL 65 # endif 66 67 # endif 68 69 #ifdef __QNX__ 70 71 // QNX (Dinkumware stdlib) defines these as non-standard names. 72 // Reflect to the standard names. 73 74 typedef ::intleast8_t int_least8_t; 75 typedef ::intfast8_t int_fast8_t; 76 typedef ::uintleast8_t uint_least8_t; 77 typedef ::uintfast8_t uint_fast8_t; 78 79 typedef ::intleast16_t int_least16_t; 80 typedef ::intfast16_t int_fast16_t; 81 typedef ::uintleast16_t uint_least16_t; 82 typedef ::uintfast16_t uint_fast16_t; 83 84 typedef ::intleast32_t int_least32_t; 85 typedef ::intfast32_t int_fast32_t; 86 typedef ::uintleast32_t uint_least32_t; 87 typedef ::uintfast32_t uint_fast32_t; 88 89 # ifndef BOOST_NO_INT64_T 90 91 typedef ::intleast64_t int_least64_t; 92 typedef ::intfast64_t int_fast64_t; 93 typedef ::uintleast64_t uint_least64_t; 94 typedef ::uintfast64_t uint_fast64_t; 95 96 # endif 97 98 #endif 99 100 namespace boost 101 { 102 103 using ::int8_t; 104 using ::int_least8_t; 105 using ::int_fast8_t; 106 using ::uint8_t; 107 using ::uint_least8_t; 108 using ::uint_fast8_t; 109 110 using ::int16_t; 111 using ::int_least16_t; 112 using ::int_fast16_t; 113 using ::uint16_t; 114 using ::uint_least16_t; 115 using ::uint_fast16_t; 116 117 using ::int32_t; 118 using ::int_least32_t; 119 using ::int_fast32_t; 120 using ::uint32_t; 121 using ::uint_least32_t; 122 using ::uint_fast32_t; 123 124 # ifndef BOOST_NO_INT64_T 125 126 using ::int64_t; 127 using ::int_least64_t; 128 using ::int_fast64_t; 129 using ::uint64_t; 130 using ::uint_least64_t; 131 using ::uint_fast64_t; 132 133 # endif 134 135 using ::intmax_t; 136 using ::uintmax_t; 137 138 } // namespace boost 139 140 #elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || defined(__VMS) 141 // FreeBSD and Tru64 have an <inttypes.h> that contains much of what we need. 142 # include <inttypes.h> 143 144 namespace boost { 145 146 using ::int8_t; 147 typedef int8_t int_least8_t; 148 typedef int8_t int_fast8_t; 149 using ::uint8_t; 150 typedef uint8_t uint_least8_t; 151 typedef uint8_t uint_fast8_t; 152 153 using ::int16_t; 154 typedef int16_t int_least16_t; 155 typedef int16_t int_fast16_t; 156 using ::uint16_t; 157 typedef uint16_t uint_least16_t; 158 typedef uint16_t uint_fast16_t; 159 160 using ::int32_t; 161 typedef int32_t int_least32_t; 162 typedef int32_t int_fast32_t; 163 using ::uint32_t; 164 typedef uint32_t uint_least32_t; 165 typedef uint32_t uint_fast32_t; 166 167 # ifndef BOOST_NO_INT64_T 168 169 using ::int64_t; 170 typedef int64_t int_least64_t; 171 typedef int64_t int_fast64_t; 172 using ::uint64_t; 173 typedef uint64_t uint_least64_t; 174 typedef uint64_t uint_fast64_t; 175 176 typedef int64_t intmax_t; 177 typedef uint64_t uintmax_t; 178 179 # else 180 181 typedef int32_t intmax_t; 182 typedef uint32_t uintmax_t; 183 184 # endif 185 186 } // namespace boost 187 188 #else // BOOST_HAS_STDINT_H 189 190 # include <boost/limits.hpp> // implementation artifact; not part of interface 191 # include <limits.h> // needed for limits macros 192 193 194 namespace boost 195 { 196 197 // These are fairly safe guesses for some 16-bit, and most 32-bit and 64-bit 198 // platforms. For other systems, they will have to be hand tailored. 199 // 200 // Because the fast types are assumed to be the same as the undecorated types, 201 // it may be possible to hand tailor a more efficient implementation. Such 202 // an optimization may be illusionary; on the Intel x86-family 386 on, for 203 // example, byte arithmetic and load/stores are as fast as "int" sized ones. 204 205 // 8-bit types ------------------------------------------------------------// 206 207 # if UCHAR_MAX == 0xff 208 typedef signed char int8_t; 209 typedef signed char int_least8_t; 210 typedef signed char int_fast8_t; 211 typedef unsigned char uint8_t; 212 typedef unsigned char uint_least8_t; 213 typedef unsigned char uint_fast8_t; 214 # else 215 # error defaults not correct; you must hand modify boost/cstdint.hpp 216 # endif 217 218 // 16-bit types -----------------------------------------------------------// 219 220 # if USHRT_MAX == 0xffff 221 # if defined(__crayx1) 222 // The Cray X1 has a 16-bit short, however it is not recommend 223 // for use in performance critical code. 224 typedef short int16_t; 225 typedef short int_least16_t; 226 typedef int int_fast16_t; 227 typedef unsigned short uint16_t; 228 typedef unsigned short uint_least16_t; 229 typedef unsigned int uint_fast16_t; 230 # else 231 typedef short int16_t; 232 typedef short int_least16_t; 233 typedef short int_fast16_t; 234 typedef unsigned short uint16_t; 235 typedef unsigned short uint_least16_t; 236 typedef unsigned short uint_fast16_t; 237 # endif 238 # elif (USHRT_MAX == 0xffffffff) && defined(__MTA__) 239 // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified 240 // MTA / XMT does support the following non-standard integer types 241 typedef __short16 int16_t; 242 typedef __short16 int_least16_t; 243 typedef __short16 int_fast16_t; 244 typedef unsigned __short16 uint16_t; 245 typedef unsigned __short16 uint_least16_t; 246 typedef unsigned __short16 uint_fast16_t; 247 # elif (USHRT_MAX == 0xffffffff) && defined(CRAY) 248 // no 16-bit types on Cray: 249 typedef short int_least16_t; 250 typedef short int_fast16_t; 251 typedef unsigned short uint_least16_t; 252 typedef unsigned short uint_fast16_t; 253 # else 254 # error defaults not correct; you must hand modify boost/cstdint.hpp 255 # endif 256 257 // 32-bit types -----------------------------------------------------------// 258 259 # if UINT_MAX == 0xffffffff 260 typedef int int32_t; 261 typedef int int_least32_t; 262 typedef int int_fast32_t; 263 typedef unsigned int uint32_t; 264 typedef unsigned int uint_least32_t; 265 typedef unsigned int uint_fast32_t; 266 # elif (USHRT_MAX == 0xffffffff) 267 typedef short int32_t; 268 typedef short int_least32_t; 269 typedef short int_fast32_t; 270 typedef unsigned short uint32_t; 271 typedef unsigned short uint_least32_t; 272 typedef unsigned short uint_fast32_t; 273 # elif ULONG_MAX == 0xffffffff 274 typedef long int32_t; 275 typedef long int_least32_t; 276 typedef long int_fast32_t; 277 typedef unsigned long uint32_t; 278 typedef unsigned long uint_least32_t; 279 typedef unsigned long uint_fast32_t; 280 # elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__) 281 // Integers are 64 bits on the MTA / XMT 282 typedef __int32 int32_t; 283 typedef __int32 int_least32_t; 284 typedef __int32 int_fast32_t; 285 typedef unsigned __int32 uint32_t; 286 typedef unsigned __int32 uint_least32_t; 287 typedef unsigned __int32 uint_fast32_t; 288 # else 289 # error defaults not correct; you must hand modify boost/cstdint.hpp 290 # endif 291 292 // 64-bit types + intmax_t and uintmax_t ----------------------------------// 293 294 # if defined(BOOST_HAS_LONG_LONG) && \ 295 !defined(BOOST_MSVC) && !defined(__BORLANDC__) && \ 296 (!defined(__GLIBCPP__) || defined(_GLIBCPP_USE_LONG_LONG)) && \ 297 (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX)) 298 # if defined(__hpux) 299 // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions 300 # elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) 301 // 2**64 - 1 302 # else 303 # error defaults not correct; you must hand modify boost/cstdint.hpp 304 # endif 305 306 typedef ::boost::long_long_type intmax_t; 307 typedef ::boost::ulong_long_type uintmax_t; 308 typedef ::boost::long_long_type int64_t; 309 typedef ::boost::long_long_type int_least64_t; 310 typedef ::boost::long_long_type int_fast64_t; 311 typedef ::boost::ulong_long_type uint64_t; 312 typedef ::boost::ulong_long_type uint_least64_t; 313 typedef ::boost::ulong_long_type uint_fast64_t; 314 315 # elif ULONG_MAX != 0xffffffff 316 317 # if ULONG_MAX == 18446744073709551615 // 2**64 - 1 318 typedef long intmax_t; 319 typedef unsigned long uintmax_t; 320 typedef long int64_t; 321 typedef long int_least64_t; 322 typedef long int_fast64_t; 323 typedef unsigned long uint64_t; 324 typedef unsigned long uint_least64_t; 325 typedef unsigned long uint_fast64_t; 326 # else 327 # error defaults not correct; you must hand modify boost/cstdint.hpp 328 # endif 329 # elif defined(__GNUC__) && defined(BOOST_HAS_LONG_LONG) 330 __extension__ typedef long long intmax_t; 331 __extension__ typedef unsigned long long uintmax_t; 332 __extension__ typedef long long int64_t; 333 __extension__ typedef long long int_least64_t; 334 __extension__ typedef long long int_fast64_t; 335 __extension__ typedef unsigned long long uint64_t; 336 __extension__ typedef unsigned long long uint_least64_t; 337 __extension__ typedef unsigned long long uint_fast64_t; 338 # elif defined(BOOST_HAS_MS_INT64) 339 // 340 // we have Borland/Intel/Microsoft __int64: 341 // 342 typedef __int64 intmax_t; 343 typedef unsigned __int64 uintmax_t; 344 typedef __int64 int64_t; 345 typedef __int64 int_least64_t; 346 typedef __int64 int_fast64_t; 347 typedef unsigned __int64 uint64_t; 348 typedef unsigned __int64 uint_least64_t; 349 typedef unsigned __int64 uint_fast64_t; 350 # else // assume no 64-bit integers 351 # define BOOST_NO_INT64_T 352 typedef int32_t intmax_t; 353 typedef uint32_t uintmax_t; 354 # endif 355 356 } // namespace boost 357 358 359 #endif // BOOST_HAS_STDINT_H 360 361 #endif // BOOST_CSTDINT_HPP 362 363 364 /**************************************************** 365 366 Macro definition section: 367 368 Added 23rd September 2000 (John Maddock). 369 Modified 11th September 2001 to be excluded when 370 BOOST_HAS_STDINT_H is defined (John Maddock). 371 Modified 11th Dec 2009 to always define the 372 INT#_C macros if they're not already defined (John Maddock). 373 374 ******************************************************/ 375 376 #if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \ 377 (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C)) 378 // 379 // For the following code we get several warnings along the lines of: 380 // 381 // boost/cstdint.hpp:428:35: error: use of C99 long long integer constant 382 // 383 // So we declare this a system header to suppress these warnings. 384 // 385 #if defined(__GNUC__) && (__GNUC__ >= 4) 386 #pragma GCC system_header 387 #endif 388 389 #include <limits.h> 390 # define BOOST__STDC_CONSTANT_MACROS_DEFINED 391 # if defined(BOOST_HAS_MS_INT64) 392 // 393 // Borland/Intel/Microsoft compilers have width specific suffixes: 394 // 395 #ifndef INT8_C 396 # define INT8_C(value) value##i8 397 #endif 398 #ifndef INT16_C 399 # define INT16_C(value) value##i16 400 #endif 401 #ifndef INT32_C 402 # define INT32_C(value) value##i32 403 #endif 404 #ifndef INT64_C 405 # define INT64_C(value) value##i64 406 #endif 407 # ifdef __BORLANDC__ 408 // Borland bug: appending ui8 makes the type a signed char 409 # define UINT8_C(value) static_cast<unsigned char>(value##u) 410 # else 411 # define UINT8_C(value) value##ui8 412 # endif 413 #ifndef UINT16_C 414 # define UINT16_C(value) value##ui16 415 #endif 416 #ifndef UINT32_C 417 # define UINT32_C(value) value##ui32 418 #endif 419 #ifndef UINT64_C 420 # define UINT64_C(value) value##ui64 421 #endif 422 #ifndef INTMAX_C 423 # define INTMAX_C(value) value##i64 424 # define UINTMAX_C(value) value##ui64 425 #endif 426 427 # else 428 // do it the old fashioned way: 429 430 // 8-bit types ------------------------------------------------------------// 431 432 # if (UCHAR_MAX == 0xff) && !defined(INT8_C) 433 # define INT8_C(value) static_cast<boost::int8_t>(value) 434 # define UINT8_C(value) static_cast<boost::uint8_t>(value##u) 435 # endif 436 437 // 16-bit types -----------------------------------------------------------// 438 439 # if (USHRT_MAX == 0xffff) && !defined(INT16_C) 440 # define INT16_C(value) static_cast<boost::int16_t>(value) 441 # define UINT16_C(value) static_cast<boost::uint16_t>(value##u) 442 # endif 443 444 // 32-bit types -----------------------------------------------------------// 445 #ifndef INT32_C 446 # if (UINT_MAX == 0xffffffff) 447 # define INT32_C(value) value 448 # define UINT32_C(value) value##u 449 # elif ULONG_MAX == 0xffffffff 450 # define INT32_C(value) value##L 451 # define UINT32_C(value) value##uL 452 # endif 453 #endif 454 455 // 64-bit types + intmax_t and uintmax_t ----------------------------------// 456 #ifndef INT64_C 457 # if defined(BOOST_HAS_LONG_LONG) && \ 458 (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX) || defined(_LLONG_MAX)) 459 460 # if defined(__hpux) 461 // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions 462 # define INT64_C(value) value##LL 463 # define UINT64_C(value) value##uLL 464 # elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || \ 465 (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || \ 466 (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) || \ 467 (defined(_LLONG_MAX) && _LLONG_MAX == 18446744073709551615ULL) 468 469 # define INT64_C(value) value##LL 470 # define UINT64_C(value) value##uLL 471 # else 472 # error defaults not correct; you must hand modify boost/cstdint.hpp 473 # endif 474 # elif ULONG_MAX != 0xffffffff 475 476 # if ULONG_MAX == 18446744073709551615U // 2**64 - 1 477 # define INT64_C(value) value##L 478 # define UINT64_C(value) value##uL 479 # else 480 # error defaults not correct; you must hand modify boost/cstdint.hpp 481 # endif 482 # elif defined(BOOST_HAS_LONG_LONG) 483 // Usual macros not defined, work things out for ourselves: 484 # if(~0uLL == 18446744073709551615ULL) 485 # define INT64_C(value) value##LL 486 # define UINT64_C(value) value##uLL 487 # else 488 # error defaults not correct; you must hand modify boost/cstdint.hpp 489 # endif 490 # else 491 # error defaults not correct; you must hand modify boost/cstdint.hpp 492 # endif 493 494 # ifdef BOOST_NO_INT64_T 495 # define INTMAX_C(value) INT32_C(value) 496 # define UINTMAX_C(value) UINT32_C(value) 497 # else 498 # define INTMAX_C(value) INT64_C(value) 499 # define UINTMAX_C(value) UINT64_C(value) 500 # endif 501 #endif 502 # endif // Borland/Microsoft specific width suffixes 503 504 #endif // INT#_C macros. 505 506 507 508 509