4 #ifndef ROOT_Math_UnaryOperators
5 #define ROOT_Math_UnaryOperators
31 template <
class T,
unsigned int D>
class SVector;
32 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
class SMatrix;
46 static inline T apply(
const T& rhs) {
54 template <
class A,
class T,
unsigned int D>
55 inline VecExpr<UnaryOp<Minus<T>, VecExpr<A,T,D>, T>, T, D>
56 operator-(
const VecExpr<A,T,D>& rhs) {
57 typedef UnaryOp<Minus<T>, VecExpr<A,T,D>, T> MinusUnaryOp;
59 return VecExpr<MinusUnaryOp,T,D>(MinusUnaryOp(Minus<T>(),rhs));
72 template <
class T,
unsigned int D>
73 inline VecExpr<UnaryOp<Minus<T>, SVector<T,D>, T>, T, D>
74 operator-(
const SVector<T,D>& rhs) {
75 typedef UnaryOp<Minus<T>, SVector<T,D>, T> MinusUnaryOp;
77 return VecExpr<MinusUnaryOp,T,D>(MinusUnaryOp(Minus<T>(),rhs));
83 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
84 inline Expr<UnaryOp<Minus<T>, Expr<A,T,D,D2,R>, T>, T, D, D2,R>
85 operator-(
const Expr<A,T,D,D2,R>& rhs) {
86 typedef UnaryOp<Minus<T>, Expr<A,T,D,D2,R>, T> MinusUnaryOp;
88 return Expr<MinusUnaryOp,T,D,D2,R>(MinusUnaryOp(Minus<T>(),rhs));
101 template <
class T,
unsigned int D,
unsigned int D2,
class R>
102 inline Expr<UnaryOp<Minus<T>, SMatrix<T,D,D2,R>, T>, T, D, D2,R>
103 operator-(
const SMatrix<T,D,D2,R>& rhs) {
104 typedef UnaryOp<Minus<T>, SMatrix<T,D,D2,R>, T> MinusUnaryOp;
106 return Expr<MinusUnaryOp,T,D,D2,R>(MinusUnaryOp(Minus<T>(),rhs));
121 static inline T apply(
const T& rhs) {
122 return std::abs(rhs);
129 template <
class A,
class T,
unsigned int D>
130 inline VecExpr<UnaryOp<Fabs<T>, VecExpr<A,T,D>, T>, T, D>
131 fabs(
const VecExpr<A,T,D>& rhs) {
132 typedef UnaryOp<Fabs<T>, VecExpr<A,T,D>, T> FabsUnaryOp;
134 return VecExpr<FabsUnaryOp,T,D>(FabsUnaryOp(Fabs<T>(),rhs));
147 template <
class T,
unsigned int D>
148 inline VecExpr<UnaryOp<Fabs<T>, SVector<T,D>, T>, T, D>
149 fabs(
const SVector<T,D>& rhs) {
150 typedef UnaryOp<Fabs<T>, SVector<T,D>, T> FabsUnaryOp;
152 return VecExpr<FabsUnaryOp,T,D>(FabsUnaryOp(Fabs<T>(),rhs));
158 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
159 inline Expr<UnaryOp<Fabs<T>, Expr<A,T,D,D2,R>, T>, T, D, D2, R>
160 fabs(
const Expr<A,T,D,D2,R>& rhs) {
161 typedef UnaryOp<Fabs<T>, Expr<A,T,D,D2,R>, T> FabsUnaryOp;
163 return Expr<FabsUnaryOp,T,D,D2,R>(FabsUnaryOp(Fabs<T>(),rhs));
176 template <
class T,
unsigned int D,
unsigned int D2,
class R>
177 inline Expr<UnaryOp<Fabs<T>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
178 fabs(
const SMatrix<T,D,D2,R>& rhs) {
179 typedef UnaryOp<Fabs<T>, SMatrix<T,D,D2,R>, T> FabsUnaryOp;
181 return Expr<FabsUnaryOp,T,D,D2,R>(FabsUnaryOp(Fabs<T>(),rhs));
196 static inline T apply(
const T& rhs) {
204 template <
class A,
class T,
unsigned int D>
205 inline VecExpr<UnaryOp<Sqr<T>, VecExpr<A,T,D>, T>, T, D>
206 sqr(
const VecExpr<A,T,D>& rhs) {
207 typedef UnaryOp<Sqr<T>, VecExpr<A,T,D>, T> SqrUnaryOp;
209 return VecExpr<SqrUnaryOp,T,D>(SqrUnaryOp(Sqr<T>(),rhs));
222 template <
class T,
unsigned int D>
223 inline VecExpr<UnaryOp<Sqr<T>, SVector<T,D>, T>, T, D>
224 sqr(
const SVector<T,D>& rhs) {
225 typedef UnaryOp<Sqr<T>, SVector<T,D>, T> SqrUnaryOp;
227 return VecExpr<SqrUnaryOp,T,D>(SqrUnaryOp(Sqr<T>(),rhs));
233 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
234 inline Expr<UnaryOp<Sqr<T>, Expr<A,T,D,D2,R>, T>, T, D, D2, R>
235 sqr(
const Expr<A,T,D,D2,R>& rhs) {
236 typedef UnaryOp<Sqr<T>, Expr<A,T,D,D2,R>, T> SqrUnaryOp;
238 return Expr<SqrUnaryOp,T,D,D2,R>(SqrUnaryOp(Sqr<T>(),rhs));
251 template <
class T,
unsigned int D,
unsigned int D2,
class R>
252 inline Expr<UnaryOp<Sqr<T>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
253 sqr(
const SMatrix<T,D,D2,R>& rhs) {
254 typedef UnaryOp<Sqr<T>, SMatrix<T,D,D2,R>, T> SqrUnaryOp;
256 return Expr<SqrUnaryOp,T,D,D2,R>(SqrUnaryOp(Sqr<T>(),rhs));
271 static inline T apply(
const T& rhs) {
272 return std::sqrt(rhs);
279 template <
class A,
class T,
unsigned int D>
280 inline VecExpr<UnaryOp<Sqrt<T>, VecExpr<A,T,D>, T>, T, D>
281 sqrt(
const VecExpr<A,T,D>& rhs) {
282 typedef UnaryOp<Sqrt<T>, VecExpr<A,T,D>, T> SqrtUnaryOp;
284 return VecExpr<SqrtUnaryOp,T,D>(SqrtUnaryOp(Sqrt<T>(),rhs));
297 template <
class T,
unsigned int D>
298 inline VecExpr<UnaryOp<Sqrt<T>, SVector<T,D>, T>, T, D>
299 sqrt(
const SVector<T,D>& rhs) {
300 typedef UnaryOp<Sqrt<T>, SVector<T,D>, T> SqrtUnaryOp;
302 return VecExpr<SqrtUnaryOp,T,D>(SqrtUnaryOp(Sqrt<T>(),rhs));
308 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
309 inline Expr<UnaryOp<Sqrt<T>, Expr<A,T,D,D2,R>, T>, T, D, D2, R>
310 sqrt(
const Expr<A,T,D,D2,R>& rhs) {
311 typedef UnaryOp<Sqrt<T>, Expr<A,T,D,D2,R>, T> SqrtUnaryOp;
313 return Expr<SqrtUnaryOp,T,D,D2,R>(SqrtUnaryOp(Sqrt<T>(),rhs));
325 template <
class T,
unsigned int D,
unsigned int D2,
class R>
326 inline Expr<UnaryOp<Sqrt<T>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
327 sqrt(
const SMatrix<T,D,D2,R>& rhs) {
328 typedef UnaryOp<Sqrt<T>, SMatrix<T,D,D2,R>, T> SqrtUnaryOp;
330 return Expr<SqrtUnaryOp,T,D,D2,R>(SqrtUnaryOp(Sqrt<T>(),rhs));