00001 #ifndef PhysicsTools_Utilities_NthDerivative_h 00002 #define PhysicsTools_Utilities_NthDerivative_h 00003 00004 #include "PhysicsTools/Utilities/interface/Derivative.h" 00005 00006 namespace funct { 00007 00008 template<unsigned n, typename X, typename F> 00009 struct NthDerivative { 00010 typedef typename Derivative<X, typename NthDerivative<n - 1, X, F>::type>::type type; 00011 inline static type get(const F& f) { 00012 return derivative<X>(NthDerivative< n - 1, X, F>::get(f)); 00013 } 00014 }; 00015 00016 template<typename X, typename F> 00017 struct NthDerivative<1, X, F> : public Derivative< X, F > { }; 00018 00019 template<typename X, typename F> struct NthDerivative<0, X, F> { 00020 typedef F type; 00021 inline static type get(const F& f) { return f; } 00022 }; 00023 00024 template<unsigned n, typename X, typename F> 00025 typename NthDerivative<n, X, F>::type 00026 nth_derivative(const F& f) { return NthDerivative< n, X, F >::get(f); } 00027 00028 } 00029 00030 #endif