File indexing completed on 2025-09-16 08:49:19
0001 #ifndef BOOST_QVM_DEDUCE_QUAT_HPP_INCLUDED
0002 #define BOOST_QVM_DEDUCE_QUAT_HPP_INCLUDED
0003
0004
0005
0006
0007
0008 #include <boost/qvm/deduce_scalar.hpp>
0009 #include <boost/qvm/quat_traits.hpp>
0010 #include <boost/qvm/static_assert.hpp>
0011
0012 namespace boost { namespace qvm {
0013
0014 template <class T>
0015 struct quat;
0016
0017 namespace
0018 qvm_detail
0019 {
0020 template <class Q,class S,
0021 class QS=typename quat_traits<Q>::scalar_type>
0022 struct
0023 deduce_q_default
0024 {
0025 BOOST_QVM_STATIC_ASSERT(is_quat<Q>::value);
0026 typedef quat<typename quat_traits<Q>::scalar_type> type;
0027 };
0028
0029 template <class Q,class S>
0030 struct
0031 deduce_q_default<Q,S,S>
0032 {
0033 BOOST_QVM_STATIC_ASSERT(is_quat<Q>::value);
0034 typedef Q type;
0035 };
0036 }
0037
0038 template <class Q,class S=typename quat_traits<Q>::scalar_type>
0039 struct
0040 deduce_quat
0041 {
0042 BOOST_QVM_STATIC_ASSERT(is_quat<Q>::value);
0043 typedef typename qvm_detail::deduce_q_default<Q,S>::type type;
0044 };
0045
0046 namespace
0047 qvm_detail
0048 {
0049 template <class A,class B,class S,
0050 bool IsScalarA=is_scalar<A>::value,
0051 bool IsScalarB=is_scalar<B>::value>
0052 struct
0053 deduce_q2_default
0054 {
0055 typedef quat<S> type;
0056 };
0057
0058 template <class Q,class S>
0059 struct
0060 deduce_q2_default<Q,Q,S,false,false>
0061 {
0062 BOOST_QVM_STATIC_ASSERT(is_quat<Q>::value);
0063 typedef Q type;
0064 };
0065
0066 template <class A,class B,class S>
0067 struct
0068 deduce_q2_default<A,B,S,false,true>
0069 {
0070 BOOST_QVM_STATIC_ASSERT(is_quat<A>::value);
0071 typedef typename deduce_quat<A,S>::type type;
0072 };
0073
0074 template <class A,class B,class S>
0075 struct
0076 deduce_q2_default<A,B,S,true,false>
0077 {
0078 BOOST_QVM_STATIC_ASSERT(is_quat<B>::value);
0079 typedef typename deduce_quat<B,S>::type type;
0080 };
0081 }
0082
0083 template <class A,class B,class S=typename deduce_scalar<typename scalar<A>::type,typename scalar<B>::type>::type>
0084 struct
0085 deduce_quat2
0086 {
0087 BOOST_QVM_STATIC_ASSERT(is_quat<A>::value || is_quat<B>::value);
0088 typedef typename qvm_detail::deduce_q2_default<A,B,S>::type type;
0089 };
0090
0091 } }
0092
0093 #endif