00001 #ifndef __VMML__DETAILS__HPP__
00002 #define __VMML__DETAILS__HPP__
00003
00004 #include <cmath>
00005 namespace vmml
00006 {
00007
00008 namespace details
00009 {
00010
00011
00012 template < typename T, typename U, bool b = T::value >
00013 struct enable_if
00014 {};
00015
00016
00017 template < typename T, typename U >
00018 struct enable_if <T, U, true >
00019 {
00020 typedef U type;
00021 };
00022
00023
00024 template< size_t M, size_t N >
00025 struct is_square
00026 {
00027 enum { value = M == N };
00028 };
00029
00030
00031 template< size_t M, size_t N, size_t Mwanted, size_t Nwanted >
00032 struct is_of_size
00033 {
00034 enum { value = ( M == Mwanted && N == Nwanted ) };
00035 };
00036
00037
00038 template< size_t Mreq, size_t M >
00039 struct has_M_components
00040 {
00041 enum{ value = ( Mreq == M ) };
00042 };
00043
00044 template< size_t Mreq, size_t M >
00045 struct has_M_or_more_components
00046 {
00047 enum{ value = ( Mreq <= M ) };
00048 };
00049
00050
00051 template< size_t M, size_t N, typename T >
00052 inline void
00053 matrix_is_square( typename enable_if< is_square< M, N >, T >::type* dummy = 0 )
00054 {
00055
00056 }
00057
00058
00059
00060 template< size_t M, size_t N, typename T >
00061 inline void
00062 matrix_is_3x3( typename enable_if< is_of_size< M, N, 3, 3 >, T >::type* dummy = 0 )
00063 {
00064
00065 }
00066
00067
00068
00069 template< size_t M, size_t N, typename T >
00070 inline void
00071 matrix_is_4x4( typename enable_if< is_of_size< M, N, 4, 4 >, T >::type* dummy = 0 )
00072 {
00073
00074 }
00075
00076
00077 template< size_t Mreq, size_t M, typename T >
00078 inline void
00079 number_of_parameters_must_be_M( typename enable_if< has_M_components< Mreq, M >, T >::type* dummy = 0 )
00080 {
00081
00082 }
00083
00084
00085 template< size_t Mreq, size_t M, typename T >
00086 inline void
00087 number_of_parameters_must_be_at_least_M( typename enable_if< has_M_or_more_components< Mreq, M >, T >::type* dummy = 0 )
00088 {
00089
00090 }
00091
00092
00093
00094
00095 template< typename float_t >
00096 inline float_t
00097 getSine( const float_t& angleInRadians )
00098 {
00099 return sin( angleInRadians );
00100 }
00101
00102 template<>
00103 inline float
00104 getSine( const float& angleInRadians )
00105 {
00106 return sinf( angleInRadians );
00107 }
00108
00109
00110 template< typename float_t >
00111 inline float_t
00112 getCosine( const float_t& angleInRadians )
00113 {
00114 return cos( angleInRadians );
00115 }
00116
00117 template<>
00118 inline float
00119 getCosine( const float& angleInRadians )
00120 {
00121 return cosf( angleInRadians );
00122 }
00123
00124
00125 template< typename float_t >
00126 inline float_t
00127 getSquareRoot( const float_t& number )
00128 {
00129 return sqrt( number );
00130 }
00131
00132
00133
00134 template<>
00135 inline float
00136 getSquareRoot( const float& number )
00137 {
00138 return sqrtf( number );
00139 }
00140
00141
00142 }
00143
00144 }
00145
00146 #endif
00147