Home | History | Annotate | Download | only in detail
      1 ///////////////////////////////////////////////////////////////////////////////////
      2 /// OpenGL Mathematics (glm.g-truc.net)
      3 ///
      4 /// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
      5 /// Permission is hereby granted, free of charge, to any person obtaining a copy
      6 /// of this software and associated documentation files (the "Software"), to deal
      7 /// in the Software without restriction, including without limitation the rights
      8 /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9 /// copies of the Software, and to permit persons to whom the Software is
     10 /// furnished to do so, subject to the following conditions:
     11 ///
     12 /// The above copyright notice and this permission notice shall be included in
     13 /// all copies or substantial portions of the Software.
     14 ///
     15 /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16 /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17 /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     18 /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19 /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20 /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     21 /// THE SOFTWARE.
     22 ///
     23 /// @ref core
     24 /// @file glm/core/type_int.hpp
     25 /// @date 2008-08-22 / 2013-03-30
     26 /// @author Christophe Riccio
     27 ///////////////////////////////////////////////////////////////////////////////////
     28 
     29 #ifndef glm_core_type_int
     30 #define glm_core_type_int
     31 
     32 #include "setup.hpp"
     33 
     34 #if GLM_HAS_EXTENDED_INTEGER_TYPE
     35 #	include <cstdint>
     36 #endif
     37 
     38 namespace glm{
     39 namespace detail
     40 {
     41 #	if GLM_HAS_EXTENDED_INTEGER_TYPE
     42 		typedef std::int8_t					int8;
     43 		typedef std::int16_t				int16;
     44 		typedef std::int32_t				int32;
     45 		typedef std::int64_t				int64;
     46 
     47 		typedef std::uint8_t				uint8;
     48 		typedef std::uint16_t				uint16;
     49 		typedef std::uint32_t				uint32;
     50 		typedef std::uint64_t				uint64;
     51 #	else
     52 #		if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available
     53 			typedef int64_t					sint64;
     54 			typedef uint64_t				uint64;
     55 #		elif(GLM_COMPILER & GLM_COMPILER_VC)
     56 			typedef signed __int64			sint64;
     57 			typedef unsigned __int64		uint64;
     58 #		elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG))
     59 			__extension__ typedef signed long long		sint64;
     60 			__extension__ typedef unsigned long long	uint64;
     61 #		elif(GLM_COMPILER & GLM_COMPILER_BC)
     62 			typedef Int64					sint64;
     63 			typedef Uint64					uint64;
     64 #		else//unknown compiler
     65 			typedef signed long	long		sint64;
     66 			typedef unsigned long long		uint64;
     67 #		endif//GLM_COMPILER
     68 
     69 		typedef signed char					int8;
     70 		typedef signed short				int16;
     71 		typedef signed int					int32;
     72 		typedef sint64						int64;
     73 
     74 		typedef unsigned char				uint8;
     75 		typedef unsigned short				uint16;
     76 		typedef unsigned int				uint32;
     77 		typedef uint64						uint64;
     78 #endif//
     79 
     80 	typedef signed int						lowp_int_t;
     81 	typedef signed int						mediump_int_t;
     82 	typedef signed int						highp_int_t;
     83 
     84 	typedef unsigned int					lowp_uint_t;
     85 	typedef unsigned int					mediump_uint_t;
     86 	typedef unsigned int					highp_uint_t;
     87 }//namespace detail
     88 
     89 	typedef detail::int8					int8;
     90 	typedef detail::int16					int16;
     91 	typedef detail::int32					int32;
     92 	typedef detail::int64					int64;
     93 
     94 	typedef detail::uint8					uint8;
     95 	typedef detail::uint16					uint16;
     96 	typedef detail::uint32					uint32;
     97 	typedef detail::uint64					uint64;
     98 
     99 	/// @addtogroup core_precision
    100 	/// @{
    101 
    102 	/// Low precision signed integer.
    103 	/// There is no guarantee on the actual precision.
    104 	///
    105 	/// @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>
    106 	/// @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>
    107 	typedef detail::lowp_int_t				lowp_int;
    108 
    109 	/// Medium precision signed integer.
    110 	/// There is no guarantee on the actual precision.
    111 	///
    112 	/// @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>
    113 	/// @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>
    114 	typedef detail::mediump_int_t			mediump_int;
    115 
    116 	/// High precision signed integer.
    117 	/// There is no guarantee on the actual precision.
    118 	///
    119 	/// @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>
    120 	/// @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>
    121 	typedef detail::highp_int_t				highp_int;
    122 
    123 	/// Low precision unsigned integer.
    124 	/// There is no guarantee on the actual precision.
    125 	///
    126 	/// @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>
    127 	/// @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>
    128 	typedef detail::lowp_uint_t				lowp_uint;
    129 
    130 	/// Medium precision unsigned integer.
    131 	/// There is no guarantee on the actual precision.
    132 	///
    133 	/// @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>
    134 	/// @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>
    135 	typedef detail::mediump_uint_t			mediump_uint;
    136 
    137 	/// High precision unsigned integer.
    138 	/// There is no guarantee on the actual precision.
    139 	///
    140 	/// @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>
    141 	/// @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>
    142 	typedef detail::highp_uint_t			highp_uint;
    143 
    144 #if(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))
    145 	typedef mediump_int					int_t;
    146 #elif(defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))
    147 	typedef highp_int					int_t;
    148 #elif(!defined(GLM_PRECISION_HIGHP_INT) && defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT))
    149 	typedef mediump_int					int_t;
    150 #elif(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT))
    151 	typedef lowp_int					int_t;
    152 #else
    153 #	error "GLM error: multiple default precision requested for signed interger types"
    154 #endif
    155 
    156 #if(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))
    157 	typedef mediump_uint				uint_t;
    158 #elif(defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))
    159 	typedef highp_uint					uint_t;
    160 #elif(!defined(GLM_PRECISION_HIGHP_UINT) && defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT))
    161 	typedef mediump_uint				uint_t;
    162 #elif(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && defined(GLM_PRECISION_LOWP_UINT))
    163 	typedef lowp_uint					uint_t;
    164 #else
    165 #	error "GLM error: multiple default precision requested for unsigned interger types"
    166 #endif
    167 
    168 	/// Unsigned integer type.
    169 	///
    170 	/// @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>
    171 	typedef unsigned int				uint;
    172 
    173 	/// @}
    174 
    175 ////////////////////
    176 // check type sizes
    177 #ifndef GLM_STATIC_ASSERT_NULL
    178 	GLM_STATIC_ASSERT(sizeof(glm::int8) == 1, "int8 size isn't 1 byte on this platform");
    179 	GLM_STATIC_ASSERT(sizeof(glm::int16) == 2, "int16 size isn't 2 bytes on this platform");
    180 	GLM_STATIC_ASSERT(sizeof(glm::int32) == 4, "int32 size isn't 4 bytes on this platform");
    181 	GLM_STATIC_ASSERT(sizeof(glm::int64) == 8, "int64 size isn't 8 bytes on this platform");
    182 
    183 	GLM_STATIC_ASSERT(sizeof(glm::uint8) == 1, "uint8 size isn't 1 byte on this platform");
    184 	GLM_STATIC_ASSERT(sizeof(glm::uint16) == 2, "uint16 size isn't 2 bytes on this platform");
    185 	GLM_STATIC_ASSERT(sizeof(glm::uint32) == 4, "uint32 size isn't 4 bytes on this platform");
    186 	GLM_STATIC_ASSERT(sizeof(glm::uint64) == 8, "uint64 size isn't 8 bytes on this platform");
    187 #endif//GLM_STATIC_ASSERT_NULL
    188 
    189 }//namespace glm
    190 
    191 #endif//glm_core_type_int
    192