Merge of itasc branch. Project files, scons and cmake should be working. Makefile...
[blender.git] / intern / itasc / kdl / utilities / traits.h
1 #ifndef KDLPV_TRAITS_H 
2 #define KDLPV_TRAITS_H 
3
4 #include "utility.h"
5
6  
7 // forwards declarations :
8 namespace KDL {
9    class Frame;
10     class Rotation;
11     class Vector;
12     class Twist;
13     class Wrench;
14         class FrameVel;
15         class RotationVel;
16         class VectorVel;
17         class TwistVel;
18 }
19
20
21 /**
22  * @brief Traits are traits classes to determine the type of a derivative of another type.
23  *
24  * For geometric objects the "geometric" derivative is chosen.  For example the derivative of a Rotation
25  * matrix is NOT a 3x3 matrix containing the derivative of the elements of a rotation matrix.  The derivative
26  * of the rotation matrix is a Vector corresponding the rotational velocity.  Mostly used in template classes
27  * and routines to derive a correct type when needed.
28  * 
29  * You can see this as a compile-time lookuptable to find the type of the derivative.
30  *
31  * Example
32  * \verbatim
33         Rotation R;
34     Traits<Rotation> dR;
35    \endverbatim
36  */
37 template <typename T>
38 struct Traits {
39         typedef T valueType;
40         typedef T derivType;
41 };
42
43 template <>
44 struct Traits<KDL::Frame> {
45         typedef KDL::Frame valueType;
46         typedef KDL::Twist derivType;
47 };
48 template <>
49 struct Traits<KDL::Twist> {
50         typedef KDL::Twist valueType;
51         typedef KDL::Twist derivType;
52 };
53 template <>
54 struct Traits<KDL::Wrench> {
55         typedef KDL::Wrench valueType;
56         typedef KDL::Wrench derivType;
57 };
58
59 template <>
60 struct Traits<KDL::Rotation> {
61         typedef KDL::Rotation valueType;
62         typedef KDL::Vector derivType;
63 };
64
65 template <>
66 struct Traits<KDL::Vector> {
67         typedef KDL::Vector valueType;
68         typedef KDL::Vector derivType;
69 };
70
71 template <>
72 struct Traits<double> {
73         typedef double valueType;
74         typedef double derivType;
75 };
76
77 template <>
78 struct Traits<float> {
79         typedef float valueType;
80         typedef float derivType;
81 };
82
83 template <>
84 struct Traits<KDL::FrameVel> {
85         typedef KDL::Frame valueType;
86         typedef KDL::TwistVel derivType;
87 };
88 template <>
89 struct Traits<KDL::TwistVel> {
90         typedef KDL::Twist valueType;
91         typedef KDL::TwistVel derivType;
92 };
93
94 template <>
95 struct Traits<KDL::RotationVel> {
96         typedef KDL::Rotation valueType;
97         typedef KDL::VectorVel derivType;
98 };
99
100 template <>
101 struct Traits<KDL::VectorVel> {
102         typedef KDL::Vector valueType;
103         typedef KDL::VectorVel derivType;
104 };
105
106
107
108 #endif
109
110
111