#include <boost/qvm/q.hpp>
namespace boost
{
namespace qvm
{
//*** Quaternion operations ***
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
A & assign( A & a, B const & b );
//Only enabled if:
// is_q<R>::value && is_q<A>::value
template <class R,class A>
R make( A const & a );
//Only enabled if:
// is_q<R>::value && is_m<A>::value &&
// m_traits<A>::rows==3 && m_traits<A>::cols==3
template <class R,class A>
R make( A const & m );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
A & operator-=( A & a, B const & b );
//Only enabled if: is_q<A>::value
template <class A>
typename deduce_q<A>::type
operator-( A const & a );
//Only enabled if:
// is_q<A>::value && is_q<B>::value &&
template <class A,class B>
typename deduce_q2<A,B>::type
operator-( A const & a, B const & b );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
A & operator+=( A & a, B const & b );
//Only enabled if:
// is_q<A>::value && is_q<B>::value &&
template <class A,class B>
typename deduce_q2<A,B>::type
operator+( A const & a, B const & b );
//Only enabled if: is_q<A>::value
template <class A>
A & operator/=( A & a, q_traits<A>::scalar_type s );
//Only enabled if: is_q<A>::value
template <class A>
typename deduce_q<A>::type
operator/( A const & a, q_traits<A>::scalar_type s );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
A & operator*=( A & a, B const & b );
//Only enabled if: is_q<A>::value
template <class A>
A & operator*=( A & a, q_traits<A>::scalar_type s );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
typename deduce_q2<A,B>::type
operator*( A const & a, B const & b );
//Only enabled if: is_q<A>::value
template <class A>
typename deduce_q<A>::type
operator*( A const & a, q_traits<A>::scalar_type s );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
bool operator==( A const & a, B const & b );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
bool operator!=( A const & a, B const & b );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B,class Cmp>
bool cmp( A const & a, B const & b, Cmp pred );
//Only enabled if: is_q<A>::value
template <class A>
typename q_traits<A>::scalar_type
mag2( A const & a );
//Only enabled if: is_q<A>::value
template <class A>
typename q_traits<A>::scalar_type
mag( A const & a );
//Only enabled if: is_q<A>::value
template <class A>
typename deduce_q<A>::type
normalized( A const & a );
//Only enabled if: is_q<A>::value
template <class A>
void normalize( A & a );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
typename deduce_s<A,B>::type
dot( A const & a, B const & b );
//Only enabled if: is_q<A>::value
template <class A>
typename deduce_q<A>::type
conjugate( A const & a );
//Only enabled if: is_q<A>::value
template <class A>
typename deduce_q<A>::type
inverse( A const & a );
//Only enabled if:
// is_q<A>::value && is_q<B>::value
template <class A,class B>
typename deduce_q2<A,B> >::type
slerp( A const & a, B const & b, typename q_traits<typename deduce_q2<A,B>::type>::scalar_type t );
template <class T>
-unspecified-return-type- zero_q();
//Only enabled if: is_q<A>::value
template <class A>
void set_zero( A & a );
template <class S>
-unspecified-return-type- identity_q();
//Only enabled if: is_q<A>::value
template <class A>
void set_identity( A & a );
//Only enabled if:
// is_v<A>::value && v_traits<A>::dim==3
template <class A>
-unspecified-return-type- rot_q( A const & axis, typename v_traits<A>::scalar_type angle );
//Only enabled if:
// is_q<A>::value &&
// is_v<B>::value && v_traits<B>::dim==3
template <class A>
void set_rot( A & a, B const & axis, typename v_traits<B>::scalar_type angle );
//Only enabled if:
// is_q<A>::value &&
// is_v<B>::value && v_traits<B>::dim==3
template <class A,class B>
void rotate( A & a, B const & axis, typename q_traits<A>::scalar_type angle );
template <class Angle>
-unspecified-return-type- rotx_q( Angle const & angle );
//Only enabled if: is_q<A>::value
template <class A>
void set_rotx( A & a, typename q_traits<A>::scalar_type angle );
//Only enabled if: is_q<A>::value
template <class A>
void rotate_x( A & a, typename q_traits<A>::scalar_type angle );
template <class Angle>
-unspecified-return-type- roty_q( Angle const & angle );
//Only enabled if: is_q<A>::value
template <class A>
void set_rotz( A & a, typename q_traits<A>::scalar_type angle );
//Only enabled if: is_q<A>::value
template <class A>
void rotate_y( A & a, typename q_traits<A>::scalar_type angle );
template <class Angle>
-unspecified-return-type- rotz_q( Angle const & angle );
//Only enabled if: is_q<A>::value
template <class A>
void set_rotz( A & a, typename q_traits<A>::scalar_type angle );
//Only enabled if: is_q<A>::value
template <class A>
void rotate_z( A & a, typename q_traits<A>::scalar_type angle );
//Only enabled if: is_q<A>::value
template <class Scalar,class A>
-unspecified-return_type- scalar_cast( A const & a );
//Only enabled if: is_q<A>::value
template <class A>
-unspecified-return-type- qref( A & a );
}
}