?? stl_valarray.h
字號:
// Extension: check for an empty gslice.
bool _M_empty() const { return _M_lengths.size() == 0; }
// Extension: number of indices this gslice represents. (For a degenerate
// gslice, they're not necessarily all distinct.)
size_t _M_size() const {
return !this->_M_empty()
? accumulate(_M_lengths._M_first + 1,
_M_lengths._M_first + _M_lengths._M_size,
_M_lengths[0],
multiplies<size_t>())
: 0;
}
private:
size_t _M_start;
valarray<size_t> _M_lengths;
valarray<size_t> _M_strides;
};
// This is not an STL iterator. It is constructed from a gslice, and it
// steps through the gslice indices in sequence. See 23.3.6 of the C++
// standard, paragraphs 2-3, for an explanation of the sequence. At
// each step we get two things: the ordinal (i.e. number of steps taken),
// and the one-dimensional index.
template <class _Size>
struct _Gslice_Iter_tmpl {
_Gslice_Iter_tmpl(const gslice& __gslice)
: _M_step(0), _M_1d_idx(__gslice.start()),
_M_indices(size_t(0), __gslice._M_lengths.size()),
_M_gslice(__gslice)
{}
bool _M_done() const { return _M_indices[0] == _M_gslice._M_lengths[0]; }
bool _M_incr();
_Size _M_step;
_Size _M_1d_idx;
valarray<_Size> _M_indices;
const gslice& _M_gslice;
};
typedef _Gslice_Iter_tmpl<size_t> _Gslice_Iter;
template <class _Tp>
class gslice_array {
friend class valarray<_Tp>;
public:
typedef _Tp value_type;
void operator= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] = __x[__i._M_step]; while(__i._M_incr());
}
}
void operator*= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] *= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator/= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] /= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator%= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] %= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator+= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] += __x[__i._M_step]; while(__i._M_incr());
}
}
void operator-= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] -= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator^= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] ^= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator&= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] &= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator|= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] |= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator<<= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] <<= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator>>= (const valarray<value_type>& __x) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] >>= __x[__i._M_step]; while(__i._M_incr());
}
}
void operator= (const value_type& __c) const {
if (!_M_gslice._M_empty()) {
_Gslice_Iter __i(_M_gslice);
do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr());
}
}
~gslice_array() {}
private:
gslice_array(gslice __gslice, valarray<_Tp>& __array)
: _M_gslice(__gslice), _M_array(__array)
{}
gslice _M_gslice;
valarray<value_type>& _M_array;
private: // Disable assignment
void operator=(const gslice_array&);
};
// valarray member functions dealing with gslice and gslice_array. Note
// that it is illegal (behavior is undefined) to construct a gslice_array
// from a degenerate gslice.
template <class _Tp>
inline valarray<_Tp>::valarray(const gslice_array<_Tp>& __x)
: _Valarray_base<_Tp>(__x._M_gslice._M_size())
{
typedef typename __type_traits<_Tp>::has_trivial_default_constructor
_Is_Trivial;
_M_initialize(_Is_Trivial());
*this = __x;
}
template <class _Tp>
inline gslice_array<_Tp> valarray<_Tp>::operator[](gslice __slice) {
return gslice_array<_Tp>(__slice, *this);
}
//----------------------------------------------------------------------
// mask_array
template <class _Tp>
class mask_array {
friend class valarray<_Tp>;
public:
typedef _Tp value_type;
void operator=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] = __x[__idx++];
}
void operator*=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] *= __x[__idx++];
}
void operator/=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] /= __x[__idx++];
}
void operator%=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] %= __x[__idx++];
}
void operator+=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] += __x[__idx++];
}
void operator-=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] -= __x[__idx++];
}
void operator^=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] ^= __x[__idx++];
}
void operator&=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] &= __x[__idx++];
}
void operator|=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] |= __x[__idx++];
}
void operator<<=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] <<= __x[__idx++];
}
void operator>>=(const valarray<value_type>& __x) const {
size_t __idx = 0;
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] >>= __x[__idx++];
}
void operator=(const value_type& __c) const {
for (size_t __i = 0; __i < _M_array.size(); ++__i)
if (_M_mask[__i]) _M_array[__i] = __c;
}
~mask_array() {}
// Extension: number of true values in the mask
size_t _M_num_true() const {
size_t __result = 0;
for (size_t __i = 0; __i < _M_mask.size(); ++__i)
if (_M_mask[__i]) ++__result;
return __result;
}
private:
mask_array(const valarray<bool>& __mask, valarray<_Tp>& __array)
: _M_mask(__mask), _M_array(__array)
{}
valarray<bool> _M_mask;
valarray<_Tp>& _M_array;
private: // Disable assignment
void operator=(const mask_array&);
};
// valarray member functions dealing with mask_array
template <class _Tp>
inline valarray<_Tp>::valarray(const mask_array<_Tp>& __x)
: _Valarray_base<_Tp>(__x._M_num_true())
{
typedef typename __type_traits<_Tp>::has_trivial_default_constructor
_Is_Trivial;
_M_initialize(_Is_Trivial());
*this = __x;
}
// Behavior is undefined if __x._M_num_true() != this->size()
template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<_Tp>& __x) {
size_t __idx = 0;
for (size_t __i = 0; __i < __x._M_array.size(); ++__i)
if (__x._M_mask[__i]) (*this)[__idx++] = __x._M_array[__i];
return *this;
}
template <class _Tp>
inline mask_array<_Tp> valarray<_Tp>::operator[](const valarray<bool>& __mask)
{
return mask_array<_Tp>(__mask, *this);
}
//----------------------------------------------------------------------
// indirect_array
template <class _Tp>
class indirect_array {
friend class valarray<_Tp>;
public:
typedef _Tp value_type;
void operator=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] = __x[__i];
}
void operator*=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] *= __x[__i];
}
void operator/=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] /= __x[__i];
}
void operator%=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] %= __x[__i];
}
void operator+=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] += __x[__i];
}
void operator-=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] -= __x[__i];
}
void operator^=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] ^= __x[__i];
}
void operator&=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] &= __x[__i];
}
void operator|=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] |= __x[__i];
}
void operator<<=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] <<= __x[__i];
}
void operator>>=(const valarray<value_type>& __x) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] >>= __x[__i];
}
void operator=(const value_type& __c) const {
for (size_t __i = 0; __i < _M_addr.size(); ++__i)
_M_array[_M_addr[__i]] = __c;
}
~indirect_array() {}
private:
indirect_array(const valarray<size_t>& __addr, valarray<_Tp>& __array)
: _M_addr(__addr), _M_array(__array)
{}
valarray<size_t> _M_addr;
valarray<_Tp>& _M_array;
private: // Disable assignment
void operator=(const indirect_array&);
};
// valarray member functions dealing with indirect_array
template <class _Tp>
inline valarray<_Tp>::valarray(const indirect_array<_Tp>& __x)
: _Valarray_base<_Tp>(__x._M_addr.size())
{
typedef typename __type_traits<_Tp>::has_trivial_default_constructor
_Is_Trivial;
_M_initialize(_Is_Trivial());
*this = __x;
}
template <class _Tp>
inline indirect_array<_Tp>
valarray<_Tp>::operator[](const valarray<size_t>& __addr)
{
return indirect_array<_Tp>(__addr, *this);
}
__STL_END_NAMESPACE
# undef __STL_DO_ABS
# undef __STL_DO_ACOS
# undef __STL_DO_ASIN
# undef __STL_DO_ATAN
# undef __STL_DO_ATAN2
# undef __STL_DO_COS
# undef __STL_DO_COSH
# undef __STL_DO_LOG
# undef __STL_DO_LOG10
# undef __STL_DO_POW
# undef __STL_DO_SIN
# undef __STL_DO_SINH
# undef __STL_DO_SQRT
# undef __STL_DO_TAN
# undef __STL_DO_TANH
# if !defined (__STL_LINK_TIME_INSTANTIATION)
# include <stl_valarray.c>
# endif
#endif /* __SGI_STL_VALARRAY */
// Local Variables:
// mode:C++
// End:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -