/* * $Id: vecpick.cc,v 1.1.1.1 1999-04-09 17:58:59 ansari Exp $ * * Copyright (C) 1997 Todd Veldhuizen * All rights reserved. Please see for terms and * conditions of use. * * $Log: not supported by cvs2svn $ * Revision 1.5 1998/03/14 00:04:47 tveldhui * 0.2-alpha-05 * * Revision 1.4 1997/07/16 14:51:20 tveldhui * Update: Alpha release 0.2 (Arrays) * * Revision 1.3 1997/01/24 14:42:00 tveldhui * Periodic RCS update * */ #ifndef BZ_VECPICK_CC #define BZ_VECPICK_CC #ifndef BZ_VECPICK_H #include #endif #ifndef BZ_UPDATE_H #include #endif #ifndef BZ_RANDOM_H #include #endif #ifndef BZ_VECEXPR_H #include #endif #ifndef BZ_RANDOM_H #include #endif BZ_NAMESPACE(blitz) /***************************************************************************** * Assignment operators with vector expression operand */ template template inline void VectorPick::_bz_assign(P_expr expr, P_updater) { BZPRECONDITION(expr.length(length()) == length()); // If all vectors in the expression, plus the vector to which the // result is being assigned have unit stride, then avoid stride // calculations. if (_bz_hasFastAccess() && expr._bz_hasFastAccess()) { #ifndef BZ_PARTIAL_LOOP_UNROLL for (int i=0; i < length(); ++i) P_updater::update(vector_(index_(i)), expr._bz_fastAccess(i)); #else // Unwind the inner loop, five elements at a time. int leftover = length() % 5; int i=0; for (; i < leftover; ++i) P_updater::update(vector_(index_(i)), expr._bz_fastAccess(i)); for (; i < length(); i += 5) { P_updater::update(vector_(index_(i)), expr._bz_fastAccess(i)); P_updater::update(vector_(index_(i+1)), expr._bz_fastAccess(i+1)); P_updater::update(vector_(index_(i+2)), expr._bz_fastAccess(i+2)); P_updater::update(vector_(index_(i+3)), expr._bz_fastAccess(i+3)); P_updater::update(vector_(index_(i+4)), expr._bz_fastAccess(i+4)); } #endif } else { // Not all unit strides -- have to access all the vector elements // as data_[i*stride_], which is slower. for (int i=0; i < length(); ++i) P_updater::update(vector_[index_[i]], expr[i]); } } template template inline VectorPick& VectorPick::operator=(_bz_VecExpr expr) { BZPRECONDITION(expr.length(length()) == length()); // If all vectors in the expression, plus the vector to which the // result is being assigned have unit stride, then avoid stride // calculations. if (_bz_hasFastAccess() && expr._bz_hasFastAccess()) { #ifndef BZ_PARTIAL_LOOP_UNROLL for (int i=0; i < length(); ++i) (*this)(i) = expr._bz_fastAccess(i); #else // Unwind the inner loop, five elements at a time. int leftover = length() % 5; int i=0; for (; i < leftover; ++i) (*this)(i) = expr._bz_fastAccess(i); for (; i < length(); i += 5) { (*this)(i) = expr._bz_fastAccess(i); (*this)(i+1) = expr._bz_fastAccess(i+1); (*this)(i+2) = expr._bz_fastAccess(i+2); (*this)(i+3) = expr._bz_fastAccess(i+3); (*this)(i+4) = expr._bz_fastAccess(i+4); } #endif } else { // Not all unit strides -- have to access all the vector elements // as data_[i*stride_], which is slower. for (int i=0; i < length(); ++i) (*this)[i] = expr[i]; } return *this; } template template inline VectorPick& VectorPick::operator+=(_bz_VecExpr expr) { _bz_assign(expr, _bz_plus_update()); return *this; } template template inline VectorPick& VectorPick::operator-=(_bz_VecExpr expr) { _bz_assign(expr, _bz_minus_update()); return *this; } template template inline VectorPick& VectorPick::operator*=(_bz_VecExpr expr) { _bz_assign(expr, _bz_multiply_update()); return *this; } template template inline VectorPick& VectorPick::operator/=(_bz_VecExpr expr) { _bz_assign(expr, _bz_divide_update()); return *this; } template template inline VectorPick& VectorPick::operator%=(_bz_VecExpr expr) { _bz_assign(expr, _bz_mod_update()); return *this; } template template inline VectorPick& VectorPick::operator^=(_bz_VecExpr expr) { _bz_assign(expr, _bz_xor_update()); return *this; } template template inline VectorPick& VectorPick::operator&=(_bz_VecExpr expr) { _bz_assign(expr, _bz_bitand_update()); return *this; } template template inline VectorPick& VectorPick::operator|=(_bz_VecExpr expr) { _bz_assign(expr, _bz_bitor_update()); return *this; } template template inline VectorPick& VectorPick::operator>>=(_bz_VecExpr expr) { _bz_assign(expr, _bz_shiftr_update()); return *this; } template template inline VectorPick& VectorPick::operator<<=(_bz_VecExpr expr) { _bz_assign(expr, _bz_shiftl_update()); return *this; } /***************************************************************************** * Assignment operators with scalar operand */ template inline VectorPick& VectorPick::operator=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) = _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator+=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) += _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator-=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) -= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator*=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) *= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator/=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) /= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator%=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) %= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator^=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) ^= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator&=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) &= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator|=(P_numtype x) { typedef _bz_VecExprConstant T_expr; (*this) |= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator>>=(int x) { typedef _bz_VecExprConstant T_expr; (*this) >>= _bz_VecExpr(T_expr(x)); return *this; } template inline VectorPick& VectorPick::operator<<=(int x) { typedef _bz_VecExprConstant T_expr; (*this) <<= _bz_VecExpr(T_expr(x)); return *this; } /***************************************************************************** * Assignment operators with vector operand */ template template inline VectorPick& VectorPick::operator=(const Vector& x) { (*this) = _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator+=(const Vector& x) { (*this) += _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator-=(const Vector& x) { (*this) -= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator*=(const Vector& x) { (*this) *= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator/=(const Vector& x) { (*this) /= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator%=(const Vector& x) { (*this) %= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator^=(const Vector& x) { (*this) ^= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator&=(const Vector& x) { (*this) &= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator|=(const Vector& x) { (*this) |= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator<<=(const Vector& x) { (*this) <<= _bz_VecExpr >(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator>>=(const Vector& x) { (*this) >>= _bz_VecExpr >(x.begin()); return *this; } /***************************************************************************** * Assignment operators with Range operand */ template inline VectorPick& VectorPick::operator=(Range r) { (*this) = _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator+=(Range r) { (*this) += _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator-=(Range r) { (*this) -= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator*=(Range r) { (*this) *= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator/=(Range r) { (*this) /= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator%=(Range r) { (*this) %= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator^=(Range r) { (*this) ^= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator&=(Range r) { (*this) &= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator|=(Range r) { (*this) |= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator>>=(Range r) { (*this) >>= _bz_VecExpr(r); return *this; } template inline VectorPick& VectorPick::operator<<=(Range r) { (*this) <<= _bz_VecExpr(r); return *this; } /***************************************************************************** * Assignment operators with VectorPick operand */ template template inline VectorPick& VectorPick::operator=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) = _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator+=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) += _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator-=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) -= _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator*=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) *= _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator/=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) /= _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator%=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) %= _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator^=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) ^= _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator&=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) &= _bz_VecExpr(x.begin()); return *this; } template template inline VectorPick& VectorPick::operator|=(const VectorPick& x) { typedef VectorPickIterConst T_expr; (*this) |= _bz_VecExpr(x.begin()); return *this; } /***************************************************************************** * Assignment operators with Random operand */ template template VectorPick& VectorPick::operator=(Random& rand) { (*this) = _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator+=(Random& rand) { (*this) += _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator-=(Random& rand) { (*this) -= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator*=(Random& rand) { (*this) *= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator/=(Random& rand) { (*this) /= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator%=(Random& rand) { (*this) %= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator^=(Random& rand) { (*this) ^= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator&=(Random& rand) { (*this) &= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } template template VectorPick& VectorPick::operator|=(Random& rand) { (*this) |= _bz_VecExpr<_bz_VecExprRandom > (_bz_VecExprRandom(rand)); return *this; } BZ_NAMESPACE_END #endif // BZ_VECPICK_CC