_valarray.h

来自「stl的源码」· C头文件 代码 · 共 1,685 行 · 第 1/4 页

H
1,685
字号
# ifndef __HP_aCCprivate:# endif  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 could be const but standard says NO (26.3.7.4-1)*/ {    if (!_M_gslice._M_empty()) {      _Gslice_Iter __i(_M_gslice);      do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr());    }  }  // C++ Standard defect 253, copy constructor must be public.  gslice_array(const gslice_array& __x)    : _M_gslice(__x._M_gslice), _M_array(__x._M_array)    {}  ~gslice_array() {}private:  gslice_array(const gslice &__gslice, valarray<_Tp> &__array)    : _M_gslice(__gslice), _M_array(__array)    {}  gslice                _M_gslice;  valarray<value_type>& _M_array;private:  // Disable default constructor and assignment  gslice_array();  void operator=(const gslice_array<_Tp>&);};// 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[](const gslice& __slice){ return gslice_array<_Tp>(__slice, *this); }//----------------------------------------------------------------------// mask_arraytemplate <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;  }  // 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;  }  // C++ Standard defect 253, copy constructor must be public.  mask_array(const mask_array& __x)    : _M_mask(__x._M_mask), _M_array(__x._M_array)    {}  ~mask_array() {}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 default constructor and assignment  mask_array();  void operator=(const mask_array<_Tp>&);};// valarray member functions dealing with mask_arraytemplate <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) {  _STLP_ASSERT(__mask.size() == this->size())  return mask_array<_Tp>(__mask, *this);}//----------------------------------------------------------------------// indirect_arraytemplate <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;  }  // C++ Standard defect 253, copy constructor must be public.  indirect_array(const indirect_array& __x)    : _M_addr(__x._M_addr), _M_array(__x._M_array)    {}  ~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 default constructor and assignment  indirect_array();  void operator=(const indirect_array<_Tp>&);};// valarray member functions dealing with indirect_arraytemplate <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); }_STLP_END_NAMESPACE# if !defined (_STLP_LINK_TIME_INSTANTIATION)#  include <stl/_valarray.c># endif#endif /* _STLP_VALARRAY */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?