1 /* Copyright Jukka Jyl�nki
2
3    Licensed under the Apache License, Version 2.0 (the "License");
4    you may not use this file except in compliance with the License.
5    You may obtain a copy of the License at
6
7        http://www.apache.org/licenses/LICENSE-2.0
8
9    Unless required by applicable law or agreed to in writing, software
10    distributed under the License is distributed on an "AS IS" BASIS,
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12    See the License for the specific language governing permissions and
13    limitations under the License. */
14 #pragma once
15
16 /** @file Types.h
17         @brief Provides platform-independent fixed size types. */
18
19 #ifdef MATH_TUNDRA_INTEROP
20 #include "CoreTypes.h"
21 #else
22
23 #ifndef KNET_NO_FIXEDWIDTH_TYPES
24
25 // As a reminder: http://predef.sourceforge.net/prestd.html
26
27 // If we have C99, take the types from there.
28 #if (__STDC_VERSION__ >= 199901L) || (_MSC_VER >= 1600)
29
30 #include <cstdint>
31
32 typedef uint8_t u8///< a single byte: 0-255.
33 typedef uint16_t u16///< 2 bytes: 0 - 65535.
34 typedef uint32_t u32; ///< 4 bytes: 0 - 4,294,967,295 ~ 4000 million or 4e9.
35 typedef uint64_t u64///< 8 bytes: 18,446,744,073,709,551,615 ~1.8e19.
36
37 typedef int8_t s8///< a single byte: -128 - 127.
38 typedef int16_t s16///< 2 bytes: -32768 - 32767.
39 typedef int32_t s32; ///< 4 bytes signed: max 2,147,483,647 ~ 2000 million or 2e9.
40 typedef int64_t s64///< 8 bytes signed. 9,223,372,036,854,775,807 ~ 9e18.
41
42 // Otherwise, if we have boost, we can also pull the types from there.
43 #elif defined(KNET_USE_BOOST)
44
45 #include <boost/cstdint.hpp>
46
47 typedef boost::uint8_t u8///< a single byte: 0-255.
48 typedef boost::uint16_t u16///< 2 bytes: 0 - 65535.
49 typedef boost::uint32_t u32; ///< 4 bytes: 0 - 4,294,967,295 ~ 4000 million or 4e9.
50 typedef boost::uint64_t u64///< 8 bytes: 18,446,744,073,709,551,615 ~1.8e19.
51
52 typedef boost::int8_t s8///< a single byte: -128 - 127.
53 typedef boost::int16_t s16///< 2 bytes: -32768 - 32767.
54 typedef boost::int32_t s32; ///< 4 bytes signed: max 2,147,483,647 ~ 2000 million or 2e9.
55 typedef boost::int64_t s64///< 8 bytes signed. 9,223,372,036,854,775,807 ~ 9e18.
56
57 #else // No boost or unknown if we have C99. Have to guess the following are correct.
58
59 #include <limits.h>
60
61 //#pragma warning "Not using boost and C99 not defined. Guessing the built-ins for fixed-width types!"
62
63 typedef unsigned char u8///< a single byte: 0-255.
64 typedef unsigned short u16///< 2 bytes: 0 - 65535.
65 typedef unsigned long long u64///< 8 bytes: 18,446,744,073,709,551,615 ~1.8e19.
66
67 typedef signed char s8///< a single byte: -128 - 127.
68 typedef signed short s16///< 2 bytes: -32768 - 32767.
69
70 #if ULONG_MAX == 0xffffffff
71 typedef unsigned long u32; ///< 4 bytes: 0 - 4,294,967,295 ~ 4000 million or 4e9.
72 typedef long s32; ///< 4 bytes signed: max 2,147,483,647 ~ 2000 million or 2e9.
73 #elif UINT_MAX == 0xffffffff
74 typedef unsigned int u32; ///< 4 bytes: 0 - 4,294,967,295 ~ 4000 million or 4e9.
75 typedef int s32; ///< 4 bytes signed: max 2,147,483,647 ~ 2000 million or 2e9.
76 #endif
77
78 typedef signed long long s64///< 8 bytes signed. 9,223,372,036,854,775,807 ~ 9e18.
79
80 #endif
81
82 #endif // ~KNET_NO_FIXEDWIDTH_TYPES
83
84 #endif
85
86 #ifdef _MSC_VER
87 #define STATIC_ASSERT static_assert
88 #else
89 // From http://stackoverflow.com/questions/3385515/static-assert-in-c
90 #define COMPILE_TIME_ASSERT4(COND,MSG) typedef char static_assertion_##MSG[(!!(COND))*2-1]
91 #define COMPILE_TIME_ASSERT3(X,L) COMPILE_TIME_ASSERT4(X,static_assertion_at_line_##L)
92 #define COMPILE_TIME_ASSERT2(X,L) COMPILE_TIME_ASSERT3(X,L)
93 #define STATIC_ASSERT(X, msg)    COMPILE_TIME_ASSERT2(X,__LINE__)
94 #endif
95
96 STATIC_ASSERT(sizeof(u8) == 1, "Typedef for fixed-width type u8 is incorrect!");
97 STATIC_ASSERT(sizeof(s8) == 1, "Typedef for fixed-width type s8 is incorrect!");
98 STATIC_ASSERT(sizeof(u16) == 2, "Typedef for fixed-width type u16 is incorrect!");
99 STATIC_ASSERT(sizeof(s16) == 2, "Typedef for fixed-width type s16 is incorrect!");
100 STATIC_ASSERT(sizeof(u32) == 4, "Typedef for fixed-width type u32 is incorrect!");
101 STATIC_ASSERT(sizeof(s32) == 4, "Typedef for fixed-width type s32 is incorrect!");
102 STATIC_ASSERT(sizeof(u64) == 8, "Typedef for fixed-width type u64 is incorrect!");
103 STATIC_ASSERT(sizeof(s64) == 8, "Typedef for fixed-width type s64 is incorrect!");
104
105 // Functions annotated with MUST_USE_RESULT require that the user stores the return value, or otherwise
106 // a warning is printed.
107 #if _MSC_VER >= 1700
108 // http://msdn.microsoft.com/en-us/library/jj159529.aspx
109 #define MUST_USE_RESULT _Check_return_
110 #elif defined(__clang__) || (defined(__GNUC__) && ((__GNUC__*10000+__GNUC_MINOR*100) >= 30400))
111 // http://gcc.gnu.org/onlinedocs/gcc-3.4.0/gcc/Function-Attributes.html
112 #define MUST_USE_RESULT __attribute__((warn_unused_result))
113 #else
114 #define MUST_USE_RESULT
115 #endif
116
117 // Looking at disasm, compilers have been seen to be stupid about inlining some single-instruction SIMD intrinsics functions, so use this to force.
118 #ifdef _DEBUG
119 #define FORCE_INLINE inline
120 #elif defined(_MSC_VER)
121 #define FORCE_INLINE __forceinline
122 #else
123 #define FORCE_INLINE inline __attribute__((always_inline))
124 #endif

Go back to previous page