1 /// @ref core 2 /// @file glm/detail/type_int.hpp 3 4 #pragma once 5 6 #include "setup.hpp" 7 #if GLM_HAS_MAKE_SIGNED 8 # include <type_traits> 9 #endif 10 11 #if GLM_HAS_EXTENDED_INTEGER_TYPE 12 # include <cstdint> 13 #endif 14 15 namespace glm{ 16 namespace detail 17 { 18 # if GLM_HAS_EXTENDED_INTEGER_TYPE 19 typedef std::int8_t int8; 20 typedef std::int16_t int16; 21 typedef std::int32_t int32; 22 typedef std::int64_t int64; 23 24 typedef std::uint8_t uint8; 25 typedef std::uint16_t uint16; 26 typedef std::uint32_t uint32; 27 typedef std::uint64_t uint64; 28 # else 29 # if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available 30 typedef int64_t sint64; 31 typedef uint64_t uint64; 32 33 # elif GLM_COMPILER & GLM_COMPILER_VC 34 typedef signed __int64 sint64; 35 typedef unsigned __int64 uint64; 36 37 # elif GLM_COMPILER & GLM_COMPILER_GCC 38 # pragma GCC diagnostic ignored "-Wlong-long" 39 __extension__ typedef signed long long sint64; 40 __extension__ typedef unsigned long long uint64; 41 42 # elif (GLM_COMPILER & GLM_COMPILER_CLANG) 43 # pragma clang diagnostic ignored "-Wc++11-long-long" 44 typedef signed long long sint64; 45 typedef unsigned long long uint64; 46 47 # else//unknown compiler 48 typedef signed long long sint64; 49 typedef unsigned long long uint64; 50 # endif//GLM_COMPILER 51 52 typedef signed char int8; 53 typedef signed short int16; 54 typedef signed int int32; 55 typedef sint64 int64; 56 57 typedef unsigned char uint8; 58 typedef unsigned short uint16; 59 typedef unsigned int uint32; 60 typedef uint64 uint64; 61 #endif// 62 63 typedef signed int lowp_int_t; 64 typedef signed int mediump_int_t; 65 typedef signed int highp_int_t; 66 67 typedef unsigned int lowp_uint_t; 68 typedef unsigned int mediump_uint_t; 69 typedef unsigned int highp_uint_t; 70 71 # if GLM_HAS_MAKE_SIGNED 72 using std::make_signed; 73 using std::make_unsigned; 74 75 # else//GLM_HAS_MAKE_SIGNED 76 template <typename genType> 77 struct make_signed 78 {}; 79 80 template <> 81 struct make_signed<char> 82 { 83 typedef char type; 84 }; 85 86 template <> 87 struct make_signed<short> 88 { 89 typedef short type; 90 }; 91 92 template <> 93 struct make_signed<int> 94 { 95 typedef int type; 96 }; 97 98 template <> 99 struct make_signed<long> 100 { 101 typedef long type; 102 }; 103 104 template <> 105 struct make_signed<unsigned char> 106 { 107 typedef char type; 108 }; 109 110 template <> 111 struct make_signed<unsigned short> 112 { 113 typedef short type; 114 }; 115 116 template <> 117 struct make_signed<unsigned int> 118 { 119 typedef int type; 120 }; 121 122 template <> 123 struct make_signed<unsigned long> 124 { 125 typedef long type; 126 }; 127 128 template <typename genType> 129 struct make_unsigned 130 {}; 131 132 template <> 133 struct make_unsigned<char> 134 { 135 typedef unsigned char type; 136 }; 137 138 template <> 139 struct make_unsigned<short> 140 { 141 typedef unsigned short type; 142 }; 143 144 template <> 145 struct make_unsigned<int> 146 { 147 typedef unsigned int type; 148 }; 149 150 template <> 151 struct make_unsigned<long> 152 { 153 typedef unsigned long type; 154 }; 155 156 template <> 157 struct make_unsigned<unsigned char> 158 { 159 typedef unsigned char type; 160 }; 161 162 template <> 163 struct make_unsigned<unsigned short> 164 { 165 typedef unsigned short type; 166 }; 167 168 template <> 169 struct make_unsigned<unsigned int> 170 { 171 typedef unsigned int type; 172 }; 173 174 template <> 175 struct make_unsigned<unsigned long> 176 { 177 typedef unsigned long type; 178 }; 179 180 template <> 181 struct make_signed<long long> 182 { 183 typedef long long type; 184 }; 185 186 template <> 187 struct make_signed<unsigned long long> 188 { 189 typedef long long type; 190 }; 191 192 template <> 193 struct make_unsigned<long long> 194 { 195 typedef unsigned long long type; 196 }; 197 198 template <> 199 struct make_unsigned<unsigned long long> 200 { 201 typedef unsigned long long type; 202 }; 203 # endif//GLM_HAS_MAKE_SIGNED 204 }//namespace detail 205 206 typedef detail::int8 int8; 207 typedef detail::int16 int16; 208 typedef detail::int32 int32; 209 typedef detail::int64 int64; 210 211 typedef detail::uint8 uint8; 212 typedef detail::uint16 uint16; 213 typedef detail::uint32 uint32; 214 typedef detail::uint64 uint64; 215 216 /// @addtogroup core_precision 217 /// @{ 218 219 /// Low precision signed integer. 220 /// There is no guarantee on the actual precision. 221 /// 222 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 223 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> 224 typedef detail::lowp_int_t lowp_int; 225 226 /// Medium precision signed integer. 227 /// There is no guarantee on the actual precision. 228 /// 229 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 230 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> 231 typedef detail::mediump_int_t mediump_int; 232 233 /// High precision signed integer. 234 /// There is no guarantee on the actual precision. 235 /// 236 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 237 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> 238 typedef detail::highp_int_t highp_int; 239 240 /// Low precision unsigned integer. 241 /// There is no guarantee on the actual precision. 242 /// 243 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 244 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> 245 typedef detail::lowp_uint_t lowp_uint; 246 247 /// Medium precision unsigned integer. 248 /// There is no guarantee on the actual precision. 249 /// 250 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 251 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> 252 typedef detail::mediump_uint_t mediump_uint; 253 254 /// High precision unsigned integer. 255 /// There is no guarantee on the actual precision. 256 /// 257 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 258 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> 259 typedef detail::highp_uint_t highp_uint; 260 261 #if(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) 262 typedef mediump_int int_t; 263 #elif(defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) 264 typedef highp_int int_t; 265 #elif(!defined(GLM_PRECISION_HIGHP_INT) && defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) 266 typedef mediump_int int_t; 267 #elif(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT)) 268 typedef lowp_int int_t; 269 #else 270 # error "GLM error: multiple default precision requested for signed integer types" 271 #endif 272 273 #if(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) 274 typedef mediump_uint uint_t; 275 #elif(defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) 276 typedef highp_uint uint_t; 277 #elif(!defined(GLM_PRECISION_HIGHP_UINT) && defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) 278 typedef mediump_uint uint_t; 279 #elif(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && defined(GLM_PRECISION_LOWP_UINT)) 280 typedef lowp_uint uint_t; 281 #else 282 # error "GLM error: multiple default precision requested for unsigned integer types" 283 #endif 284 285 /// Unsigned integer type. 286 /// 287 /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> 288 typedef unsigned int uint; 289 290 /// @} 291 292 //////////////////// 293 // check type sizes 294 #ifndef GLM_STATIC_ASSERT_NULL 295 GLM_STATIC_ASSERT(sizeof(glm::int8) == 1, "int8 size isn't 1 byte on this platform"); 296 GLM_STATIC_ASSERT(sizeof(glm::int16) == 2, "int16 size isn't 2 bytes on this platform"); 297 GLM_STATIC_ASSERT(sizeof(glm::int32) == 4, "int32 size isn't 4 bytes on this platform"); 298 GLM_STATIC_ASSERT(sizeof(glm::int64) == 8, "int64 size isn't 8 bytes on this platform"); 299 300 GLM_STATIC_ASSERT(sizeof(glm::uint8) == 1, "uint8 size isn't 1 byte on this platform"); 301 GLM_STATIC_ASSERT(sizeof(glm::uint16) == 2, "uint16 size isn't 2 bytes on this platform"); 302 GLM_STATIC_ASSERT(sizeof(glm::uint32) == 4, "uint32 size isn't 4 bytes on this platform"); 303 GLM_STATIC_ASSERT(sizeof(glm::uint64) == 8, "uint64 size isn't 8 bytes on this platform"); 304 #endif//GLM_STATIC_ASSERT_NULL 305 306 }//namespace glm 307