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_MATRIX_DIAG_H
00025 #define TVMET_XPR_MATRIX_DIAG_H
00026
00027 namespace tvmet {
00028
00029
00034 template<class E, std::size_t Sz>
00035 class XprMatrixDiag
00036 : public TvmetBase< XprMatrixDiag<E, Sz> >
00037 {
00038 XprMatrixDiag();
00039 XprMatrixDiag& operator=(const XprMatrixDiag<E, Sz>&);
00040
00041 public:
00042 typedef typename E::value_type value_type;
00043
00044 public:
00046 enum {
00047 ops_expr = E::ops,
00048 ops = ops_expr/Sz
00049 };
00050
00051 public:
00053 explicit XprMatrixDiag(const E& e)
00054 : m_expr(e)
00055 { }
00056
00058 #if defined(TVMET_OPTIMIZE_XPR_MANUAL_CCTOR)
00059 XprMatrixDiag(const XprMatrixDiag& e)
00060 : m_expr(e.m_expr)
00061 { }
00062 #endif
00063
00065 value_type operator()(std::size_t i) const {
00066 TVMET_RT_CONDITION(i < Sz, "XprMatrixDiag Bounce Violation")
00067 return m_expr(i, i);
00068 }
00069
00070 public:
00071 void print_xpr(std::ostream& os, std::size_t l=0) const {
00072 os << IndentLevel(l++)
00073 << "XprMatrixDiag[O=" << ops << ", (O=" << ops_expr << ")]<"
00074 << std::endl;
00075 m_expr.print_xpr(os, l);
00076 os << IndentLevel(l)
00077 << "Sz=" << Sz << std::endl
00078 << IndentLevel(--l) << ">"
00079 << ((l != 0) ? "," : "") << std::endl;
00080 }
00081
00082 private:
00083 const E m_expr;
00084 };
00085
00086
00087 }
00088
00089 #endif // TVMET_XPR_MATRIX_DIAG_H
00090
00091
00092
00093
00094