00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef TVMET_XPR_BINOPERATOR_H
00025 #define TVMET_XPR_BINOPERATOR_H
00026
00027 #include <tvmet/TypePromotion.h>
00028
00029 namespace tvmet {
00030
00031
00039 template<class BinOp, class E1, class E2>
00040 class XprBinOp
00041 : public TvmetBase< XprBinOp<BinOp, E1, E2> >
00042 {
00043 XprBinOp();
00044 XprBinOp& operator=(const XprBinOp&);
00045
00046 public:
00047 typedef typename BinOp::value_type value_type;
00048
00049 public:
00051 enum {
00052 ops_lhs = E1::ops,
00053 ops_rhs = E2::ops,
00054 ops = 2 * (ops_lhs + ops_rhs)
00055 };
00056
00057 public:
00059 explicit XprBinOp(const E1& lhs, const E2& rhs)
00060 : m_lhs(lhs), m_rhs(rhs)
00061 { }
00062
00064 #if defined(TVMET_OPTIMIZE_XPR_MANUAL_CCTOR)
00065 XprBinOp(const XprBinOp& e)
00066 : m_lhs(e.m_lhs), m_rhs(e.m_rhs)
00067 { }
00068 #endif
00069
00071 value_type operator()(std::size_t i) const {
00072 return BinOp::apply_on(m_lhs(i), m_rhs(i));
00073 }
00074
00076 value_type operator()(std::size_t i, std::size_t j) const {
00077 return BinOp::apply_on(m_lhs(i, j), m_rhs(i, j));
00078 }
00079
00080 public:
00081 void print_xpr(std::ostream& os, std::size_t l=0) const {
00082 os << IndentLevel(l++)
00083 << "XprBinOp[O="<< ops << ", (O1=" << ops_lhs << ", O2=" << ops_rhs << ")]<"
00084 << std::endl;
00085 BinOp::print_xpr(os, l);
00086 m_lhs.print_xpr(os, l);
00087 m_rhs.print_xpr(os, l);
00088 os << IndentLevel(--l)
00089 << ">," << std::endl;
00090 }
00091
00092 private:
00093 const E1 m_lhs;
00094 const E2 m_rhs;
00095 };
00096
00097
00098 }
00099
00100 #endif // TVMET_XPR_BINOPERATOR_H
00101
00102
00103
00104
00105