00001
00002
00003
00004
00005
00006
00007
00008
00013 #ifndef quaternion_dot_h
00014 #define quaternion_dot_h
00015
00016 #include <cml/vector/vector_products.h>
00017 #include <cml/quaternion/quaternion_expr.h>
00018
00019 namespace cml {
00020 namespace detail {
00021
00022 template<class LeftT, class RightT> inline
00023 typename detail::DotPromote<LeftT,RightT>::promoted_scalar
00024 quaternion_dot(const LeftT& p, const RightT& q)
00025 {
00026 return p[0]*q[0] + p[1]*q[1] + p[2]*q[2] + p[3]*q[3];
00027 }
00028
00029 }
00030
00031 template<typename E1, class AT1, typename E2, class AT2, class OT, class CT>
00032 inline typename detail::DotPromote<
00033 quaternion<E1,AT1,OT,CT>, quaternion<E2,AT2,OT,CT>
00034 >::promoted_scalar
00035 dot(const quaternion<E1,AT1,OT,CT>& p,
00036 const quaternion<E2,AT2,OT,CT>& q)
00037 {
00038 return detail::quaternion_dot(p,q);
00039 }
00040
00041 template<typename E, class AT, class OT, class CT, class XprT>
00042 inline typename detail::DotPromote<
00043 quaternion<E,AT,OT,CT>, et::QuaternionXpr<XprT>
00044 >::promoted_scalar
00045 dot(const quaternion<E,AT,OT,CT>& p, QUATXPR_ARG_TYPE q)
00046 {
00047 return detail::quaternion_dot(p,q);
00048 }
00049
00050 template<class XprT, typename E, class AT, class OT, class CT>
00051 inline typename detail::DotPromote<
00052 et::QuaternionXpr<XprT>, quaternion<E,AT,OT,CT>
00053 >::promoted_scalar
00054 dot(QUATXPR_ARG_TYPE p, const quaternion<E,AT,OT,CT>& q)
00055 {
00056 return detail::quaternion_dot(p,q);
00057 }
00058
00059 template<class XprT1, class XprT2> inline
00060 typename detail::DotPromote<
00061 et::QuaternionXpr<XprT1>, et::QuaternionXpr<XprT2>
00062 >::promoted_scalar
00063 dot(QUATXPR_ARG_TYPE_N(1) p, QUATXPR_ARG_TYPE_N(2) q)
00064 {
00065 return detail::quaternion_dot(p,q);
00066 }
00067
00068 }
00069
00070 #endif
00071
00072
00073