📄 expr.h
字号:
typedef P_expr2 T_expr2; typedef P_op T_op; typedef _bz_typename T_expr1::T_numtype T_numtype1; typedef _bz_typename T_expr2::T_numtype T_numtype2; typedef _bz_typename T_op::T_numtype T_numtype; typedef T_expr1 T_ctorArg1; typedef T_expr2 T_ctorArg2; static const int numArrayOperands = T_expr1::numArrayOperands + T_expr2::numArrayOperands, numIndexPlaceholders = T_expr1::numIndexPlaceholders + T_expr2::numIndexPlaceholders, rank = (T_expr1::rank > T_expr2::rank) ? T_expr1::rank : T_expr2::rank; _bz_ArrayExprBinaryOp( const _bz_ArrayExprBinaryOp<T_expr1, T_expr2, T_op>& a) : iter1_(a.iter1_), iter2_(a.iter2_) { } template<typename T1, typename T2> _bz_ArrayExprBinaryOp(BZ_ETPARM(T1) a, BZ_ETPARM(T2) b) : iter1_(a), iter2_(b) { } T_numtype operator*() { return T_op::apply(*iter1_, *iter2_); }#ifdef BZ_ARRAY_EXPR_PASS_INDEX_BY_VALUE template<int N_rank> T_numtype operator()(TinyVector<int, N_rank> i) { return T_op::apply(iter1_(i), iter2_(i)); }#else template<int N_rank> T_numtype operator()(const TinyVector<int, N_rank>& i) { return T_op::apply(iter1_(i), iter2_(i)); }#endif int ascending(int rank) { return bounds::compute_ascending(rank, iter1_.ascending(rank), iter2_.ascending(rank)); } int ordering(int rank) { return bounds::compute_ordering(rank, iter1_.ordering(rank), iter2_.ordering(rank)); } int lbound(int rank) { return bounds::compute_lbound(rank, iter1_.lbound(rank), iter2_.lbound(rank)); } int ubound(int rank) { return bounds::compute_ubound(rank, iter1_.ubound(rank), iter2_.ubound(rank)); } void push(int position) { iter1_.push(position); iter2_.push(position); } void pop(int position) { iter1_.pop(position); iter2_.pop(position); } void advance() { iter1_.advance(); iter2_.advance(); } void advance(int n) { iter1_.advance(n); iter2_.advance(n); } void loadStride(int rank) { iter1_.loadStride(rank); iter2_.loadStride(rank); } bool isUnitStride(int rank) const { return iter1_.isUnitStride(rank) && iter2_.isUnitStride(rank); } void advanceUnitStride() { iter1_.advanceUnitStride(); iter2_.advanceUnitStride(); } bool canCollapse(int outerLoopRank, int innerLoopRank) const { // BZ_DEBUG_MESSAGE("_bz_ArrayExprBinaryOp<>::canCollapse"); return iter1_.canCollapse(outerLoopRank, innerLoopRank) && iter2_.canCollapse(outerLoopRank, innerLoopRank); } T_numtype operator[](int i) { return T_op::apply(iter1_[i], iter2_[i]); } T_numtype fastRead(int i) { return T_op::apply(iter1_.fastRead(i), iter2_.fastRead(i)); } int suggestStride(int rank) const { int stride1 = iter1_.suggestStride(rank); int stride2 = iter2_.suggestStride(rank); return (stride1 > stride2) ? stride1 : stride2; } bool isStride(int rank, int stride) const { return iter1_.isStride(rank,stride) && iter2_.isStride(rank,stride); } template<int N_rank> void moveTo(const TinyVector<int,N_rank>& i) { iter1_.moveTo(i); iter2_.moveTo(i); } void prettyPrint(BZ_STD_SCOPE(string) &str, prettyPrintFormat& format) const { T_op::prettyPrint(str, format, iter1_, iter2_); } template<typename T_shape> bool shapeCheck(const T_shape& shape) { return iter1_.shapeCheck(shape) && iter2_.shapeCheck(shape); }protected: _bz_ArrayExprBinaryOp() { } T_expr1 iter1_; T_expr2 iter2_; };template<typename P_expr1, typename P_expr2, typename P_expr3, typename P_op>class _bz_ArrayExprTernaryOp {public: typedef P_expr1 T_expr1; typedef P_expr2 T_expr2; typedef P_expr3 T_expr3; typedef P_op T_op; typedef _bz_typename T_expr1::T_numtype T_numtype1; typedef _bz_typename T_expr2::T_numtype T_numtype2; typedef _bz_typename T_expr3::T_numtype T_numtype3; typedef _bz_typename T_op::T_numtype T_numtype; typedef T_expr1 T_ctorArg1; typedef T_expr2 T_ctorArg2; typedef T_expr3 T_ctorArg3; static const int numArrayOperands = T_expr1::numArrayOperands + T_expr2::numArrayOperands + T_expr3::numArrayOperands, numIndexPlaceholders = T_expr1::numIndexPlaceholders + T_expr2::numIndexPlaceholders + T_expr3::numIndexPlaceholders, rank = (T_expr1::rank > T_expr2::rank) ? ((T_expr1::rank > T_expr3::rank) ? T_expr1::rank : T_expr3::rank) : ((T_expr2::rank > T_expr3::rank) ? T_expr2::rank : T_expr3::rank); _bz_ArrayExprTernaryOp( const _bz_ArrayExprTernaryOp<T_expr1, T_expr2, T_expr3, T_op>& a) : iter1_(a.iter1_), iter2_(a.iter2_), iter3_(a.iter3_) { } template<typename T1, typename T2, typename T3> _bz_ArrayExprTernaryOp(BZ_ETPARM(T1) a, BZ_ETPARM(T2) b, BZ_ETPARM(T3) c) : iter1_(a), iter2_(b), iter3_(c) { } T_numtype operator*() { return T_op::apply(*iter1_, *iter2_, *iter3_); }#ifdef BZ_ARRAY_EXPR_PASS_INDEX_BY_VALUE template<int N_rank> T_numtype operator()(TinyVector<int, N_rank> i) { return T_op::apply(iter1_(i), iter2_(i), iter3_(i)); }#else template<int N_rank> T_numtype operator()(const TinyVector<int, N_rank>& i) { return T_op::apply(iter1_(i), iter2_(i), iter3_(i)); }#endif int ascending(int rank) { return bounds::compute_ascending(rank, bounds::compute_ascending( rank, iter1_.ascending(rank), iter2_.ascending(rank)), iter3_.ascending(rank)); } int ordering(int rank) { return bounds::compute_ordering(rank, bounds::compute_ordering( rank, iter1_.ordering(rank), iter2_.ordering(rank)), iter3_.ordering(rank)); } int lbound(int rank) { return bounds::compute_lbound(rank, bounds::compute_lbound( rank, iter1_.lbound(rank), iter2_.lbound(rank)), iter3_.lbound(rank)); } int ubound(int rank) { return bounds::compute_ubound(rank, bounds::compute_ubound( rank, iter1_.ubound(rank), iter2_.ubound(rank)), iter3_.ubound(rank)); } void push(int position) { iter1_.push(position); iter2_.push(position); iter3_.push(position); } void pop(int position) { iter1_.pop(position); iter2_.pop(position); iter3_.pop(position); } void advance() { iter1_.advance(); iter2_.advance(); iter3_.advance(); } void advance(int n) { iter1_.advance(n); iter2_.advance(n); iter3_.advance(n); } void loadStride(int rank) { iter1_.loadStride(rank); iter2_.loadStride(rank); iter3_.loadStride(rank); } bool isUnitStride(int rank) const { return iter1_.isUnitStride(rank) && iter2_.isUnitStride(rank) && iter3_.isUnitStride(rank); } void advanceUnitStride() { iter1_.advanceUnitStride(); iter2_.advanceUnitStride(); iter3_.advanceUnitStride(); } bool canCollapse(int outerLoopRank, int innerLoopRank) const { // BZ_DEBUG_MESSAGE("_bz_ArrayExprTernaryOp<>::canCollapse"); return iter1_.canCollapse(outerLoopRank, innerLoopRank) && iter2_.canCollapse(outerLoopRank, innerLoopRank) && iter3_.canCollapse(outerLoopRank, innerLoopRank); } T_numtype operator[](int i) { return T_op::apply(iter1_[i], iter2_[i], iter3_[i]); } T_numtype fastRead(int i) { return T_op::apply(iter1_.fastRead(i), iter2_.fastRead(i), iter3_.fastRead(i)); } int suggestStride(int rank) const { int stride1 = iter1_.suggestStride(rank); int stride2 = iter2_.suggestStride(rank); int stride3 = iter3_.suggestStride(rank); return stride1 > ( stride2 = (stride2>stride3 ? stride2 : stride3) ) ? stride1 : stride2; } bool isStride(int rank, int stride) const { return iter1_.isStride(rank,stride) && iter2_.isStride(rank,stride) && iter3_.isStride(rank,stride); } template<int N_rank> void moveTo(const TinyVector<int,N_rank>& i) { iter1_.moveTo(i); iter2_.moveTo(i); iter3_.moveTo(i); } void prettyPrint(BZ_STD_SCOPE(string) &str, prettyPrintFormat& format) const { T_op::prettyPrint(str, format, iter1_, iter2_, iter3_); } template<typename T_shape> bool shapeCheck(const T_shape& shape) { return iter1_.shapeCheck(shape) && iter2_.shapeCheck(shape) && iter3_.shapeCheck(shape); }protected: _bz_ArrayExprTernaryOp() { } T_expr1 iter1_; T_expr2 iter2_; T_expr3 iter3_; };template<typename P_numtype>class _bz_ArrayExprConstant {public: typedef P_numtype T_numtype; typedef T_numtype T_ctorArg1; typedef int T_ctorArg2; // dummy static const int numArrayOperands = 0, numIndexPlaceholders = 0, rank = 0; _bz_ArrayExprConstant(const _bz_ArrayExprConstant<T_numtype>& a) : value_(a.value_) { } _bz_ArrayExprConstant(T_numtype value) : value_(BZ_NO_PROPAGATE(value)) { } // tiny() and huge() return the smallest and largest representable // integer values. See <blitz/numinquire.h> // NEEDS_WORK: use tiny(int()) once numeric_limits<T> available on // all platforms int ascending(int) { return INT_MIN; } int ordering(int) { return INT_MIN; } int lbound(int) { return INT_MIN; } int ubound(int) { return INT_MAX; } // NEEDS_WORK: use huge(int()) once numeric_limits<T> available on // all platforms T_numtype operator*() { return value_; }#ifdef BZ_ARRAY_EXPR_PASS_INDEX_BY_VALUE template<int N_rank> T_numtype operator()(TinyVector<int,N_rank>) { return value_; }#else template<int N_rank> T_numtype operator()(const TinyVector<int,N_rank>&) { return value_; }#endif void push(int) { } void pop(int) { } void advance() { } void advance(int) { } void loadStride(int) { } bool isUnitStride(int) const { return true; } void advanceUnitStride() { } bool canCollapse(int,int) const { return true; } T_numtype operator[](int) { return value_; } T_numtype fastRead(int) { return value_; } int suggestStride(int) const { return 1; } bool isStride(int,int) const { return true; } template<int N_rank> void moveTo(const TinyVector<int,N_rank>&) { } void prettyPrint(BZ_STD_SCOPE(string) &str, prettyPrintFormat& format) const { if (format.tersePrintingSelected()) str += format.nextScalarOperandSymbol(); else str += BZ_DEBUG_TEMPLATE_AS_STRING_LITERAL(T_numtype); } template<typename T_shape> bool shapeCheck(const T_shape&) { return true; }protected: _bz_ArrayExprConstant() { } T_numtype value_;};BZ_NAMESPACE_END#include <blitz/array/asexpr.h>#endif // BZ_ARRAYEXPR_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -