⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 valarray

📁 C语言库函数的原型,有用的拿去
💻
📖 第 1 页 / 共 3 页
字号:
		}

	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 + -