00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef BZ_VECPICK_H
00027 #define BZ_VECPICK_H
00028
00029 #include <blitz/vector.h>
00030
00031 BZ_NAMESPACE(blitz)
00032
00033
00034
00035 template<typename P_numtype> class VectorPickIter;
00036 template<typename P_numtype> class VectorPickIterConst;
00037
00038
00039
00040 template<typename P_numtype>
00041 class VectorPick {
00042
00043 public:
00045
00047
00048 typedef P_numtype T_numtype;
00049 typedef Vector<T_numtype> T_vector;
00050 typedef Vector<int> T_indexVector;
00051 typedef VectorPick<T_numtype> T_pick;
00052 typedef VectorPickIter<T_numtype> T_iterator;
00053 typedef VectorPickIterConst<T_numtype> T_constIterator;
00054
00056
00058
00059 VectorPick(T_vector& vector, T_indexVector& indexarg)
00060 : vector_(vector), index_(indexarg)
00061 { }
00062
00063 VectorPick(const T_pick& vecpick)
00064 : vector_(const_cast<T_vector&>(vecpick.vector_)),
00065 index_(const_cast<T_indexVector&>(vecpick.index_))
00066 { }
00067
00068 VectorPick(T_pick& vecpick, Range r)
00069 : vector_(vecpick.vector_), index_(vecpick.index_[r])
00070 { }
00071
00073
00075
00076 T_iterator beginFast()
00077 { return VectorPickIter<T_numtype>(*this); }
00078
00079 T_constIterator beginFast() const
00080 { return VectorPickIterConst<T_numtype>(*this); }
00081
00082
00083
00084
00085
00086
00087
00088 T_indexVector& indexSet()
00089 { return index_; }
00090
00091 const T_indexVector& indexSet() const
00092 { return index_; }
00093
00094 int length() const
00095 { return index_.length(); }
00096
00097 void setVector(Vector<T_numtype>& x)
00098 { vector_.reference(x); }
00099
00100 void setIndex(Vector<int>& index)
00101 { index_.reference(index); }
00102
00103 T_vector& vector()
00104 { return vector_; }
00105
00106 const T_vector& vector() const
00107 { return vector_; }
00108
00110
00111
00112
00114
00115 int _bz_suggestLength() const
00116 { return index_.length(); }
00117
00118 bool _bz_hasFastAccess() const
00119 { return vector_._bz_hasFastAccess() && index_._bz_hasFastAccess(); }
00120
00121 T_numtype& _bz_fastAccess(int i)
00122 { return vector_._bz_fastAccess(index_._bz_fastAccess(i)); }
00123
00124 T_numtype _bz_fastAccess(int i) const
00125 { return vector_._bz_fastAccess(index_._bz_fastAccess(i)); }
00126
00127 _bz_VecExpr<T_constIterator> _bz_asVecExpr() const
00128 { return _bz_VecExpr<T_constIterator>(beginFast()); }
00129
00131
00133
00134 T_numtype operator()(int i) const
00135 {
00136 BZPRECONDITION(index_.stride() == 1);
00137 BZPRECONDITION(vector_.stride() == 1);
00138 BZPRECONDITION(i < index_.length());
00139 BZPRECONDITION(index_[i] < vector_.length());
00140 return vector_(index_(i));
00141 }
00142
00143 T_numtype& operator()(int i)
00144 {
00145 BZPRECONDITION(index_.stride() == 1);
00146 BZPRECONDITION(vector_.stride() == 1);
00147 BZPRECONDITION(i < index_.length());
00148 BZPRECONDITION(index_[i] < vector_.length());
00149 return vector_(index_(i));
00150 }
00151
00152 T_numtype operator[](int i) const
00153 {
00154 BZPRECONDITION(index_.stride() == 1);
00155 BZPRECONDITION(vector_.stride() == 1);
00156 BZPRECONDITION(i < index_.length());
00157 BZPRECONDITION(index_[i] < vector_.length());
00158 return vector_[index_[i]];
00159 }
00160
00161 T_numtype& operator[](int i)
00162 {
00163 BZPRECONDITION(index_.stride() == 1);
00164 BZPRECONDITION(vector_.stride() == 1);
00165 BZPRECONDITION(i < index_.length());
00166 BZPRECONDITION(index_[i] < vector_.length());
00167 return vector_[index_[i]];
00168 }
00169
00170 T_pick operator()(Range r)
00171 {
00172 return T_pick(*this, index_[r]);
00173 }
00174
00175 T_pick operator[](Range r)
00176 {
00177 return T_pick(*this, index_[r]);
00178 }
00179
00181
00183
00184
00185 T_pick& operator=(T_numtype);
00186 T_pick& operator+=(T_numtype);
00187 T_pick& operator-=(T_numtype);
00188 T_pick& operator*=(T_numtype);
00189 T_pick& operator/=(T_numtype);
00190 T_pick& operator%=(T_numtype);
00191 T_pick& operator^=(T_numtype);
00192 T_pick& operator&=(T_numtype);
00193 T_pick& operator|=(T_numtype);
00194 T_pick& operator>>=(int);
00195 T_pick& operator<<=(int);
00196
00197
00198 template<typename P_numtype2> T_pick& operator=(const Vector<P_numtype2> &);
00199 template<typename P_numtype2> T_pick& operator+=(const Vector<P_numtype2> &);
00200 template<typename P_numtype2> T_pick& operator-=(const Vector<P_numtype2> &);
00201 template<typename P_numtype2> T_pick& operator*=(const Vector<P_numtype2> &);
00202 template<typename P_numtype2> T_pick& operator/=(const Vector<P_numtype2> &);
00203 template<typename P_numtype2> T_pick& operator%=(const Vector<P_numtype2> &);
00204 template<typename P_numtype2> T_pick& operator^=(const Vector<P_numtype2> &);
00205 template<typename P_numtype2> T_pick& operator&=(const Vector<P_numtype2> &);
00206 template<typename P_numtype2> T_pick& operator|=(const Vector<P_numtype2> &);
00207 template<typename P_numtype2> T_pick& operator>>=(const Vector<P_numtype2> &);
00208 template<typename P_numtype2> T_pick& operator<<=(const Vector<P_numtype2> &);
00209
00210
00211 template<typename P_expr> T_pick& operator=(_bz_VecExpr<P_expr>);
00212 template<typename P_expr> T_pick& operator+=(_bz_VecExpr<P_expr>);
00213 template<typename P_expr> T_pick& operator-=(_bz_VecExpr<P_expr>);
00214 template<typename P_expr> T_pick& operator*=(_bz_VecExpr<P_expr>);
00215 template<typename P_expr> T_pick& operator/=(_bz_VecExpr<P_expr>);
00216 template<typename P_expr> T_pick& operator%=(_bz_VecExpr<P_expr>);
00217 template<typename P_expr> T_pick& operator^=(_bz_VecExpr<P_expr>);
00218 template<typename P_expr> T_pick& operator&=(_bz_VecExpr<P_expr>);
00219 template<typename P_expr> T_pick& operator|=(_bz_VecExpr<P_expr>);
00220 template<typename P_expr> T_pick& operator>>=(_bz_VecExpr<P_expr>);
00221 template<typename P_expr> T_pick& operator<<=(_bz_VecExpr<P_expr>);
00222
00223
00224 T_pick& operator=(Range);
00225 T_pick& operator+=(Range);
00226 T_pick& operator-=(Range);
00227 T_pick& operator*=(Range);
00228 T_pick& operator/=(Range);
00229 T_pick& operator%=(Range);
00230 T_pick& operator^=(Range);
00231 T_pick& operator&=(Range);
00232 T_pick& operator|=(Range);
00233 T_pick& operator>>=(Range);
00234 T_pick& operator<<=(Range);
00235
00236
00237 template<typename P_numtype2>
00238 T_pick& operator=(const VectorPick<P_numtype2> &);
00239 template<typename P_numtype2>
00240 T_pick& operator+=(const VectorPick<P_numtype2> &);
00241 template<typename P_numtype2>
00242 T_pick& operator-=(const VectorPick<P_numtype2> &);
00243 template<typename P_numtype2>
00244 T_pick& operator*=(const VectorPick<P_numtype2> &);
00245 template<typename P_numtype2>
00246 T_pick& operator/=(const VectorPick<P_numtype2> &);
00247 template<typename P_numtype2>
00248 T_pick& operator%=(const VectorPick<P_numtype2> &);
00249 template<typename P_numtype2>
00250 T_pick& operator^=(const VectorPick<P_numtype2> &);
00251 template<typename P_numtype2>
00252 T_pick& operator&=(const VectorPick<P_numtype2> &);
00253 template<typename P_numtype2>
00254 T_pick& operator|=(const VectorPick<P_numtype2> &);
00255 template<typename P_numtype2>
00256 T_pick& operator>>=(const VectorPick<P_numtype2> &);
00257 template<typename P_numtype2>
00258 T_pick& operator<<=(const VectorPick<P_numtype2> &);
00259
00260
00261 template<typename P_distribution>
00262 T_pick& operator=(Random<P_distribution>& random);
00263 template<typename P_distribution>
00264 T_pick& operator+=(Random<P_distribution>& random);
00265 template<typename P_distribution>
00266 T_pick& operator-=(Random<P_distribution>& random);
00267 template<typename P_distribution>
00268 T_pick& operator*=(Random<P_distribution>& random);
00269 template<typename P_distribution>
00270 T_pick& operator/=(Random<P_distribution>& random);
00271 template<typename P_distribution>
00272 T_pick& operator%=(Random<P_distribution>& random);
00273 template<typename P_distribution>
00274 T_pick& operator^=(Random<P_distribution>& random);
00275 template<typename P_distribution>
00276 T_pick& operator&=(Random<P_distribution>& random);
00277 template<typename P_distribution>
00278 T_pick& operator|=(Random<P_distribution>& random);
00279
00280 private:
00281 VectorPick() { }
00282
00283 template<typename P_expr, typename P_updater>
00284 inline void _bz_assign(P_expr, P_updater);
00285
00286 private:
00287 T_vector vector_;
00288 T_indexVector index_;
00289 };
00290
00291 BZ_NAMESPACE_END
00292
00293 #include <blitz/vecpick.cc>
00294 #include <blitz/vecpickio.cc>
00295 #include <blitz/vecpickiter.h>
00296
00297 #endif // BZ_VECPICK_H