4 #ifndef ROOT_Math_BinaryOperators
5 #define ROOT_Math_BinaryOperators
30 template <
class T,
unsigned int D>
class SVector;
31 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
class SMatrix;
45 static inline T apply(
const T& lhs,
const T& rhs) {
60 template <
class T,
unsigned int D>
61 inline VecExpr<BinaryOp<AddOp<T>, SVector<T,D>, SVector<T,D>, T>, T, D>
62 operator+(
const SVector<T,D>& lhs,
const SVector<T,D>& rhs) {
63 typedef BinaryOp<AddOp<T>, SVector<T,D>, SVector<T,D>, T> AddOpBinOp;
65 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),lhs,rhs));
72 template <
class A,
class T,
unsigned int D>
73 inline VecExpr<BinaryOp<AddOp<T>, VecExpr<A,T,D>, SVector<T,D>, T>, T, D>
74 operator+(
const VecExpr<A,T,D>& lhs,
const SVector<T,D>& rhs) {
75 typedef BinaryOp<AddOp<T>, VecExpr<A,T,D>, SVector<T,D>, T> AddOpBinOp;
77 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),lhs,rhs));
84 template <
class A,
class T,
unsigned int D>
85 inline VecExpr<BinaryOp<AddOp<T>, SVector<T,D>, VecExpr<A,T,D>, T>, T, D>
86 operator+(
const SVector<T,D>& lhs,
const VecExpr<A,T,D>& rhs) {
87 typedef BinaryOp<AddOp<T>, SVector<T,D>, VecExpr<A,T,D>, T> AddOpBinOp;
89 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),lhs,rhs));
96 template <
class A,
class B,
class T,
unsigned int D>
97 inline VecExpr<BinaryOp<AddOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T>, T, D>
98 operator+(
const VecExpr<A,T,D>& lhs,
const VecExpr<B,T,D>& rhs) {
99 typedef BinaryOp<AddOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T> AddOpBinOp;
101 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),lhs,rhs));
114 template <
class A,
class T,
unsigned int D>
115 inline VecExpr<BinaryOpCopyR<AddOp<T>, SVector<T,D>, Constant<A>, T>, T, D>
116 operator+(
const SVector<T,D>& lhs,
const A& rhs) {
117 typedef BinaryOpCopyR<AddOp<T>, SVector<T,D>, Constant<A>, T> AddOpBinOp;
119 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),lhs,Constant<A>(rhs)));
131 template <
class A,
class T,
unsigned int D>
132 inline VecExpr<BinaryOpCopyL<AddOp<T>, Constant<A>, SVector<T,D>, T>, T, D>
133 operator+(
const A& lhs,
const SVector<T,D>& rhs) {
134 typedef BinaryOpCopyL<AddOp<T>, Constant<A>, SVector<T,D>, T> AddOpBinOp;
136 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),Constant<A>(lhs),rhs));
143 template <
class A,
class B,
class T,
unsigned int D>
144 inline VecExpr<BinaryOpCopyR<AddOp<T>, VecExpr<B,T,D>, Constant<A>, T>, T, D>
145 operator+(
const VecExpr<B,T,D>& lhs,
const A& rhs) {
146 typedef BinaryOpCopyR<AddOp<T>, VecExpr<B,T,D>, Constant<A>, T> AddOpBinOp;
148 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),lhs,Constant<A>(rhs)));
154 template <
class A,
class B,
class T,
unsigned int D>
155 inline VecExpr<BinaryOpCopyL<AddOp<T>, Constant<A>, VecExpr<B,T,D>, T>, T, D>
156 operator+(
const A& lhs,
const VecExpr<B,T,D>& rhs) {
157 typedef BinaryOpCopyL<AddOp<T>, Constant<A>, VecExpr<B,T,D>, T> AddOpBinOp;
159 return VecExpr<AddOpBinOp,T,D>(AddOpBinOp(AddOp<T>(),Constant<A>(lhs),rhs));
172 template <
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
173 inline Expr<BinaryOp<AddOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType >
174 operator+(
const SMatrix<T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
175 typedef BinaryOp<AddOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> AddOpBinOp;
177 return Expr<AddOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(AddOpBinOp(AddOp<T>(),lhs,rhs));
184 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
185 inline Expr<BinaryOp<AddOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
186 operator+(
const Expr<A,T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
187 typedef BinaryOp<AddOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> AddOpBinOp;
189 return Expr<AddOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(AddOpBinOp(AddOp<T>(),lhs,rhs));
196 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
197 inline Expr<BinaryOp<AddOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
198 operator+(
const SMatrix<T,D,D2,R1>& lhs,
const Expr<A,T,D,D2,R2>& rhs) {
199 typedef BinaryOp<AddOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T> AddOpBinOp;
201 return Expr<AddOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(AddOpBinOp(AddOp<T>(),lhs,rhs));
208 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
209 inline Expr<BinaryOp<AddOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType >
210 operator+(
const Expr<A,T,D,D2,R1>& lhs,
const Expr<B,T,D,D2,R2>& rhs) {
211 typedef BinaryOp<AddOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T> AddOpBinOp;
213 return Expr<AddOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(AddOpBinOp(AddOp<T>(),lhs,rhs));
226 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
227 inline Expr<BinaryOpCopyR<AddOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
228 operator+(
const SMatrix<T,D,D2,R>& lhs,
const A& rhs) {
229 typedef BinaryOpCopyR<AddOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T> AddOpBinOp;
231 return Expr<AddOpBinOp,T,D,D2,R>(AddOpBinOp(AddOp<T>(),lhs,Constant<A>(rhs)));
243 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
244 inline Expr<BinaryOpCopyL<AddOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
245 operator+(
const A& lhs,
const SMatrix<T,D,D2,R>& rhs) {
246 typedef BinaryOpCopyL<AddOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T> AddOpBinOp;
248 return Expr<AddOpBinOp,T,D,D2,R>(AddOpBinOp(AddOp<T>(),
249 Constant<A>(lhs),rhs));
256 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
257 inline Expr<BinaryOpCopyR<AddOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
258 operator+(
const Expr<B,T,D,D2,R>& lhs,
const A& rhs) {
259 typedef BinaryOpCopyR<AddOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T> AddOpBinOp;
261 return Expr<AddOpBinOp,T,D,D2,R>(AddOpBinOp(AddOp<T>(),
262 lhs,Constant<A>(rhs)));
268 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
269 inline Expr<BinaryOpCopyL<AddOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T>, T, D, D2, R>
270 operator+(
const A& lhs,
const Expr<B,T,D,D2,R>& rhs) {
271 typedef BinaryOpCopyL<AddOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T> AddOpBinOp;
273 return Expr<AddOpBinOp,T,D,D2,R>(AddOpBinOp(AddOp<T>(),
274 Constant<A>(lhs),rhs));
289 static inline T apply(
const T& lhs,
const T& rhs) {
304 template <
class T,
unsigned int D>
305 inline VecExpr<BinaryOp<MinOp<T>, SVector<T,D>, SVector<T,D>, T>, T, D>
306 operator-(
const SVector<T,D>& lhs,
const SVector<T,D>& rhs) {
307 typedef BinaryOp<MinOp<T>, SVector<T,D>, SVector<T,D>, T> MinOpBinOp;
309 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),lhs,rhs));
316 template <
class A,
class T,
unsigned int D>
317 inline VecExpr<BinaryOp<MinOp<T>, VecExpr<A,T,D>, SVector<T,D>, T>, T, D>
318 operator-(
const VecExpr<A,T,D>& lhs,
const SVector<T,D>& rhs) {
319 typedef BinaryOp<MinOp<T>, VecExpr<A,T,D>, SVector<T,D>, T> MinOpBinOp;
321 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),lhs,rhs));
328 template <
class A,
class T,
unsigned int D>
329 inline VecExpr<BinaryOp<MinOp<T>, SVector<T,D>, VecExpr<A,T,D>, T>, T, D>
330 operator-(
const SVector<T,D>& lhs,
const VecExpr<A,T,D>& rhs) {
331 typedef BinaryOp<MinOp<T>, SVector<T,D>, VecExpr<A,T,D>, T> MinOpBinOp;
333 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),lhs,rhs));
340 template <
class A,
class B,
class T,
unsigned int D>
341 inline VecExpr<BinaryOp<MinOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T>, T, D>
342 operator-(
const VecExpr<A,T,D>& lhs,
const VecExpr<B,T,D>& rhs) {
343 typedef BinaryOp<MinOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T> MinOpBinOp;
345 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),lhs,rhs));
358 template <
class A,
class T,
unsigned int D>
359 inline VecExpr<BinaryOpCopyR<MinOp<T>, SVector<T,D>, Constant<A>, T>, T, D>
360 operator-(
const SVector<T,D>& lhs,
const A& rhs) {
361 typedef BinaryOpCopyR<MinOp<T>, SVector<T,D>, Constant<A>, T> MinOpBinOp;
363 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),lhs,Constant<A>(rhs)));
375 template <
class A,
class T,
unsigned int D>
376 inline VecExpr<BinaryOpCopyL<MinOp<T>, Constant<A>, SVector<T,D>, T>, T, D>
377 operator-(
const A& lhs,
const SVector<T,D>& rhs) {
378 typedef BinaryOpCopyL<MinOp<T>, Constant<A>, SVector<T,D>, T> MinOpBinOp;
380 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),Constant<A>(lhs),rhs));
387 template <
class A,
class B,
class T,
unsigned int D>
388 inline VecExpr<BinaryOpCopyR<MinOp<T>, VecExpr<B,T,D>, Constant<A>, T>, T, D>
389 operator-(
const VecExpr<B,T,D>& lhs,
const A& rhs) {
390 typedef BinaryOpCopyR<MinOp<T>, VecExpr<B,T,D>, Constant<A>, T> MinOpBinOp;
392 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),lhs,Constant<A>(rhs)));
398 template <
class A,
class B,
class T,
unsigned int D>
399 inline VecExpr<BinaryOpCopyL<MinOp<T>, Constant<A>, VecExpr<B,T,D>, T>, T, D>
400 operator-(
const A& lhs,
const VecExpr<B,T,D>& rhs) {
401 typedef BinaryOpCopyL<MinOp<T>, Constant<A>, VecExpr<B,T,D>, T> MinOpBinOp;
403 return VecExpr<MinOpBinOp,T,D>(MinOpBinOp(MinOp<T>(),Constant<A>(lhs),rhs));
416 template <
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
417 inline Expr<BinaryOp<MinOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
418 operator-(
const SMatrix<T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
419 typedef BinaryOp<MinOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> MinOpBinOp;
421 return Expr<MinOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MinOpBinOp(MinOp<T>(),lhs,rhs));
428 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
429 inline Expr<BinaryOp<MinOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
430 operator-(
const Expr<A,T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
431 typedef BinaryOp<MinOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> MinOpBinOp;
433 return Expr<MinOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MinOpBinOp(MinOp<T>(),lhs,rhs));
440 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
441 inline Expr<BinaryOp<MinOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
442 operator-(
const SMatrix<T,D,D2,R1>& lhs,
const Expr<A,T,D,D2,R2>& rhs) {
443 typedef BinaryOp<MinOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T> MinOpBinOp;
445 return Expr<MinOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MinOpBinOp(MinOp<T>(),lhs,rhs));
452 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
453 inline Expr<BinaryOp<MinOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
454 operator-(
const Expr<A,T,D,D2,R1>& lhs,
const Expr<B,T,D,D2,R2>& rhs) {
455 typedef BinaryOp<MinOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T> MinOpBinOp;
457 return Expr<MinOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MinOpBinOp(MinOp<T>(),lhs,rhs));
470 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
471 inline Expr<BinaryOpCopyR<MinOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
472 operator-(
const SMatrix<T,D,D2,R>& lhs,
const A& rhs) {
473 typedef BinaryOpCopyR<MinOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T> MinOpBinOp;
475 return Expr<MinOpBinOp,T,D,D2,R>(MinOpBinOp(MinOp<T>(),
476 lhs,Constant<A>(rhs)));
488 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
489 inline Expr<BinaryOpCopyL<MinOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
490 operator-(
const A& lhs,
const SMatrix<T,D,D2,R>& rhs) {
491 typedef BinaryOpCopyL<MinOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T> MinOpBinOp;
493 return Expr<MinOpBinOp,T,D,D2,R>(MinOpBinOp(MinOp<T>(),Constant<A>(lhs),rhs));
499 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
500 inline Expr<BinaryOpCopyR<MinOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
501 operator-(
const Expr<B,T,D,D2,R>& lhs,
const A& rhs) {
502 typedef BinaryOpCopyR<MinOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T> MinOpBinOp;
504 return Expr<MinOpBinOp,T,D,D2,R>(MinOpBinOp(MinOp<T>(),lhs,Constant<A>(rhs)));
510 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
511 inline Expr<BinaryOpCopyL<MinOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T>, T, D, D2, R>
512 operator-(
const A& lhs,
const Expr<B,T,D,D2,R>& rhs) {
513 typedef BinaryOpCopyL<MinOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T> MinOpBinOp;
515 return Expr<MinOpBinOp,T,D,D2,R>(MinOpBinOp(MinOp<T>(),
516 Constant<A>(lhs),rhs));
531 static inline T apply(
const T& lhs,
const T& rhs) {
546 template <
class T,
unsigned int D>
547 inline VecExpr<BinaryOp<MulOp<T>, SVector<T,D>, SVector<T,D>, T>, T, D>
548 operator*(
const SVector<T,D>& lhs,
const SVector<T,D>& rhs) {
549 typedef BinaryOp<MulOp<T>, SVector<T,D>, SVector<T,D>, T> MulOpBinOp;
551 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),lhs,rhs));
564 template <
class A,
class T,
unsigned int D>
565 inline VecExpr<BinaryOp<MulOp<T>, Expr<A,T,D>, SVector<T,D>, T>, T, D>
566 operator*(
const VecExpr<A,T,D>& lhs,
const SVector<T,D>& rhs) {
567 typedef BinaryOp<MulOp<T>, VecExpr<A,T,D>, SVector<T,D>, T> MulOpBinOp;
568 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),lhs,rhs));
575 template <
class A,
class T,
unsigned int D>
576 inline VecExpr<BinaryOp<MulOp<T>, SVector<T,D>, VecExpr<A,T,D>, T>, T, D>
577 operator*(
const SVector<T,D>& lhs,
const VecExpr<A,T,D>& rhs) {
578 typedef BinaryOp<MulOp<T>, SVector<T,D>, VecExpr<A,T,D>, T> MulOpBinOp;
579 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),lhs,rhs));
586 template <
class A,
class B,
class T,
unsigned int D>
587 inline VecExpr<BinaryOp<MulOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T>, T, D>
588 operator*(
const VecExpr<A,T,D>& lhs,
const VecExpr<B,T,D>& rhs) {
589 typedef BinaryOp<MulOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T> MulOpBinOp;
590 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),lhs,rhs));
597 template <
class A,
class T,
unsigned int D>
598 inline VecExpr<BinaryOpCopyR<MulOp<T>, SVector<T,D>, Constant<A>, T>, T, D>
599 operator*(
const SVector<T,D>& lhs,
const A& rhs) {
600 typedef BinaryOpCopyR<MulOp<T>, SVector<T,D>, Constant<A>, T> MulOpBinOp;
602 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),lhs,Constant<A>(rhs)));
608 template <
class A,
class T,
unsigned int D>
609 inline VecExpr<BinaryOpCopyL<MulOp<T>, Constant<A>, SVector<T,D>, T>, T, D>
610 operator*(
const A& lhs,
const SVector<T,D>& rhs) {
611 typedef BinaryOpCopyL<MulOp<T>, Constant<A>, SVector<T,D>, T> MulOpBinOp;
613 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),Constant<A>(lhs),rhs));
620 template <
class A,
class B,
class T,
unsigned int D>
621 inline VecExpr<BinaryOpCopyR<MulOp<T>, VecExpr<B,T,D>, Constant<A>, T>, T, D>
622 operator*(
const VecExpr<B,T,D>& lhs,
const A& rhs) {
623 typedef BinaryOpCopyR<MulOp<T>, VecExpr<B,T,D>, Constant<A>, T> MulOpBinOp;
625 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),lhs,Constant<A>(rhs)));
631 template <
class A,
class B,
class T,
unsigned int D>
632 inline VecExpr<BinaryOpCopyL<MulOp<T>, Constant<A>, VecExpr<B,T,D>, T>, T, D>
633 operator*(
const A& lhs,
const VecExpr<B,T,D>& rhs) {
634 typedef BinaryOpCopyL<MulOp<T>, Constant<A>, VecExpr<B,T,D>, T> MulOpBinOp;
636 return VecExpr<MulOpBinOp,T,D>(MulOpBinOp(MulOp<T>(),Constant<A>(lhs),rhs));
650 template <
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
651 inline Expr<BinaryOp<MulOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
652 Times(
const SMatrix<T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
653 typedef BinaryOp<MulOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> MulOpBinOp;
655 return Expr<MulOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MulOpBinOp(MulOp<T>(),lhs,rhs));
662 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
663 inline Expr<BinaryOp<MulOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
664 Times(
const Expr<A,T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
665 typedef BinaryOp<MulOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> MulOpBinOp;
667 return Expr<MulOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MulOpBinOp(MulOp<T>(),lhs,rhs));
674 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
675 inline Expr<BinaryOp<MulOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
676 Times(
const SMatrix<T,D,D2,R1>& lhs,
const Expr<A,T,D,D2,R2>& rhs) {
677 typedef BinaryOp<MulOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T> MulOpBinOp;
679 return Expr<MulOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MulOpBinOp(MulOp<T>(),lhs,rhs));
686 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
687 inline Expr<BinaryOp<MulOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
688 Times(
const Expr<A,T,D,D2,R1>& lhs,
const Expr<B,T,D,D2,R2>& rhs) {
689 typedef BinaryOp<MulOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T> MulOpBinOp;
691 return Expr<MulOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(MulOpBinOp(MulOp<T>(),lhs,rhs));
704 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
705 inline Expr<BinaryOpCopyR<MulOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
706 operator*(
const SMatrix<T,D,D2,R>& lhs,
const A& rhs) {
707 typedef BinaryOpCopyR<MulOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T> MulOpBinOp;
709 return Expr<MulOpBinOp,T,D,D2,R>(MulOpBinOp(MulOp<T>(),
710 lhs,Constant<A>(rhs)));
722 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
723 inline Expr<BinaryOpCopyL<MulOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
724 operator*(
const A& lhs,
const SMatrix<T,D,D2,R>& rhs) {
725 typedef BinaryOpCopyL<MulOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T> MulOpBinOp;
727 return Expr<MulOpBinOp,T,D,D2,R>(MulOpBinOp(MulOp<T>(),
728 Constant<A>(lhs),rhs));
735 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
736 inline Expr<BinaryOpCopyR<MulOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
737 operator*(
const Expr<B,T,D,D2,R>& lhs,
const A& rhs) {
738 typedef BinaryOpCopyR<MulOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T> MulOpBinOp;
740 return Expr<MulOpBinOp,T,D,D2,R>(MulOpBinOp(MulOp<T>(),
741 lhs,Constant<A>(rhs)));
747 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
748 inline Expr<BinaryOpCopyL<MulOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T>, T, D, D2, R>
749 operator*(
const A& lhs,
const Expr<B,T,D,D2,R>& rhs) {
750 typedef BinaryOpCopyL<MulOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T> MulOpBinOp;
752 return Expr<MulOpBinOp,T,D,D2,R>(MulOpBinOp(MulOp<T>(),
753 Constant<A>(lhs),rhs));
768 static inline T apply(
const T& lhs,
const T& rhs) {
782 template <
class T,
unsigned int D>
783 inline VecExpr<BinaryOp<DivOp<T>, SVector<T,D>, SVector<T,D>, T>, T, D>
784 operator/(
const SVector<T,D>& lhs,
const SVector<T,D>& rhs) {
785 typedef BinaryOp<DivOp<T>, SVector<T,D>, SVector<T,D>, T> DivOpBinOp;
787 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),lhs,rhs));
794 template <
class A,
class T,
unsigned int D>
795 inline VecExpr<BinaryOp<DivOp<T>, VecExpr<A,T,D>, SVector<T,D>, T>, T, D>
796 operator/(
const VecExpr<A,T,D>& lhs,
const SVector<T,D>& rhs) {
797 typedef BinaryOp<DivOp<T>, VecExpr<A,T,D>, SVector<T,D>, T> DivOpBinOp;
798 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),lhs,rhs));
805 template <
class A,
class T,
unsigned int D>
806 inline VecExpr<BinaryOp<DivOp<T>, SVector<T,D>, VecExpr<A,T,D>, T>, T, D>
807 operator/(
const SVector<T,D>& lhs,
const VecExpr<A,T,D>& rhs) {
808 typedef BinaryOp<DivOp<T>, SVector<T,D>, VecExpr<A,T,D>, T> DivOpBinOp;
810 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),lhs,rhs));
817 template <
class A,
class B,
class T,
unsigned int D>
818 inline VecExpr<BinaryOp<DivOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T>, T, D>
819 operator/(
const VecExpr<A,T,D>& lhs,
const VecExpr<B,T,D>& rhs) {
820 typedef BinaryOp<DivOp<T>, VecExpr<A,T,D>, VecExpr<B,T,D>, T> DivOpBinOp;
822 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),lhs,rhs));
835 template <
class A,
class T,
unsigned int D>
836 inline VecExpr<BinaryOpCopyR<DivOp<T>, SVector<T,D>, Constant<A>, T>, T, D>
837 operator/(
const SVector<T,D>& lhs,
const A& rhs) {
838 typedef BinaryOpCopyR<DivOp<T>, SVector<T,D>, Constant<A>, T> DivOpBinOp;
840 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),lhs,Constant<A>(rhs)));
852 template <
class A,
class T,
unsigned int D>
853 inline VecExpr<BinaryOpCopyL<DivOp<T>, Constant<A>, SVector<T,D>, T>, T, D>
854 operator/(
const A& lhs,
const SVector<T,D>& rhs) {
855 typedef BinaryOpCopyL<DivOp<T>, Constant<A>, SVector<T,D>, T> DivOpBinOp;
857 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),Constant<A>(lhs),rhs));
864 template <
class A,
class B,
class T,
unsigned int D>
865 inline VecExpr<BinaryOpCopyR<DivOp<T>, VecExpr<B,T,D>, Constant<A>, T>, T, D>
866 operator/(
const VecExpr<B,T,D>& lhs,
const A& rhs) {
867 typedef BinaryOpCopyR<DivOp<T>, VecExpr<B,T,D>, Constant<A>, T> DivOpBinOp;
869 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),lhs,Constant<A>(rhs)));
875 template <
class A,
class B,
class T,
unsigned int D>
876 inline VecExpr<BinaryOpCopyL<DivOp<T>, Constant<A>, VecExpr<B,T,D>, T>, T, D>
877 operator/(
const A& lhs,
const VecExpr<B,T,D>& rhs) {
878 typedef BinaryOpCopyL<DivOp<T>, Constant<A>, VecExpr<B,T,D>, T> DivOpBinOp;
880 return VecExpr<DivOpBinOp,T,D>(DivOpBinOp(DivOp<T>(),Constant<A>(lhs),rhs));
893 template <
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
894 inline Expr<BinaryOp<DivOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
895 Div(
const SMatrix<T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
896 typedef BinaryOp<DivOp<T>, SMatrix<T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> DivOpBinOp;
898 return Expr<DivOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(DivOpBinOp(DivOp<T>(),lhs,rhs));
905 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
906 inline Expr<BinaryOp<DivOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
907 Div(
const Expr<A,T,D,D2,R1>& lhs,
const SMatrix<T,D,D2,R2>& rhs) {
908 typedef BinaryOp<DivOp<T>, Expr<A,T,D,D2,R1>, SMatrix<T,D,D2,R2>, T> DivOpBinOp;
910 return Expr<DivOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(DivOpBinOp(DivOp<T>(),lhs,rhs));
917 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
918 inline Expr<BinaryOp<DivOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
919 Div(
const SMatrix<T,D,D2,R1>& lhs,
const Expr<A,T,D,D2,R2>& rhs) {
920 typedef BinaryOp<DivOp<T>, SMatrix<T,D,D2,R1>, Expr<A,T,D,D2,R2>, T> DivOpBinOp;
922 return Expr<DivOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(DivOpBinOp(DivOp<T>(),lhs,rhs));
929 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R1,
class R2>
930 inline Expr<BinaryOp<DivOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T>, T, D, D2,
typename AddPolicy<T,D,D2,R1,R2>::RepType>
931 Div(
const Expr<A,T,D,D2,R1>& lhs,
const Expr<B,T,D,D2,R2>& rhs) {
932 typedef BinaryOp<DivOp<T>, Expr<A,T,D,D2,R1>, Expr<B,T,D,D2,R2>, T> DivOpBinOp;
934 return Expr<DivOpBinOp,T,D,D2,typename AddPolicy<T,D,D2,R1,R2>::RepType>(DivOpBinOp(DivOp<T>(),lhs,rhs));
947 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
948 inline Expr<BinaryOpCopyR<DivOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
949 operator/(
const SMatrix<T,D,D2,R>& lhs,
const A& rhs) {
950 typedef BinaryOpCopyR<DivOp<T>, SMatrix<T,D,D2,R>, Constant<A>, T> DivOpBinOp;
952 return Expr<DivOpBinOp,T,D,D2,R>(DivOpBinOp(DivOp<T>(),
953 lhs,Constant<A>(rhs)));
965 template <
class A,
class T,
unsigned int D,
unsigned int D2,
class R>
966 inline Expr<BinaryOpCopyL<DivOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T>, T, D, D2, R>
967 operator/(
const A& lhs,
const SMatrix<T,D,D2,R>& rhs) {
968 typedef BinaryOpCopyL<DivOp<T>, Constant<A>, SMatrix<T,D,D2,R>, T> DivOpBinOp;
970 return Expr<DivOpBinOp,T,D,D2,R>(DivOpBinOp(DivOp<T>(),
971 Constant<A>(lhs),rhs));
978 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
979 inline Expr<BinaryOpCopyR<DivOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T>, T, D, D2, R>
980 operator/(
const Expr<B,T,D,D2,R>& lhs,
const A& rhs) {
981 typedef BinaryOpCopyR<DivOp<T>, Expr<B,T,D,D2,R>, Constant<A>, T> DivOpBinOp;
983 return Expr<DivOpBinOp,T,D,D2,R>(DivOpBinOp(DivOp<T>(),
984 lhs,Constant<A>(rhs)));
990 template <
class A,
class B,
class T,
unsigned int D,
unsigned int D2,
class R>
991 inline Expr<BinaryOpCopyL<DivOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T>, T, D, D2,R>
992 operator/(
const A& lhs,
const Expr<B,T,D,D2,R>& rhs) {
993 typedef BinaryOpCopyL<DivOp<T>, Constant<A>, Expr<B,T,D,D2,R>, T> DivOpBinOp;
995 return Expr<DivOpBinOp,T,D,D2,R>(DivOpBinOp(DivOp<T>(),Constant<A>(lhs),rhs));