GLM Version 0.9.0

_detail.hpp

00001 
00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
00004 // Created : 2008-07-24
00005 // Updated : 2008-08-31
00006 // Licence : This source is under MIT License
00007 // File    : glm/core/_detail.hpp
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(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_VC))
00022         typedef signed __int64                                          sint64;
00023         typedef unsigned __int64                                        uint64;
00024 #elif(defined(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_GCC))
00025         __extension__ typedef signed long long          sint64;
00026         __extension__ typedef unsigned long long        uint64;
00027 #else//unknown compiler
00028         typedef signed long                                                     sint64;
00029         typedef unsigned long                                           uint64;
00030 #endif//GLM_COMPILER
00031 
00032         template<bool C>
00033         struct If
00034         {
00035                 template<typename F, typename T>
00036                 static inline T apply(F functor, const T& val)
00037                 {
00038                         return functor(val);
00039                 }
00040         };
00041 
00042         template<>
00043         struct If<false>
00044         {
00045                 template<typename F, typename T>
00046                 static inline T apply(F, const T& val)
00047                 {
00048                         return val;
00049                 }
00050         };
00051 
00052         //template <typename T>
00053         //struct traits
00054         //{
00055         //      static const bool is_signed = false;
00056         //      static const bool is_float = false;
00057         //      static const bool is_vector = false;
00058         //      static const bool is_matrix = false;
00059         //      static const bool is_genType = false;
00060         //      static const bool is_genIType = false;
00061         //      static const bool is_genUType = false;
00062         //};
00063 
00064         //template <>
00065         //struct traits<half>
00066         //{
00067         //      static const bool is_float = true;
00068         //      static const bool is_genType = true;
00069         //};
00070 
00071         //template <>
00072         //struct traits<float>
00073         //{
00074         //      static const bool is_float = true;
00075         //      static const bool is_genType = true;
00076         //};
00077 
00078         //template <>
00079         //struct traits<double>
00080         //{
00081         //      static const bool is_float = true;
00082         //      static const bool is_genType = true;
00083         //};
00084 
00085         //template <typename genType>
00086         //struct desc
00087         //{
00088         //      typedef genType                                                 type;
00089         //      typedef genType *                                               pointer;
00090         //      typedef genType const*                                  const_pointer;
00091         //      typedef genType const *const                    const_pointer_const;
00092         //      typedef genType *const                                  pointer_const;
00093         //      typedef genType &                                               reference;
00094         //      typedef genType const&                                  const_reference;
00095         //      typedef genType const&                                  param_type;
00096 
00097         //      typedef typename genType::value_type    value_type;
00098         //      typedef typename genType::size_type             size_type;
00099         //      static const typename size_type                 value_size;
00100         //};
00101 
00102         //template <typename genType>
00103         //const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size();
00104 
00105         union uif32
00106         {
00107                 uif32() :
00108                         i(0)
00109                 {}
00110 
00111                 uif32(float f) :
00112                         f(f)
00113                 {}
00114 
00115                 uif32(unsigned int i) :
00116                         i(i)
00117                 {}
00118 
00119                 float f;
00120                 unsigned int i;
00121         };
00122 
00123         union uif64
00124         {
00125                 uif64() :
00126                         i(0)
00127                 {}
00128 
00129                 uif64(double f) :
00130                         f(f)
00131                 {}
00132 
00133                 uif64(uint64 i) :
00134                         i(i)
00135                 {}
00136 
00137                 double f;
00138                 uint64 i;
00139         };
00140 
00141         typedef uif32 uif;
00142 
00144         // int
00145 
00146         template <typename T>
00147         struct is_int
00148         {
00149                 enum is_int_enum
00150                 {
00151                         _YES = 0,
00152                         _NO = 1
00153                 };
00154         };
00155 
00156 #define GLM_DETAIL_IS_INT(T)    \
00157         template <>                                     \
00158         struct is_int<T>                        \
00159         {                                                       \
00160                 enum is_int_enum                \
00161                 {                                               \
00162                         _YES = 1,                       \
00163                         _NO = 0                         \
00164                 };                                              \
00165         }
00166 
00168         // uint
00169 
00170         template <typename T>
00171         struct is_uint
00172         {
00173                 enum is_uint_enum
00174                 {
00175                         _YES = 0,
00176                         _NO = 1
00177                 };
00178         };
00179 
00180 #define GLM_DETAIL_IS_UINT(T)   \
00181         template <>                                     \
00182         struct is_uint<T>                       \
00183         {                                                       \
00184                 enum is_uint_enum               \
00185                 {                                               \
00186                         _YES = 1,                       \
00187                         _NO = 0                         \
00188                 };                                              \
00189         }
00190 
00191         //GLM_DETAIL_IS_UINT(unsigned long long)
00192 
00194         // float
00195 
00196         template <typename T>
00197         struct is_float
00198         {
00199                 enum is_float_enum
00200                 {
00201                         _YES = 0,
00202                         _NO = 1
00203                 };
00204         };
00205 
00206 #define GLM_DETAIL_IS_FLOAT(T)  \
00207         template <>                                     \
00208         struct is_float<T>                      \
00209         {                                                       \
00210                 enum is_float_enum              \
00211                 {                                               \
00212                         _YES = 1,                       \
00213                         _NO = 0                         \
00214                 };                                              \
00215         }
00216 
00218         // bool
00219 
00220         template <typename T>
00221         struct is_bool
00222         {
00223                 enum is_bool_enum
00224                 {
00225                         _YES = 0,
00226                         _NO = 1
00227                 };
00228         };
00229         
00230         template <>
00231         struct is_bool<bool>
00232         {
00233                 enum is_bool_enum
00234                 {
00235                         _YES = 1,
00236                         _NO = 0
00237                 };
00238         };
00239         
00241         // vector
00242 
00243         template <typename T>
00244         struct is_vector
00245         {
00246                 enum is_vector_enum
00247                 {
00248                         _YES = 0,
00249                         _NO = 1
00250                 };
00251         };
00252 
00253 #define GLM_DETAIL_IS_VECTOR(T) \
00254         template <>                                     \
00255         struct is_vector                        \
00256         {                                                       \
00257                 enum is_vector_enum             \
00258                 {                                               \
00259                         _YES = 1,                       \
00260                         _NO = 0                         \
00261                 };                                              \
00262         }
00263 
00265         // matrix
00266 
00267         template <typename T>
00268         struct is_matrix
00269         {
00270                 enum is_matrix_enum
00271                 {
00272                         _YES = 0,
00273                         _NO = 1
00274                 };
00275         };
00276 
00277 #define GLM_DETAIL_IS_MATRIX(T) \
00278         template <>                                     \
00279         struct is_matrix                        \
00280         {                                                       \
00281                 enum is_matrix_enum             \
00282                 {                                               \
00283                         _YES = 1,                       \
00284                         _NO = 0                         \
00285                 };                                              \
00286         }
00287 
00289         // type
00290 
00291         template <typename T>
00292         struct type
00293         {
00294                 enum type_enum
00295                 {
00296                         is_float = is_float<T>::_YES,
00297                         is_int = is_int<T>::_YES,
00298                         is_uint = is_uint<T>::_YES,
00299                         is_bool = is_bool<T>::_YES
00300                 };
00301         };
00302 
00304         // type
00305 
00306         typedef signed char                                                     int8;
00307         typedef signed short                                            int16;
00308         typedef signed int                                                      int32;
00309         typedef detail::sint64                                          int64;
00310 
00311         typedef unsigned char                                           uint8;
00312         typedef unsigned short                                          uint16;
00313         typedef unsigned int                                            uint32;
00314         typedef detail::uint64                                          uint64;
00315 
00316         typedef detail::thalf                                           float16;
00317         typedef float                                                           float32;
00318         typedef double                                                          float64;
00319 
00320 }//namespace detail
00321 }//namespace glm
00322 
00323 #endif//glm_core_detail