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_UNOPERATOR_H
00025 #define TVMET_XPR_UNOPERATOR_H
00026
00027 namespace tvmet {
00028
00029
00036 template<class UnOp, class E>
00037 class XprUnOp
00038 : public TvmetBase< XprUnOp<UnOp, E> >
00039 {
00040 XprUnOp();
00041 XprUnOp& operator=(const XprUnOp&);
00042
00043 public:
00044 typedef typename UnOp::value_type value_type;
00045
00046 public:
00048 enum {
00049 ops_expr = E::ops,
00050 ops = 1 * ops_expr
00051 };
00052
00053 public:
00055 explicit XprUnOp(const E& e)
00056 : m_expr(e)
00057 { }
00058
00060 #if defined(TVMET_OPTIMIZE_XPR_MANUAL_CCTOR)
00061 XprUnOp(const XprUnOp& e)
00062 : m_expr(e.m_expr)
00063 { }
00064 #endif
00065
00067 value_type operator()(std::size_t i) const {
00068 return UnOp::apply_on(m_expr(i));
00069 }
00070
00072 value_type operator()(std::size_t i, std::size_t j) const {
00073 return UnOp::apply_on(m_expr(i, j));
00074 }
00075
00076 public:
00077 void print_xpr(std::ostream& os, std::size_t l=0) const {
00078 os << IndentLevel(l++)
00079 << "XprUnOp[O="<< ops << ", (O=" << ops_expr << ")]<"
00080 << std::endl;
00081 UnOp::print_xpr(os, l);
00082 m_expr.print_xpr(os, l);
00083 os << IndentLevel(--l)
00084 << ">," << std::endl;
00085 }
00086
00087 private:
00088 const E m_expr;
00089 };
00090
00091
00092 }
00093
00094 #endif // TVMET_XPR_UNOPERATOR_H
00095
00096
00097
00098
00099