/////////////////////////////////////////////////////////////////////////////////// /// OpenGL Mathematics (glm.g-truc.net) /// /// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) /// Permission is hereby granted, free of charge, to any person obtaining a copy /// of this software and associated documentation files (the "Software"), to deal /// in the Software without restriction, including without limitation the rights /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell /// copies of the Software, and to permit persons to whom the Software is /// furnished to do so, subject to the following conditions: /// /// The above copyright notice and this permission notice shall be included in /// all copies or substantial portions of the Software. /// /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN /// THE SOFTWARE. /// /// @ref core /// @file glm/core/_detail.hpp /// @date 2008-07-24 / 2011-06-14 /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// #ifndef glm_core_detail #define glm_core_detail #include "setup.hpp" #include #if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) #include #endif namespace glm{ namespace detail { class half; #if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available typedef int64_t sint64; typedef uint64_t uint64; #elif(GLM_COMPILER & GLM_COMPILER_VC) typedef signed __int64 sint64; typedef unsigned __int64 uint64; #elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG)) __extension__ typedef signed long long sint64; __extension__ typedef unsigned long long uint64; #elif(GLM_COMPILER & GLM_COMPILER_BC) typedef Int64 sint64; typedef Uint64 uint64; #else//unknown compiler typedef signed long long sint64; typedef unsigned long long uint64; #endif//GLM_COMPILER template struct If { template static GLM_FUNC_QUALIFIER T apply(F functor, const T& val) { return functor(val); } }; template<> struct If { template static GLM_FUNC_QUALIFIER T apply(F, const T& val) { return val; } }; //template //struct traits //{ // static const bool is_signed = false; // static const bool is_float = false; // static const bool is_vector = false; // static const bool is_matrix = false; // static const bool is_genType = false; // static const bool is_genIType = false; // static const bool is_genUType = false; //}; //template <> //struct traits //{ // static const bool is_float = true; // static const bool is_genType = true; //}; //template <> //struct traits //{ // static const bool is_float = true; // static const bool is_genType = true; //}; //template <> //struct traits //{ // static const bool is_float = true; // static const bool is_genType = true; //}; //template //struct desc //{ // typedef genType type; // typedef genType * pointer; // typedef genType const* const_pointer; // typedef genType const *const const_pointer_const; // typedef genType *const pointer_const; // typedef genType & reference; // typedef genType const& const_reference; // typedef genType const& param_type; // typedef typename genType::value_type value_type; // typedef typename genType::size_type size_type; // static const typename size_type value_size; //}; //template //const typename desc::size_type desc::value_size = genType::value_size(); union uif32 { GLM_FUNC_QUALIFIER uif32() : i(0) {} GLM_FUNC_QUALIFIER uif32(float f) : f(f) {} GLM_FUNC_QUALIFIER uif32(unsigned int i) : i(i) {} float f; unsigned int i; }; union uif64 { GLM_FUNC_QUALIFIER uif64() : i(0) {} GLM_FUNC_QUALIFIER uif64(double f) : f(f) {} GLM_FUNC_QUALIFIER uif64(uint64 i) : i(i) {} double f; uint64 i; }; typedef uif32 uif; ////////////////// // int template struct is_int { enum is_int_enum { _YES = 0, _NO = 1 }; }; #define GLM_DETAIL_IS_INT(T) \ template <> \ struct is_int \ { \ enum is_int_enum \ { \ _YES = 1, \ _NO = 0 \ }; \ } ////////////////// // uint template struct is_uint { enum is_uint_enum { _YES = 0, _NO = 1 }; }; #define GLM_DETAIL_IS_UINT(T) \ template <> \ struct is_uint \ { \ enum is_uint_enum \ { \ _YES = 1, \ _NO = 0 \ }; \ } //GLM_DETAIL_IS_UINT(unsigned long long) ////////////////// // float template struct is_float { enum is_float_enum { _YES = 0, _NO = 1 }; }; #define GLM_DETAIL_IS_FLOAT(T) \ template <> \ struct is_float \ { \ enum is_float_enum \ { \ _YES = 1, \ _NO = 0 \ }; \ } GLM_DETAIL_IS_FLOAT(detail::half); GLM_DETAIL_IS_FLOAT(float); GLM_DETAIL_IS_FLOAT(double); GLM_DETAIL_IS_FLOAT(long double); ////////////////// // bool template struct is_bool { enum is_bool_enum { _YES = 0, _NO = 1 }; }; template <> struct is_bool { enum is_bool_enum { _YES = 1, _NO = 0 }; }; ////////////////// // vector template struct is_vector { enum is_vector_enum { _YES = 0, _NO = 1 }; }; # define GLM_DETAIL_IS_VECTOR(TYPE) \ template \ struct is_vector > \ { \ enum is_vector_enum \ { \ _YES = 1, \ _NO = 0 \ }; \ } ////////////////// // matrix template struct is_matrix { enum is_matrix_enum { _YES = 0, _NO = 1 }; }; #define GLM_DETAIL_IS_MATRIX(T) \ template <> \ struct is_matrix \ { \ enum is_matrix_enum \ { \ _YES = 1, \ _NO = 0 \ }; \ } ////////////////// // type template struct type { enum type_enum { is_float = is_float::_YES, is_int = is_int::_YES, is_uint = is_uint::_YES, is_bool = is_bool::_YES }; }; ////////////////// // type typedef signed char int8; typedef signed short int16; typedef signed int int32; typedef detail::sint64 int64; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; typedef detail::uint64 uint64; typedef detail::half float16; typedef float float32; typedef double float64; ////////////////// // float_or_int_trait struct float_or_int_value { enum { GLM_ERROR, GLM_FLOAT, GLM_INT }; }; template struct float_or_int_trait { enum{ID = float_or_int_value::GLM_ERROR}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_INT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_FLOAT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_FLOAT}; }; template <> struct float_or_int_trait { enum{ID = float_or_int_value::GLM_FLOAT}; }; }//namespace detail }//namespace glm #if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) # define GLM_DEPRECATED __declspec(deprecated) # define GLM_ALIGN(x) __declspec(align(x)) # define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct # define GLM_RESTRICT __declspec(restrict) # define GLM_RESTRICT_VAR __restrict # define GLM_CONSTEXPR #elif(GLM_COMPILER & GLM_COMPILER_INTEL) # define GLM_DEPRECATED # define GLM_ALIGN(x) __declspec(align(x)) # define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct # define GLM_RESTRICT # define GLM_RESTRICT_VAR __restrict # define GLM_CONSTEXPR #elif(((GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC)) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) || (GLM_COMPILER & GLM_COMPILER_CLANG)) # define GLM_DEPRECATED __attribute__((__deprecated__)) # define GLM_ALIGN(x) __attribute__((aligned(x))) # define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) # if(GLM_COMPILER >= GLM_COMPILER_GCC33) # define GLM_RESTRICT __restrict__ # define GLM_RESTRICT_VAR __restrict__ # else # define GLM_RESTRICT # define GLM_RESTRICT_VAR # endif # define GLM_RESTRICT __restrict__ # define GLM_RESTRICT_VAR __restrict__ # if((GLM_COMPILER >= GLM_COMPILER_GCC47) && ((GLM_LANG & GLM_LANG_CXX0X) == GLM_LANG_CXX0X)) # define GLM_CONSTEXPR constexpr # else # define GLM_CONSTEXPR # endif #else # define GLM_DEPRECATED # define GLM_ALIGN # define GLM_ALIGNED_STRUCT(x) # define GLM_RESTRICT # define GLM_RESTRICT_VAR # define GLM_CONSTEXPR #endif//GLM_COMPILER #endif//glm_core_detail