1 /* -*- C++ -*- ------------------------------------------------------------
3 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
5 The Configurable Math Library (CML) is distributed under the terms of the
6 Boost Software License, v1.0 (see cml/LICENSE for details).
8 *-----------------------------------------------------------------------*/
13 #ifndef quaternion_promotions_h
14 #define quaternion_promotions_h
16 #include <cml/et/scalar_promotions.h>
17 #include <cml/vector/vector_promotions.h>
22 /* Default quaternion type promotion templates. */
23 template<class LeftT
, class RightT
> struct QuaternionPromote
;
25 /** Type promotion for two quaternion types. */
26 template<typename E1
, class AT1
, typename E2
, class AT2
, class OT
, class CT
>
27 struct QuaternionPromote
<
28 cml::quaternion
<E1
,AT1
,OT
,CT
>,
29 cml::quaternion
<E2
,AT2
,OT
,CT
>
32 /* The deduced vector type: */
33 typedef typename VectorPromote
<
34 typename
cml::quaternion
<E1
,AT1
,OT
,CT
>::vector_type
,
35 typename
cml::quaternion
<E2
,AT2
,OT
,CT
>::vector_type
36 >::type promoted_vector
;
38 /* The deduced element and storage types: */
39 typedef typename
promoted_vector::value_type value_type
;
40 typedef typename
promoted_vector::storage_type storage_type
;
42 /* The deduced quaternion result type: */
43 typedef cml::quaternion
<value_type
,storage_type
,OT
,CT
> type
;
45 /* The temporary type: */
46 typedef typename
type::temporary_type temporary_type
;
50 * NOTE: QuaternionPromote* are somewhat ad hoc, and were added to
51 * simplify the code for quaternion slerp/squad/etc.
54 /** Type promotion for two quaternion types. */
55 template < class Quat1_T
, class Quat2_T
>
56 struct QuaternionPromote2
58 typedef typename QuaternionPromote
<
59 typename
Quat1_T::temporary_type
, typename
Quat2_T::temporary_type
60 >::temporary_type temporary_type
;
61 typedef typename
temporary_type::value_type value_type
;
64 /** Type promotion for three quaternion types. */
65 template < class Quat1_T
, class Quat2_T
, class Quat3_T
>
66 struct QuaternionPromote3
68 typedef typename QuaternionPromote
<
69 typename
Quat1_T::temporary_type
,
70 typename QuaternionPromote
<
71 typename
Quat2_T::temporary_type
, typename
Quat3_T::temporary_type
73 >::temporary_type temporary_type
;
74 typedef typename
temporary_type::value_type value_type
;
77 /** Type promotion for four quaternion types. */
78 template < class Quat1_T
, class Quat2_T
, class Quat3_T
, class Quat4_T
>
79 struct QuaternionPromote4
81 typedef typename QuaternionPromote
<
82 typename
Quat1_T::temporary_type
,
83 typename QuaternionPromote
<
84 typename
Quat2_T::temporary_type
,
85 typename QuaternionPromote
<
86 typename
Quat3_T::temporary_type
,
87 typename
Quat4_T::temporary_type
90 >::temporary_type temporary_type
;
91 typedef typename
temporary_type::value_type value_type
;
94 /** Type promotion for a quaternion and a scalar. */
95 template<typename E
, class AT
, class OT
, class CT
, typename S
>
96 struct QuaternionPromote
<cml::quaternion
<E
,AT
,OT
,CT
>, S
>
98 /* The deduced vector type: */
99 typedef typename VectorPromote
<
100 typename quaternion
<E
,AT
,OT
,CT
>::vector_type
, S
101 >::type promoted_vector
;
103 /* The deduced element and storage types: */
104 typedef typename
promoted_vector::value_type value_type
;
105 typedef typename
promoted_vector::storage_type storage_type
;
107 /* The deduced quaternion result type: */
108 typedef cml::quaternion
<value_type
,storage_type
,OT
,CT
> type
;
110 /* The temporary type: */
111 typedef typename
type::temporary_type temporary_type
;
114 /** Type promotion for a scalar and a quaternion. */
115 template<class S
, typename E
, class AT
, class OT
, class CT
>
116 struct QuaternionPromote
<S
, cml::quaternion
<E
,AT
,OT
,CT
> >
118 /* The deduced vector type: */
119 typedef typename VectorPromote
<
120 S
, typename quaternion
<E
,AT
,OT
,CT
>::vector_type
121 >::type promoted_vector
;
123 /* The deduced element and storage types: */
124 typedef typename
promoted_vector::value_type value_type
;
125 typedef typename
promoted_vector::storage_type storage_type
;
127 /* The deduced quaternion result type: */
128 typedef cml::quaternion
<value_type
,storage_type
,OT
,CT
> type
;
130 /* The temporary type: */
131 typedef typename
type::temporary_type temporary_type
;
139 // -------------------------------------------------------------------------