Back to home page

EIC code displayed by LXR

 
 

    


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 // Copyright 2008-2024 Emil Dotchevski and Reverge Studios, Inc.
0005 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0006 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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