📄 expr.h
字号:
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);
}
_bz_bool isUnitStride(int rank) const
{ return iter1_.isUnitStride(rank) && iter2_.isUnitStride(rank); }
void advanceUnitStride()
{
iter1_.advanceUnitStride();
iter2_.advanceUnitStride();
}
_bz_bool canCollapse(int outerLoopRank, int innerLoopRank) const
{
// BZ_DEBUG_MESSAGE("_bz_ArrayExprOp<>::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;
}
_bz_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(string& str, prettyPrintFormat& format) const
{
T_op::prettyPrint(str, format, iter1_, iter2_);
}
template<class T_shape>
_bz_bool shapeCheck(const T_shape& shape)
{ return iter1_.shapeCheck(shape) && iter2_.shapeCheck(shape); }
protected:
_bz_ArrayExprOp() { }
T_expr1 iter1_;
T_expr2 iter2_;
};
template<class P_expr, class P_op>
class _bz_ArrayExprUnaryOp {
public:
typedef P_expr T_expr;
typedef _bz_typename P_expr::T_numtype T_numtype1;
typedef _bz_typename P_op::T_numtype T_numtype;
typedef P_op T_op;
typedef T_expr T_ctorArg1;
typedef int T_ctorArg2; // dummy
enum { numArrayOperands = BZ_ENUM_CAST(T_expr::numArrayOperands),
numIndexPlaceholders = BZ_ENUM_CAST(T_expr::numIndexPlaceholders),
rank = BZ_ENUM_CAST(T_expr::rank) };
_bz_ArrayExprUnaryOp(const _bz_ArrayExprUnaryOp<T_expr, P_op>& a)
: iter_(a.iter_)
{ }
_bz_ArrayExprUnaryOp(BZ_ETPARM(T_expr) a)
: iter_(a)
{ }
_bz_ArrayExprUnaryOp(_bz_typename T_expr::T_ctorArg1 a)
: iter_(a)
{ }
#if BZ_TEMPLATE_CTOR_DOESNT_CAUSE_HAVOC
template<class T1>
_bz_explicit _bz_ArrayExprUnaryOp(BZ_ETPARM(T1) a)
: iter_(a)
{ }
#endif
int lbound(int rank)
{ return iter_.lbound(rank); }
int ubound(int rank)
{ return iter_.ubound(rank); }
T_numtype operator*()
{ return T_op::apply(*iter_); }
#ifdef BZ_ARRAY_EXPR_PASS_INDEX_BY_VALUE
template<int N_rank>
T_numtype operator()(TinyVector<int, N_rank> i)
{ return T_op::apply(iter_(i)); }
#else
template<int N_rank>
T_numtype operator()(const TinyVector<int, N_rank>& i)
{ return T_op::apply(iter_(i)); }
#endif
void push(int position)
{
iter_.push(position);
}
void pop(int position)
{
iter_.pop(position);
}
void advance()
{
iter_.advance();
}
void advance(int n)
{
iter_.advance(n);
}
void loadStride(int rank)
{
iter_.loadStride(rank);
}
_bz_bool isUnitStride(int rank) const
{ return iter_.isUnitStride(rank); }
void advanceUnitStride()
{
iter_.advanceUnitStride();
}
template<int N_rank>
void moveTo(const TinyVector<int,N_rank>& i)
{
iter_.moveTo(i);
}
_bz_bool canCollapse(int outerLoopRank, int innerLoopRank) const
{
// BZ_DEBUG_MESSAGE("_bz_ArrayExprUnaryOp<>::canCollapse");
return iter_.canCollapse(outerLoopRank, innerLoopRank);
}
T_numtype operator[](int i)
{ return T_op::apply(iter_[i]); }
T_numtype fastRead(int i)
{ return T_op::apply(iter_.fastRead(i)); }
int suggestStride(int rank) const
{ return iter_.suggestStride(rank); }
_bz_bool isStride(int rank, int stride) const
{ return iter_.isStride(rank,stride); }
void prettyPrint(string& str, prettyPrintFormat& format) const
{ T_op::prettyPrint(str, format, iter_); }
template<class T_shape>
_bz_bool shapeCheck(const T_shape& shape)
{ return iter_.shapeCheck(shape); }
protected:
_bz_ArrayExprUnaryOp() { }
T_expr iter_;
};
template<class P_numtype>
class _bz_ArrayExprConstant {
public:
typedef P_numtype T_numtype;
typedef T_numtype T_ctorArg1;
typedef int T_ctorArg2; // dummy
enum { 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 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) { }
_bz_bool isUnitStride(int rank) const
{ return _bz_true; }
void advanceUnitStride()
{ }
_bz_bool canCollapse(int,int) const
{ return _bz_true; }
T_numtype operator[](int)
{ return value_; }
T_numtype fastRead(int)
{ return value_; }
int suggestStride(int) const
{ return 1; }
_bz_bool isStride(int,int) const
{ return _bz_true; }
template<int N_rank>
void moveTo(const TinyVector<int,N_rank>& i)
{
}
void prettyPrint(string& str, prettyPrintFormat& format) const
{
if (format.tersePrintingSelected())
str += format.nextScalarOperandSymbol();
else
str += BZ_DEBUG_TEMPLATE_AS_STRING_LITERAL(T_numtype);
}
template<class T_shape>
_bz_bool shapeCheck(const T_shape&)
{ return _bz_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 + -