📄 valarray
字号:
}
void operator+=(const valarray<_Ty>& _Right) const
{ // add slice to valarray
_SLOP(+= _Right[_Idx]);
}
void operator-=(const valarray<_Ty>& _Right) const
{ // subtract valarray from slice
_SLOP(-= _Right[_Idx]);
}
void operator^=(const valarray<_Ty>& _Right) const
{ // XOR valarray into slice
_SLOP(^= _Right[_Idx]);
}
void operator&=(const valarray<_Ty>& _Right) const
{ // AND valarray into slice
_SLOP(&= _Right[_Idx]);
}
void operator|=(const valarray<_Ty>& _Right) const
{ // OR valarray into slice
_SLOP(|= _Right[_Idx]);
}
void operator<<=(const valarray<_Ty>& _Right) const
{ // left shift slice by valarray
_SLOP(<<= _Right[_Idx]);
}
void operator>>=(const valarray<_Ty>& _Right) const
{ // right shift slice by valarray
_SLOP(>>= _Right[_Idx]);
}
_Ty& _Data(size_t _Idx) const
{ // return reference to underlying array element
return (_Myptr[_Idx]);
}
slice_array(); // not defined
slice_array(const slice_array&); // not defined
slice_array& operator=(const slice_array&); // not defined
private:
friend class valarray<_Ty>;
slice_array(const slice& _Slice, _Ty *_Pdata)
: slice(_Slice), _Myptr(_Pdata)
{ // construct from slice and pointer to valarray contents
}
_Ty *_Myptr; // pointer to valarray contents
};
// CLASS gslice
class gslice
{ // define a generalized (multidimensional) slice of a valarray
public:
gslice()
: _Start(0)
{ // construct with all zeros
}
gslice(size_t _Off, const _Sizarray& _Lenarr,
const _Sizarray& _Incarr)
: _Start(_Off), _Len(_Lenarr), _Stride(_Incarr)
{ // construct from starting offset, arrays of lengths and strides
}
size_t start() const
{ // return starting offset of generalized slice
return (_Start);
}
_Sizarray size() const
{ // return array of lengths of slices
return (_Len);
}
_Sizarray stride() const
{ // return array of strides of slices
return (_Stride);
}
size_t _Nslice() const
{ // return number of slices
return (_Len.size());
}
size_t _Off(_Sizarray& _Indexarr) const
{ // return offset for an array of indexes, then increment
size_t _Idx, _Ans = _Start;
for (_Idx = 0; _Idx < _Indexarr.size(); ++_Idx)
_Ans += _Indexarr[_Idx] * _Stride[_Idx]; // compute offset
while (0 < _Idx--)
if (++_Indexarr[_Idx] < _Len[_Idx])
break; // increment done, quit
else
_Indexarr[_Idx] = 0; // carry to more-significant index
return (_Ans);
}
size_t _Totlen() const
{ // return total length of generalized slice
if (_Len.size() == 0)
return (0);
size_t _Count = _Len[0];
for (size_t _Idx = 0; ++_Idx < _Len.size(); )
_Count *= _Len[_Idx];
return (_Count);
}
private:
size_t _Start; // the starting offset
_Sizarray _Len; // array of numbers of elements
_Sizarray _Stride; // array of distances between elements
};
// MACROS FOR gslice_array
#define _GSLOP(RHS) /* apply RHS(_Idx) to gslice_array */ \
_Sizarray _Indexarray((size_t)0, _Nslice()); \
size_t _Size = _Totlen(); \
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) \
_Myptr[_Off(_Indexarray)] RHS;
// TEMPLATE CLASS gslice_array
template<class _Ty>
class gslice_array
: public gslice
{ // define a generalized slice of a valarray
public:
typedef _Ty value_type;
void operator=(const valarray<_Ty>& _Right) const
{ // assign a valarray to a generalized slice
_GSLOP(= _Right[_Idx]);
}
void operator=(const _Ty& _Right) const
{ // assign a scalar to elements of a generalized slice
_GSLOP(= _Right);
}
void operator*=(const valarray<_Ty>& _Right) const
{ // multiply generalized slice by valarray
_GSLOP(*= _Right[_Idx]);
}
void operator/=(const valarray<_Ty>& _Right) const
{ // divide generalized slice by valarray
_GSLOP(/= _Right[_Idx]);
}
void operator%=(const valarray<_Ty>& _Right) const
{ // remainder generalized slice by valarray
_GSLOP(%= _Right[_Idx]);
}
void operator+=(const valarray<_Ty>& _Right) const
{ // add valarray to generalized slice
_GSLOP(+= _Right[_Idx]);
}
void operator-=(const valarray<_Ty>& _Right) const
{ // subtract valarray from generalized slice
_GSLOP(-= _Right[_Idx]);
}
void operator^=(const valarray<_Ty>& _Right) const
{ // XOR valarray into generalized slice
_GSLOP(^= _Right[_Idx]);
}
void operator&=(const valarray<_Ty>& _Right) const
{ // AND valarray into generalized slice
_GSLOP(&= _Right[_Idx]);
}
void operator|=(const valarray<_Ty>& _Right) const
{ // OR valarray into generalized slice
_GSLOP(|= _Right[_Idx]);
}
void operator<<=(const valarray<_Ty>& _Right) const
{ // left shift generalized slice by valarray
_GSLOP(<<= _Right[_Idx]);
}
void operator>>=(const valarray<_Ty>& _Right) const
{ // right shift generalized slice by valarray
_GSLOP(>>= _Right[_Idx]);
}
_Ty& _Data(size_t _Idx) const
{ // return reference to underlying array element
return (_Myptr[_Idx]);
}
gslice_array(); // not defined
gslice_array(const gslice_array&); // not defined
gslice_array& operator=( const gslice_array&); // not defined
private:
friend class valarray<_Ty>;
gslice_array(const gslice& _Gslice, _Ty *_Ptr)
: gslice(_Gslice), _Myptr(_Ptr)
{ // construct from gslice and pointer to valarray contents
}
_Ty *_Myptr; // pointer to valarray contents
};
// MACROS FOR mask_array
#define _MOP(RHS) /* apply RHS(_Idx) to mask_array */ \
size_t _Off = 0; \
size_t _Size = _Totlen(); \
for (size_t _Idx = 0; _Idx < _Size; ++_Off) \
if (_Mask(_Off)) \
_Myptr[_Off] RHS, ++_Idx;
// TEMPLATE CLASS mask_array
template<class _Ty>
class mask_array
{ // define a subset of a valarray with an array of mask bits
public:
typedef _Ty value_type;
void operator=(const valarray<_Ty>& _Right) const
{ // assign a valarray to a masked array
_MOP(= _Right[_Idx]);
}
void operator=(const _Ty& _Right) const
{ // assign a scalar to elements of a masked array
_MOP(= _Right);
}
void operator*=(const valarray<_Ty>& _Right) const
{ // multiply masked array by valarray
_MOP(*= _Right[_Idx]);
}
void operator/=(const valarray<_Ty>& _Right) const
{ // divide masked array by valarray
_MOP(/= _Right[_Idx]);
}
void operator%=(const valarray<_Ty>& _Right) const
{ // remainder masked array by valarray
_MOP(%= _Right[_Idx]);
}
void operator+=(const valarray<_Ty>& _Right) const
{ // add valarray to masked array
_MOP(+= _Right[_Idx]);
}
void operator-=(const valarray<_Ty>& _Right) const
{ // subtract valarray from masked array
_MOP(-= _Right[_Idx]);
}
void operator^=(const valarray<_Ty>& _Right) const
{ // XOR valarray into masked array
_MOP(^= _Right[_Idx]);
}
void operator&=(const valarray<_Ty>& _Right) const
{ // OR valarray into masked array
_MOP(&= _Right[_Idx]);
}
void operator|=(const valarray<_Ty>& _Right) const
{ // OR valarray into masked array
_MOP(|= _Right[_Idx]);
}
void operator<<=(const valarray<_Ty>& _Right) const
{ // left shift masked array by valarray
_MOP(<<= _Right[_Idx]);
}
void operator>>=(const valarray<_Ty>& _Right) const
{ // right shift masked array by valarray
_MOP(>>= _Right[_Idx]);
}
_Ty& _Data(size_t _Idx) const
{ // return reference to underlying array element
return (_Myptr[_Idx]);
}
bool _Mask(size_t _Idx) const
{ // return mask element for a given index
return (_Mybool[_Idx]);
}
size_t _Totlen() const
{ // return total length of masked array
size_t _Count = 0;
for (size_t _Idx = 0; _Idx < _Mybool.size(); ++_Idx)
if (_Mybool[_Idx])
++_Count;
return (_Count);
}
mask_array(); // not defined
mask_array(const mask_array&); // not defined
mask_array& operator=(const mask_array&); // not defined
private:
friend class valarray<_Ty>;
mask_array(const _Boolarray& _Maskarr, _Ty *_Pdata)
: _Mybool(_Maskarr), _Myptr(_Pdata)
{ // construct from mask array and pointer to valarray contents
}
_Boolarray _Mybool; // array of mask bits
_Ty *_Myptr; // pointer to valarray contents
};
// MACROS FOR indirect_array
#define _IOP(RHS) /* apply RHS(_Idx) to indirect_array */ \
size_t _Size = _Totlen(); \
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) \
_Myptr[_Indir(_Idx)] RHS;
// TEMPLATE CLASS indirect_array
template<class _Ty>
class indirect_array
{ // define a subset of a valarray with an array of indexes
public:
typedef _Ty value_type;
void operator=(const valarray<_Ty>& _Right) const
{ // assign a valarray to an indirect array
_IOP(= _Right[_Idx]);
}
void operator=(const _Ty& _Right) const
{ // assign a scalar to elements of an indirect array
_IOP(= _Right);
}
void operator*=(const valarray<_Ty>& _Right) const
{ // multiply indirect array by valarray
_IOP(*= _Right[_Idx]);
}
void operator/=(const valarray<_Ty>& _Right) const
{ // divide indirect array by valarray
_IOP(/= _Right[_Idx]);
}
void operator%=(const valarray<_Ty>& _Right) const
{ // remainder indirect array by valarray
_IOP(%= _Right[_Idx]);
}
void operator+=(const valarray<_Ty>& _Right) const
{ // add valarray to indirect array
_IOP(+= _Right[_Idx]);
}
void operator-=(const valarray<_Ty>& _Right) const
{ // subtract valarray from indirect array
_IOP(-= _Right[_Idx]);
}
void operator^=(const valarray<_Ty>& _Right) const
{ // XOR valarray into indirect array
_IOP(^= _Right[_Idx]);
}
void operator&=(const valarray<_Ty>& _Right) const
{ // AND valarray into indirect array
_IOP(&= _Right[_Idx]);
}
void operator|=(const valarray<_Ty>& _Right) const
{ // OR valarray into indirect array
_IOP(|= _Right[_Idx]);
}
void operator<<=(const valarray<_Ty>& _Right) const
{ // left shift indirect array by valarray
_IOP(<<= _Right[_Idx]);
}
void operator>>=(const valarray<_Ty>& _Right) const
{ // right shift indirect array by valarray
_IOP(>>= _Right[_Idx]);
}
_Ty& _Data(size_t _Idx) const
{ // return reference to underlying array element
return (_Myptr[_Idx]);
}
size_t _Indir(size_t _Idx) const
{ // return mapped index for a given index
return (_Myindarr[_Idx]);
}
size_t _Totlen() const
{ // return total length of indirect array
return (_Myindarr.size());
}
indirect_array(); // not defined
indirect_array(const indirect_array&); // not defined
indirect_array& operator=(const indirect_array&); // not defined
private:
friend class valarray<_Ty>;
indirect_array(const _Sizarray& _Indarr, _Ty *_Ptr)
: _Myindarr(_Indarr), _Myptr(_Ptr)
{ // construct from indirect array and pointer to valarray contents
}
_Sizarray _Myindarr; // array of indirect indexes
_Ty *_Myptr; // pointer to valarray contents
};
// slice_array TEMPLATE FUNCTIONS
template<class _Ty> inline
valarray<_Ty>& valarray<_Ty>::operator=(
const slice_array<_Ty>& _Slicearr)
{ // assign slice array to valarray
_Tidy(true);
_Grow(_Slicearr.size(), &_Slicearr._Data(_Slicearr.start()),
_Slicearr.stride());
return (*this);
}
template<class _Ty> inline
valarray<_Ty> valarray<_Ty>::operator[](slice _Slice) const
{ // subscript nonmutable valarray by slice
return (valarray<_Ty>(slice_array<_Ty>(_Slice, _Myptr)));
}
template<class _Ty> inline
slice_array<_Ty> valarray<_Ty>::operator[](slice _Slice)
{ // subscript mutable valarray by slice
return (slice_array<_Ty>(_Slice, _Myptr));
}
// gslice_array TEMPLATE FUNCTIONS
template<class _Ty> inline
valarray<_Ty>& valarray<_Ty>::operator=(
const gslice_array<_Ty>& _Gslicearr)
{ // assign generalized slice array to valarray
_Tidy(true);
_Grow(_Gslicearr._Totlen());
_Sizarray _Indexarray((size_t)0, _Gslicearr._Nslice());
_VALGOP(= _Gslicearr._Data(_Gslicearr._Off(_Indexarray)));
}
template<class _Ty> inline
valarray<_Ty> valarray<_Ty>::operator[](const gslice& _Gslice) const
{ // subscript nonmutable valarray by generalized slice
return (valarray<_Ty>(gslice_array<_Ty>(_Gslice, _Myptr)));
}
template<class _Ty> inline
gslice_array<_Ty> valarray<_Ty>::operator[](const gslice& _Gslicearr)
{ // subscript mutable valarray by generalized slice
return (gslice_array<_Ty>(_Gslicearr, _Myptr));
}
// mask_array TEMPLATE FUNCTIONS
template<class _Ty> inline
valarray<_Ty>& valarray<_Ty>::operator=(const mask_array<_Ty>& _Maskarr)
{ // assign masked array to valarray
_Tidy(true);
_Grow(_Maskarr._Totlen());
size_t _Count = 0;
for (size_t _Idx = 0; _Idx < size(); ++_Count)
if (_Maskarr._Mask(_Count))
_Myptr[_Idx++] = _Maskarr._Data(_Count);
return (*this);
}
template<class _Ty> inline
valarray<_Ty> valarray<_Ty>::operator[](const _Boolarray& _Boolarr) const
{ // subscript nonmutable valarray by boolean (mask) array
return (valarray<_Ty>(mask_array<_Ty>(_Boolarr, _Myptr)));
}
template<class _Ty> inline
mask_array<_Ty> valarray<_Ty>::operator[](const _Boolarray& _Boolarr)
{ // subscript nonmutable valarray by boolean (mask) array
return (mask_array<_Ty>(_Boolarr, _Myptr));
}
// indirect_array TEMPLATE FUNCTIONS
template<class _Ty> inline
valarray<_Ty>& valarray<_Ty>::operator=(
const indirect_array<_Ty>& _Indarr)
{ // assign indirect array to valarray
_Tidy(true);
_Grow(_Indarr._Totlen());
_VALGOP(= _Indarr._Data(_Indarr._Indir(_Idx)));
}
template<class _Ty> inline
valarray<_Ty> valarray<_Ty>::operator[](const _Sizarray& _Indarr) const
{ // subscript nonmutable valarray by indirect (mapping) array
return (valarray<_Ty>(indirect_array<_Ty>(_Indarr, _Myptr)));
}
template<class _Ty> inline
indirect_array<_Ty> valarray<_Ty>::operator[](const _Sizarray& _Indarr)
{ // subscript mutable valarray by indirect (mapping) array
return (indirect_array<_Ty>(_Indarr, _Myptr));
}
_STD_END
#pragma warning(pop)
#pragma pack(pop)
#endif /* RC_INVOKED */
#endif /* _VALARRAY_ */
/*
* Copyright (c) 1992-2009 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V5.20:0009 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -