pinocchio  2.2.1-dirty
sincos.hpp
1 //
2 // Copyright (c) 2015-2019 CNRS INRIA
3 // Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5 
6 #ifndef __math_sincos_hpp__
7 #define __math_sincos_hpp__
8 
9 #include <boost/type_traits.hpp>
10 #include <cmath>
11 
12 namespace pinocchio
13 {
15  template<typename Scalar, bool value = boost::is_floating_point<Scalar>::value> struct SINCOSAlgo;
16 
26  template<typename Scalar>
27  void SINCOS(const Scalar & a, Scalar * sa, Scalar * ca)
28  {
29  SINCOSAlgo<Scalar>::run(a,sa,ca);
30  }
31 
33  template<typename Scalar,bool>
34  struct SINCOSAlgo
35  {
36  static void run(const Scalar & a, Scalar * sa, Scalar * ca)
37  {
38  (*sa) = std::sin(a); (*ca) = std::cos(a);
39  }
40  };
41 
43  template<>
44  struct SINCOSAlgo<double>
45  {
46  static void run(const double & a, double * sa, double * ca)
47  {
48 #ifdef __linux__
49  sincos(a,sa,ca);
50 #elif __APPLE__
51  __sincos(a,sa,ca);
52 #else // if sincos specialization does not exist
53  (*sa) = std::sin(a); (*ca) = std::cos(a);
54 #endif
55  }
56  };
57 
59  template<>
60  struct SINCOSAlgo<float>
61  {
62  static void run(const float & a, float * sa, float * ca)
63  {
64 #ifdef __linux__
65  sincosf(a,sa,ca);
66 #elif __APPLE__
67  __sincosf(a,sa,ca);
68 #else // if sincosf specialization does not exist
69  (*sa) = std::sin(a); (*ca) = std::cos(a);
70 #endif
71  }
72  };
73 
75  template<>
76  struct SINCOSAlgo<long double>
77  {
78  static void run(const long double & a, long double * sa, long double * ca)
79  {
80 #ifdef __linux__
81  sincosl(a,sa,ca);
82 #else // if sincosl specialization does not exist
83  (*sa) = std::sin(a); (*ca) = std::cos(a);
84 #endif
85  }
86  };
87 
89  template<class Scalar>
90  struct SINCOSAlgo< Scalar, false >
91  {
92  static void run(const Scalar & a, Scalar * sa, Scalar * ca)
93  {
94  (*sa) = sin(a); (*ca) = cos(a);
95  }
96  };
97 
98 }
99 
100 #endif //#ifndef __math_sincos_hpp__
Forward declaration.
Definition: sincos.hpp:15
void SINCOS(const Scalar &a, Scalar *sa, Scalar *ca)
Computes sin/cos values of a given input scalar.
Definition: sincos.hpp:27
Main pinocchio namespace.
Definition: treeview.dox:24