Statistics
| Revision:

root / tmp / org.txm.statsengine.r.core.win32 / res / win32 / library / BH / include / boost / atomic / detail / int_sizes.hpp @ 2486

History | View | Annotate | Download (4.8 kB)

1
/*
2
 * Distributed under the Boost Software License, Version 1.0.
3
 * (See accompanying file LICENSE_1_0.txt or copy at
4
 * http://www.boost.org/LICENSE_1_0.txt)
5
 *
6
 * Copyright (c) 2014 Andrey Semashev
7
 */
8
/*!
9
 * \file   atomic/detail/int_sizes.hpp
10
 *
11
 * This header defines macros for testing buitin integer type sizes
12
 */
13

    
14
#ifndef BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
15
#define BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
16

    
17
#include <boost/atomic/detail/config.hpp>
18

    
19
#ifdef BOOST_HAS_PRAGMA_ONCE
20
#pragma once
21
#endif
22

    
23
// GCC and compatible compilers define internal macros with builtin type traits
24
#if defined(__SIZEOF_SHORT__)
25
#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT __SIZEOF_SHORT__
26
#endif
27
#if defined(__SIZEOF_INT__)
28
#define BOOST_ATOMIC_DETAIL_SIZEOF_INT __SIZEOF_INT__
29
#endif
30
#if defined(__SIZEOF_LONG__)
31
#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG __SIZEOF_LONG__
32
#endif
33
#if defined(__SIZEOF_LONG_LONG__)
34
#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG __SIZEOF_LONG_LONG__
35
#endif
36
#if defined(__SIZEOF_WCHAR_T__)
37
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__
38
#endif
39
#if defined(__SIZEOF_POINTER__)
40
#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER __SIZEOF_POINTER__
41
#elif defined(_MSC_VER)
42
#if defined(_M_AMD64) || defined(_M_IA64)
43
#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8
44
#else
45
#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4
46
#endif
47
#endif
48

    
49
#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
50
    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG)
51

    
52
// Try to deduce sizes from limits
53
#include <limits.h>
54
#include <boost/cstdint.hpp>
55

    
56
#if (USHRT_MAX + 0) == 0xff
57
#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1
58
#elif (USHRT_MAX + 0) == 0xffff
59
#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2
60
#elif (USHRT_MAX + 0) == 0xffffffff
61
#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4
62
#elif (USHRT_MAX + 0) == UINT64_C(0xffffffffffffffff)
63
#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8
64
#endif
65

    
66
#if (UINT_MAX + 0) == 0xff
67
#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1
68
#elif (UINT_MAX + 0) == 0xffff
69
#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2
70
#elif (UINT_MAX + 0) == 0xffffffff
71
#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4
72
#elif (UINT_MAX + 0) == UINT64_C(0xffffffffffffffff)
73
#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8
74
#endif
75

    
76
#if (ULONG_MAX + 0) == 0xff
77
#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1
78
#elif (ULONG_MAX + 0) == 0xffff
79
#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2
80
#elif (ULONG_MAX + 0) == 0xffffffff
81
#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4
82
#elif (ULONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
83
#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8
84
#endif
85

    
86
#if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
87
#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
88
#else
89

    
90
// The list of the non-standard macros (the ones except ULLONG_MAX) is taken from cstdint.hpp
91
#if defined(ULLONG_MAX)
92
#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX
93
#elif defined(ULONG_LONG_MAX)
94
#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX
95
#elif defined(ULONGLONG_MAX)
96
#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX
97
#elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer
98
#define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX
99
#endif
100

    
101
#if (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xff
102
#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1
103
#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffff
104
#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2
105
#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffffffff
106
#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4
107
#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
108
#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
109
#endif
110

    
111
#endif // defined(__hpux)
112

    
113
#endif
114

    
115
#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
116

    
117
#include <wchar.h>
118
#include <boost/cstdint.hpp>
119

    
120
 #if defined(_MSC_VER) && ( _MSC_VER <= 1310 || defined(UNDER_CE) && _MSC_VER <= 1500 )
121
// MSVC 7.1 and MSVC 8 (arm) define WCHAR_MAX to a value not suitable for constant expressions
122
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
123
#elif (WCHAR_MAX + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f
124
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1
125
#elif (WCHAR_MAX + 0) == 0xffff || (WCHAR_MAX + 0) == 0x7fff
126
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
127
#elif (WCHAR_MAX + 0) == 0xffffffff || (WCHAR_MAX + 0) == 0x7fffffff
128
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4
129
#elif (WCHAR_MAX + 0) == UINT64_C(0xffffffffffffffff) || (WCHAR_MAX + 0) == INT64_C(0x7fffffffffffffff)
130
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8
131
#endif
132
#endif
133

    
134
#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
135
    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\
136
    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
137
#error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers.
138
#endif
139

    
140
#endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_