1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. 2 3 //Distributed under the Boost Software License, Version 1.0. (See accompanying 4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef UUID_57E1C032B9F311DEB7D9BAFE55D89593 7 #define UUID_57E1C032B9F311DEB7D9BAFE55D89593 8 9 #include <boost/qvm/quat_traits.hpp> 10 #include <boost/qvm/vec_traits.hpp> 11 #include <boost/qvm/mat_traits.hpp> 12 #include <boost/qvm/inline.hpp> 13 14 namespace 15 boost 16 { 17 namespace 18 qvm 19 { 20 template <class Scalar> 21 struct 22 scalar_traits 23 { 24 static 25 BOOST_QVM_INLINE_CRITICAL 26 Scalar valueboost::qvm::scalar_traits27 value( int v ) 28 { 29 return Scalar(v); 30 } 31 }; 32 33 template <class T> 34 struct 35 is_scalar 36 { 37 static bool const value=false; 38 }; 39 template <> struct is_scalar<char> { static bool const value=true; }; 40 template <> struct is_scalar<signed char> { static bool const value=true; }; 41 template <> struct is_scalar<unsigned char> { static bool const value=true; }; 42 template <> struct is_scalar<signed short> { static bool const value=true; }; 43 template <> struct is_scalar<unsigned short> { static bool const value=true; }; 44 template <> struct is_scalar<signed int> { static bool const value=true; }; 45 template <> struct is_scalar<unsigned int> { static bool const value=true; }; 46 template <> struct is_scalar<signed long> { static bool const value=true; }; 47 template <> struct is_scalar<unsigned long> { static bool const value=true; }; 48 template <> struct is_scalar<float> { static bool const value=true; }; 49 template <> struct is_scalar<double> { static bool const value=true; }; 50 template <> struct is_scalar<long double> { static bool const value=true; }; 51 52 namespace 53 qvm_detail 54 { 55 template <class A,bool M=is_mat<A>::value,bool Q=is_quat<A>::value,bool V=is_vec<A>::value> 56 struct 57 scalar_impl 58 { 59 }; 60 61 template <class A> 62 struct 63 scalar_impl<A,true,false,false> 64 { 65 typedef typename mat_traits<A>::scalar_type type; 66 }; 67 68 template <class A> 69 struct 70 scalar_impl<A,false,true,false> 71 { 72 typedef typename quat_traits<A>::scalar_type type; 73 }; 74 75 template <class A> 76 struct 77 scalar_impl<A,false,false,true> 78 { 79 typedef typename vec_traits<A>::scalar_type type; 80 }; 81 } 82 83 template <class A> 84 struct 85 scalar 86 { 87 typedef typename qvm_detail::scalar_impl<A>::type type; 88 }; 89 } 90 } 91 92 #endif 93