Listing 7: Template class mask_array
// MACROS
#define MOP(RHS) \
size_t N = 0; \
size_t M = Totlen(); \
for (size_t I = 0; I < M; ++N) \
if (Mask(N)) \
Ptr[N] RHS, ++I;
#define MOP2(RHS) \
size_t N = 0; \
size_t M = L.Totlen(); \
for (size_t I = 0; I < M; ++N) \
if (L.Mask(N)) \
L.Data(N) RHS, ++I;
// TEMPLATE CLASS mask_array
template<class Ty>
class mask_array {
public:
typedef Ty value_type;
void operator=(const valarray<Ty>& R)
{MOP(= R[I]); }
void operator=(const Ty& R)
{MOP(= R); }
Ty& Data(size_t I) const
{return (Ptr[I]); }
bool Mask(size_t I) const
{return (Marr[I]); }
size_t Totlen() const
{size_t N = 0;
for (size_t I = 0; I < Marr.size(); ++I)
if (Marr[I])
++N;
return (N); }
private:
friend class valarray<Ty>;
mask_array(const Boolarray& Ma, Ty *Pd)
: Marr(Ma), Ptr(Pd) {}
Boolarray Marr;
Ty *Ptr;
};
// mask_array MEMBER TEMPLATE OPERATORS
template<class Ty> inline
void operator*=(const mask_array<Ty>& L,
const valarray<Ty>& R)
{MOP2(*= R[I]); }
// etc.
//End of File