_valarray.c

来自「stl的源码」· C语言 代码 · 共 192 行

C
192
字号
/* * * * Copyright (c) 1994 * Hewlett-Packard Company * * Copyright (c) 1996,1997 * Silicon Graphics Computer Systems, Inc. * * Copyright (c) 1997 * Moscow Center for SPARC Technology * * Copyright (c) 1999 * Boris Fomitchev * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */#ifndef _STLP_VALARRAY_C#define _STLP_VALARRAY_C#ifndef _STLP_VALARRAY_H# include <stl/_valarray.h>#endif_STLP_BEGIN_NAMESPACEtemplate <class _Tp>_Valarray_bool valarray<_Tp>:: operator!() const {  _Valarray_bool __tmp(this->size(), _Valarray_bool::_NoInit());  for (size_t __i = 0; __i < this->size(); ++__i)    __tmp[__i] = !(*this)[__i];  return __tmp;}// Behavior is undefined if __x and *this have different sizestemplate <class _Tp>valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<_Tp>& __x) {  _STLP_ASSERT(__x._M_slice.size() == this->size())  size_t __index = __x._M_slice.start();  for (size_t __i = 0;       __i < __x._M_slice.size();       ++__i, __index += __x._M_slice.stride())    (*this)[__i] = __x._M_array[__index];  return *this;}template <class _Tp>valarray<_Tp> valarray<_Tp>::operator[](slice __slice) const {  valarray<_Tp> __tmp(__slice.size(), _NoInit());  size_t __index = __slice.start();  for (size_t __i = 0;       __i < __slice.size();       ++__i, __index += __slice.stride())    __tmp[__i] = (*this)[__index];  return __tmp;}template <class _Size>bool _Gslice_Iter_tmpl<_Size>::_M_incr() {  size_t __dim = _M_indices.size() - 1;  ++_M_step;  for (;;) {    _M_1d_idx += _M_gslice._M_strides[__dim];    if (++_M_indices[__dim] != _M_gslice._M_lengths[__dim])      return true;    else if (__dim != 0) {      _M_1d_idx -= _M_gslice._M_strides[__dim] * _M_gslice._M_lengths[__dim];      _M_indices[__dim] = 0;      --__dim;    }    else      return false;  }}// Behavior is undefined if __x and *this have different sizes, or if// __x was constructed from a degenerate gslice.template <class _Tp>valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<_Tp>& __x) {  if (this->size() != 0) {    _Gslice_Iter __i(__x._M_gslice);    do      (*this)[__i._M_step] = __x._M_array[__i._M_1d_idx];    while(__i._M_incr());  }  return *this;}template <class _Tp>valarray<_Tp> valarray<_Tp>::operator[](const gslice& __slice) const {  valarray<_Tp> __tmp(__slice._M_size(), _NoInit());  if (__tmp.size() != 0) {    _Gslice_Iter __i(__slice);    do __tmp[__i._M_step] = (*this)[__i._M_1d_idx]; while(__i._M_incr());  }  return __tmp;}template <class _Tp>valarray<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask) const {  size_t _p_size = 0;  {    for (size_t __i = 0; __i < __mask.size(); ++__i)      if (__mask[__i]) ++_p_size;  }  valarray<_Tp> __tmp(_p_size, _NoInit());  size_t __idx = 0;  {    for (size_t __i = 0; __i < __mask.size(); ++__i)      if (__mask[__i]) __tmp[__idx++] = (*this)[__i];  }  return __tmp;}template <class _Tp>valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<_Tp>& __x) {  _STLP_ASSERT(__x._M_addr.size() == this->size())  for (size_t __i = 0; __i < __x._M_addr.size(); ++__i)    (*this)[__i] = __x._M_array[__x._M_addr[__i]];  return *this;}template <class _Tp>valarray<_Tp>valarray<_Tp>::operator[](const _Valarray_size_t& __addr) const {  valarray<_Tp> __tmp(__addr.size(), _NoInit());  for (size_t __i = 0; __i < __addr.size(); ++__i)    __tmp[__i] = (*this)[__addr[__i]];  return __tmp;}//----------------------------------------------------------------------// Other valarray noninline member functions// Shift and cshifttemplate <class _Tp>valarray<_Tp> valarray<_Tp>::shift(int __n) const {  valarray<_Tp> __tmp(this->size());  if (__n >= 0) {    if (__n < this->size())      copy(this->_M_first + __n, this->_M_first + this->size(),           __tmp._M_first);  }  else {    if (-__n < this->size())      copy(this->_M_first, this->_M_first + this->size() + __n,           __tmp._M_first - __n);  }  return __tmp;}template <class _Tp>valarray<_Tp> valarray<_Tp>::cshift(int __m) const {  valarray<_Tp> __tmp(this->size());  // Reduce __m to an equivalent number in the range [0, size()).  We  // have to be careful with negative numbers, since the sign of a % b  // is unspecified when a < 0.  long __n = __m;  if (this->size() < (numeric_limits<long>::max)())    __n %= long(this->size());  if (__n < 0)    __n += this->size();  copy(this->_M_first,       this->_M_first + __n,       __tmp._M_first + (this->size() - __n));  copy(this->_M_first + __n, this->_M_first + this->size(),       __tmp._M_first);  return __tmp;}_STLP_END_NAMESPACE#endif /*  _STLP_VALARRAY_C */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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