_valarray.h
来自「stl的源码」· C头文件 代码 · 共 1,685 行 · 第 1/4 页
H
1,685 行
return __tmp;}template <class _Tp>inline _Valarray_bool _STLP_CALL operator>=(const _Tp& __c, const valarray<_Tp>& __x) { _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = __c >= __x[__i]; return __tmp;}template <class _Tp>inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x, const _Tp& __c) { _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = __x[__i] && __c; return __tmp;}template <class _Tp>inline _Valarray_bool _STLP_CALL operator&&(const _Tp& __c, const valarray<_Tp>& __x) { _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = __c && __x[__i]; return __tmp;}template <class _Tp>inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x, const _Tp& __c) { _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = __x[__i] || __c; return __tmp;}template <class _Tp>inline _Valarray_bool _STLP_CALL operator||(const _Tp& __c, const valarray<_Tp>& __x) { _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = __c || __x[__i]; return __tmp;}// valarray "transcendentals" (the list includes abs and sqrt, which,// of course, are not transcendental).template <class _Tp>inline valarray<_Tp> abs(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::abs(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> acos(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::acos(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> asin(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::asin(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> atan(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::atan(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const valarray<_Tp>& __y) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::atan2(__x[__i], __y[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const _Tp& __c) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::atan2(__x[__i], __c); return __tmp;}template <class _Tp>inline valarray<_Tp> atan2(const _Tp& __c, const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::atan2(__c, __x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> cos(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::cos(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> cosh(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::cosh(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> exp(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::exp(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> log(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::log(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> log10(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::log10(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> pow(const valarray<_Tp>& __x, const valarray<_Tp>& __y) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::pow(__x[__i], __y[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> pow(const valarray<_Tp>& __x, const _Tp& __c) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::pow(__x[__i], __c); return __tmp;}template <class _Tp>inline valarray<_Tp> pow(const _Tp& __c, const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::pow(__c, __x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> sin(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::sin(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> sinh(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::sinh(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> sqrt(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::sqrt(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> tan(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::tan(__x[__i]); return __tmp;}template <class _Tp>inline valarray<_Tp> tanh(const valarray<_Tp>& __x) { typedef typename valarray<_Tp>::_NoInit _NoInit; valarray<_Tp> __tmp(__x.size(), _NoInit()); for (size_t __i = 0; __i < __x.size(); ++__i) __tmp[__i] = ::tanh(__x[__i]); return __tmp;}//----------------------------------------------------------------------// slice and slice_arrayclass slice {public: slice() : _M_start(0), _M_length(0), _M_stride(0) {} slice(size_t __start, size_t __length, size_t __stride) : _M_start(__start), _M_length(__length), _M_stride(__stride) {} __TRIVIAL_DESTRUCTOR(slice) size_t start() const { return _M_start; } size_t size() const { return _M_length; } size_t stride() const { return _M_stride; }private: size_t _M_start; size_t _M_length; size_t _M_stride;};template <class _Tp>class slice_array { friend class valarray<_Tp>;public: typedef _Tp value_type; void operator=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] = __x[__i]; } void operator*=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] *= __x[__i]; } void operator/=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] /= __x[__i]; } void operator%=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] %= __x[__i]; } void operator+=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] += __x[__i]; } void operator-=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] -= __x[__i]; } void operator^=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] ^= __x[__i]; } void operator&=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] &= __x[__i]; } void operator|=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] |= __x[__i]; } void operator<<=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] <<= __x[__i]; } void operator>>=(const valarray<value_type>& __x) const { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] >>= __x[__i]; } void operator=(const value_type& __c) /*const could be const but standard says NO (26.3.5.4-1)*/ { size_t __index = _M_slice.start(); for (size_t __i = 0; __i < _M_slice.size(); ++__i, __index += _M_slice.stride()) _M_array[__index] = __c; } // C++ Standard defect 253, copy constructor must be public. slice_array(const slice_array &__x) : _M_slice(__x._M_slice), _M_array(__x._M_array) {} ~slice_array() {}private: slice_array(const slice& __slice, valarray<_Tp> &__array) : _M_slice(__slice), _M_array(__array) {} slice _M_slice; valarray<_Tp>& _M_array;private: // Disable default constructor and assignment slice_array(); slice_array& operator=(const slice_array&);};// valarray member functions dealing with slice and slice_arraytemplate <class _Tp>inline valarray<_Tp>::valarray(const slice_array<_Tp>& __x) : _Valarray_base<_Tp>(__x._M_slice.size()) { typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Is_Trivial; _M_initialize(_Is_Trivial()); *this = __x;}template <class _Tp>inline slice_array<_Tp> valarray<_Tp>::operator[](slice __slice){ return slice_array<_Tp>(__slice, *this); }//----------------------------------------------------------------------// gslice and gslice_arraytemplate <class _Size>struct _Gslice_Iter_tmpl;class gslice { friend struct _Gslice_Iter_tmpl<size_t>;public: gslice() : _M_start(0), _M_lengths(), _M_strides() {} gslice(size_t __start, const _Valarray_size_t& __lengths, const _Valarray_size_t& __strides) : _M_start(__start), _M_lengths(__lengths), _M_strides(__strides) {} __TRIVIAL_DESTRUCTOR(gslice) size_t start() const { return _M_start; } _Valarray_size_t size() const { return _M_lengths; } _Valarray_size_t stride() const { return _M_strides; } // 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; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?