4 #ifndef ROOT_Math_Expression
5 #define ROOT_Math_Expression
63 template <
class ExprType,
class T,
unsigned int D >
70 VecExpr(
const ExprType& rhs) :
77 inline T apply(
unsigned int i)
const {
81 inline T operator() (
unsigned int i)
const {
88 static const unsigned int rows = D;
104 inline bool IsInUse (
const T * p)
const {
105 return rhs_.IsInUse(p);
110 std::ostream& print(std::ostream& os)
const {
111 os.setf(std::ios::right,std::ios::adjustfield);
115 os << apply(i) <<
", ";
134 template <
class T,
unsigned int D,
unsigned int D2>
class MatRepStd;
136 template <
class ExprType,
class T,
unsigned int D,
unsigned int D2 = 1,
137 class R1=MatRepStd<T,D,D2> >
140 typedef T value_type;
143 Expr(
const ExprType& rhs) :
150 inline T apply(
unsigned int i)
const {
151 return rhs_.apply(i);
153 inline T operator() (
unsigned int i,
unsigned j)
const {
161 inline bool IsInUse (
const T * p)
const {
162 return rhs_.IsInUse(p);
169 static const unsigned int rows = D;
171 static const unsigned int cols = D2;
184 std::ostream& print(std::ostream& os)
const {
185 os.setf(std::ios::right,std::ios::adjustfield);
187 for (
unsigned int i=0; i < D; ++i) {
188 unsigned int d2 = D2;
189 for (
unsigned int j=0; j < D2; ++j) {
190 os << std::setw(12) << this->operator() (i,j);
191 if ((!((j+1)%12)) && (j < d2-1))
192 os << std::endl <<
" ...";
195 os << std::endl <<
" ";
209 template <
class A,
class T,
unsigned int D>
210 inline std::ostream& operator<<(std::ostream& os, const VecExpr<A,T,D>& rhs) {
211 return rhs.print(os);
214 template <
class A,
class T,
unsigned int D1,
unsigned int D2,
class R1>
215 inline std::ostream& operator<<(std::ostream& os, const Expr<A,T,D1,D2,R1>& rhs) {
216 return rhs.print(os);
233 template <
class Operator,
class LHS,
class RHS,
class T>
237 BinaryOp( Operator ,
const LHS& lhs,
const RHS& rhs) :
238 lhs_(lhs), rhs_(rhs) {}
244 inline T apply(
unsigned int i)
const {
245 return Operator::apply(lhs_.apply(i), rhs_.apply(i));
247 inline T operator() (
unsigned int i,
unsigned int j)
const {
248 return Operator::apply(lhs_(i,j), rhs_(i,j) );
251 inline bool IsInUse (
const T * p)
const {
252 return lhs_.IsInUse(p) || rhs_.IsInUse(p);
276 template <
class Operator,
class LHS,
class RHS,
class T>
277 class BinaryOpCopyL {
280 BinaryOpCopyL( Operator ,
const LHS& lhs,
const RHS& rhs) :
281 lhs_(lhs), rhs_(rhs) {}
287 inline T apply(
unsigned int i)
const {
288 return Operator::apply(lhs_.apply(i), rhs_.apply(i));
290 inline T operator() (
unsigned int i,
unsigned int j)
const {
291 return Operator::apply(lhs_(i,j), rhs_(i,j) );
294 inline bool IsInUse (
const T * p)
const {
296 return rhs_.IsInUse(p);
317 template <
class Operator,
class LHS,
class RHS,
class T>
318 class BinaryOpCopyR {
321 BinaryOpCopyR( Operator ,
const LHS& lhs,
const RHS& rhs) :
322 lhs_(lhs), rhs_(rhs) {}
328 inline T apply(
unsigned int i)
const {
329 return Operator::apply(lhs_.apply(i), rhs_.apply(i));
331 inline T operator() (
unsigned int i,
unsigned int j)
const {
332 return Operator::apply(lhs_(i,j), rhs_(i,j) );
335 inline bool IsInUse (
const T * p)
const {
337 return lhs_.IsInUse(p);
360 template <
class Operator,
class RHS,
class T>
364 UnaryOp( Operator ,
const RHS& rhs) :
371 inline T apply(
unsigned int i)
const {
372 return Operator::apply(rhs_.apply(i));
374 inline T operator() (
unsigned int i,
unsigned int j)
const {
375 return Operator::apply(rhs_(i,j));
378 inline bool IsInUse (
const T * p)
const {
379 return rhs_.IsInUse(p);
403 Constant(
const T& rhs ) :
410 inline T apply(
unsigned int )
const {
return rhs_; }
412 inline T operator() (
unsigned int ,
unsigned int )
const {
return rhs_; }