00001
00002
00004
00005
00006
00007
00009
00010 #ifndef glm_core_detail
00011 #define glm_core_detail
00012
00013 #include "setup.hpp"
00014 #include <cassert>
00015
00016 namespace glm{
00017 namespace detail
00018 {
00019 class thalf;
00020
00021 #if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available
00022 typedef int64_t sint64;
00023 typedef uint64_t uint64;
00024 #elif(GLM_COMPILER & GLM_COMPILER_VC)
00025 typedef signed __int64 sint64;
00026 typedef unsigned __int64 uint64;
00027 #elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG))
00028 __extension__ typedef signed long long sint64;
00029 __extension__ typedef unsigned long long uint64;
00030 #elif(GLM_COMPILER & GLM_COMPILER_BC)
00031 typedef Int64 sint64;
00032 typedef Uint64 uint64;
00033 #else//unknown compiler
00034 typedef signed long long sint64;
00035 typedef unsigned long long uint64;
00036 #endif//GLM_COMPILER
00037
00038 template<bool C>
00039 struct If
00040 {
00041 template<typename F, typename T>
00042 static GLM_FUNC_QUALIFIER T apply(F functor, const T& val)
00043 {
00044 return functor(val);
00045 }
00046 };
00047
00048 template<>
00049 struct If<false>
00050 {
00051 template<typename F, typename T>
00052 static GLM_FUNC_QUALIFIER T apply(F, const T& val)
00053 {
00054 return val;
00055 }
00056 };
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 union uif32
00112 {
00113 GLM_FUNC_QUALIFIER uif32() :
00114 i(0)
00115 {}
00116
00117 GLM_FUNC_QUALIFIER uif32(float f) :
00118 f(f)
00119 {}
00120
00121 GLM_FUNC_QUALIFIER uif32(unsigned int i) :
00122 i(i)
00123 {}
00124
00125 float f;
00126 unsigned int i;
00127 };
00128
00129 union uif64
00130 {
00131 GLM_FUNC_QUALIFIER uif64() :
00132 i(0)
00133 {}
00134
00135 GLM_FUNC_QUALIFIER uif64(double f) :
00136 f(f)
00137 {}
00138
00139 GLM_FUNC_QUALIFIER uif64(uint64 i) :
00140 i(i)
00141 {}
00142
00143 double f;
00144 uint64 i;
00145 };
00146
00147 typedef uif32 uif;
00148
00150
00151
00152 template <typename T>
00153 struct is_int
00154 {
00155 enum is_int_enum
00156 {
00157 _YES = 0,
00158 _NO = 1
00159 };
00160 };
00161
00162 #define GLM_DETAIL_IS_INT(T) \
00163 template <> \
00164 struct is_int<T> \
00165 { \
00166 enum is_int_enum \
00167 { \
00168 _YES = 1, \
00169 _NO = 0 \
00170 }; \
00171 }
00172
00174
00175
00176 template <typename T>
00177 struct is_uint
00178 {
00179 enum is_uint_enum
00180 {
00181 _YES = 0,
00182 _NO = 1
00183 };
00184 };
00185
00186 #define GLM_DETAIL_IS_UINT(T) \
00187 template <> \
00188 struct is_uint<T> \
00189 { \
00190 enum is_uint_enum \
00191 { \
00192 _YES = 1, \
00193 _NO = 0 \
00194 }; \
00195 }
00196
00197
00198
00200
00201
00202 template <typename T>
00203 struct is_float
00204 {
00205 enum is_float_enum
00206 {
00207 _YES = 0,
00208 _NO = 1
00209 };
00210 };
00211
00212 #define GLM_DETAIL_IS_FLOAT(T) \
00213 template <> \
00214 struct is_float<T> \
00215 { \
00216 enum is_float_enum \
00217 { \
00218 _YES = 1, \
00219 _NO = 0 \
00220 }; \
00221 }
00222
00224
00225
00226 template <typename T>
00227 struct is_bool
00228 {
00229 enum is_bool_enum
00230 {
00231 _YES = 0,
00232 _NO = 1
00233 };
00234 };
00235
00236 template <>
00237 struct is_bool<bool>
00238 {
00239 enum is_bool_enum
00240 {
00241 _YES = 1,
00242 _NO = 0
00243 };
00244 };
00245
00247
00248
00249 template <typename T>
00250 struct is_vector
00251 {
00252 enum is_vector_enum
00253 {
00254 _YES = 0,
00255 _NO = 1
00256 };
00257 };
00258
00259 # define GLM_DETAIL_IS_VECTOR(TYPE) \
00260 template <typename T> \
00261 struct is_vector<TYPE<T> > \
00262 { \
00263 enum is_vector_enum \
00264 { \
00265 _YES = 1, \
00266 _NO = 0 \
00267 }; \
00268 }
00269
00271
00272
00273 template <typename T>
00274 struct is_matrix
00275 {
00276 enum is_matrix_enum
00277 {
00278 _YES = 0,
00279 _NO = 1
00280 };
00281 };
00282
00283 #define GLM_DETAIL_IS_MATRIX(T) \
00284 template <> \
00285 struct is_matrix \
00286 { \
00287 enum is_matrix_enum \
00288 { \
00289 _YES = 1, \
00290 _NO = 0 \
00291 }; \
00292 }
00293
00295
00296
00297 template <typename T>
00298 struct type
00299 {
00300 enum type_enum
00301 {
00302 is_float = is_float<T>::_YES,
00303 is_int = is_int<T>::_YES,
00304 is_uint = is_uint<T>::_YES,
00305 is_bool = is_bool<T>::_YES
00306 };
00307 };
00308
00310
00311
00312 typedef signed char int8;
00313 typedef signed short int16;
00314 typedef signed int int32;
00315 typedef detail::sint64 int64;
00316
00317 typedef unsigned char uint8;
00318 typedef unsigned short uint16;
00319 typedef unsigned int uint32;
00320 typedef detail::uint64 uint64;
00321
00322 typedef detail::thalf float16;
00323 typedef float float32;
00324 typedef double float64;
00325
00326 }
00327 }
00328
00329 #if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005))
00330 # define GLM_DEPRECATED __declspec(deprecated)
00331 # define GLM_ALIGN(x) __declspec(align(x))
00332 # define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct
00333 # define GLM_RESTRICT __declspec(restrict)
00334 # define GLM_RESTRICT_VAR __restrict
00335 #elif((GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC)) && (GLM_COMPILER >= GLM_COMPILER_GCC31))
00336 # define GLM_DEPRECATED __attribute__((__deprecated__))
00337 # define GLM_ALIGN(x) __attribute__((aligned(x)))
00338 # define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x)))
00339 # if(GLM_COMPILER >= GLM_COMPILER_GCC33)
00340 # define GLM_RESTRICT __restrict__
00341 # define GLM_RESTRICT_VAR __restrict__
00342 # else
00343 # define GLM_RESTRICT
00344 # define GLM_RESTRICT_VAR
00345 # endif
00346 # define GLM_RESTRICT __restrict__
00347 # define GLM_RESTRICT_VAR __restrict__
00348 #else
00349 # define GLM_DEPRECATED
00350 # define GLM_ALIGN
00351 # define GLM_ALIGNED_STRUCT(x)
00352 # define GLM_RESTRICT
00353 # define GLM_RESTRICT_VAR
00354 #endif//GLM_COMPILER
00355
00356 #endif//glm_core_detail