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

📄 valarray_array.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 2 页
字号:
	__dst[*__j++] = __src[*__i++];    }  //  // Compute the sum of elements in range [__f, __l)  // This is a naive algorithm.  It suffers from cancelling.  // In the future try to specialize  // for _Tp = float, double, long double using a more accurate  // algorithm.  //  template<typename _Tp>    inline _Tp    __valarray_sum(const _Tp* __restrict__ __f, const _Tp* __restrict__ __l)    {      _Tp __r = _Tp();      while (__f != __l)	__r += *__f++;      return __r;    }  // Compute the product of all elements in range [__f, __l)  template<typename _Tp>    inline _Tp    __valarray_product(const _Tp* __restrict__ __f,		       const _Tp* __restrict__ __l)    {      _Tp __r = _Tp(1);      while (__f != __l)	__r = __r * *__f++;      return __r;    }  // Compute the min/max of an array-expression  template<typename _Ta>    inline typename _Ta::value_type    __valarray_min(const _Ta& __a)    {      size_t __s = __a.size();      typedef typename _Ta::value_type _Value_type;      _Value_type __r = __s == 0 ? _Value_type() : __a[0];      for (size_t __i = 1; __i < __s; ++__i)	{	  _Value_type __t = __a[__i];	  if (__t < __r)	    __r = __t;	}      return __r;    }  template<typename _Ta>    inline typename _Ta::value_type    __valarray_max(const _Ta& __a)    {      size_t __s = __a.size();      typedef typename _Ta::value_type _Value_type;      _Value_type __r = __s == 0 ? _Value_type() : __a[0];      for (size_t __i = 1; __i < __s; ++__i)	{	  _Value_type __t = __a[__i];	  if (__t > __r)	    __r = __t;	}      return __r;    }  //  // Helper class _Array, first layer of valarray abstraction.  // All operations on valarray should be forwarded to this class  // whenever possible. -- gdr  //  template<typename _Tp>    struct _Array    {      explicit _Array(size_t);      explicit _Array(_Tp* const __restrict__);      explicit _Array(const valarray<_Tp>&);      _Array(const _Tp* __restrict__, size_t);            _Tp* begin() const;            _Tp* const __restrict__ _M_data;    };  template<typename _Tp>    inline void    __valarray_fill (_Array<_Tp> __a, size_t __n, const _Tp& __t)    { std::__valarray_fill(__a._M_data, __n, __t); }  template<typename _Tp>    inline void    __valarray_fill(_Array<_Tp> __a, size_t __n, size_t __s, const _Tp& __t)    { std::__valarray_fill(__a._M_data, __n, __s, __t); }  template<typename _Tp>    inline void    __valarray_fill(_Array<_Tp> __a, _Array<size_t> __i,		    size_t __n, const _Tp& __t)    { std::__valarray_fill(__a._M_data, __i._M_data, __n, __t); }  // Copy a plain array __a[<__n>] into a play array __b[<>]  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b)    { std::__valarray_copy(__a._M_data, __n, __b._M_data); }  // Copy strided array __a[<__n : __s>] in plain __b[<__n>]  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __a, size_t __n, size_t __s, _Array<_Tp> __b)    { std::__valarray_copy(__a._M_data, __n, __s, __b._M_data); }  // Copy a plain array  __a[<__n>] into a strided array __b[<__n : __s>]  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __a, _Array<_Tp> __b, size_t __n, size_t __s)    { __valarray_copy(__a._M_data, __b._M_data, __n, __s); }  // Copy strided array __src[<__n : __s1>] into another  // strided array __dst[< : __s2>].  Their sizes must match.  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __a, size_t __n, size_t __s1,                    _Array<_Tp> __b, size_t __s2)    { std::__valarray_copy(__a._M_data, __n, __s1, __b._M_data, __s2); }  // Copy an indexed array __a[__i[<__n>]] in plain array __b[<__n>]  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __a, _Array<size_t> __i,		    _Array<_Tp> __b, size_t __n)    { std::__valarray_copy(__a._M_data, __i._M_data, __b._M_data, __n); }  // Copy a plain array __a[<__n>] in an indexed array __b[__i[<__n>]]  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,		    _Array<size_t> __i)    { std::__valarray_copy(__a._M_data, __n, __b._M_data, __i._M_data); }  // Copy the __n first elements of an indexed array __src[<__i>] into  // another indexed array __dst[<__j>].  template<typename _Tp>    inline void    __valarray_copy(_Array<_Tp> __src, size_t __n, _Array<size_t> __i,                    _Array<_Tp> __dst, _Array<size_t> __j)    {      std::__valarray_copy(__src._M_data, __n, __i._M_data,		    __dst._M_data, __j._M_data);    }  template<typename _Tp>    inline    _Array<_Tp>::_Array(size_t __n)    : _M_data(__valarray_get_storage<_Tp>(__n))    { std::__valarray_default_construct(_M_data, _M_data + __n); }  template<typename _Tp>    inline    _Array<_Tp>::_Array(_Tp* const __restrict__ __p)    : _M_data (__p) {}  template<typename _Tp>    inline    _Array<_Tp>::_Array(const valarray<_Tp>& __v)    : _M_data (__v._M_data) {}  template<typename _Tp>    inline    _Array<_Tp>::_Array(const _Tp* __restrict__ __b, size_t __s)    : _M_data(__valarray_get_storage<_Tp>(__s))    { std::__valarray_copy_construct(__b, __s, _M_data); }  template<typename _Tp>    inline _Tp*    _Array<_Tp>::begin () const    { return _M_data; }#define _DEFINE_ARRAY_FUNCTION(_Op, _Name)				\  template<typename _Tp>		        			\    inline void								\    _Array_augmented_##_Name(_Array<_Tp> __a, size_t __n, const _Tp& __t) \    {									\      for (_Tp* __p = __a._M_data; __p < __a._M_data + __n; ++__p)	\        *__p _Op##= __t;						\    }									\									\  template<typename _Tp>						\    inline void								\    _Array_augmented_##_Name(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b) \    {									\      _Tp* __p = __a._M_data;						\      for (_Tp* __q = __b._M_data; __q < __b._M_data + __n; ++__p, ++__q) \        *__p _Op##= *__q;						\    }									\									\  template<typename _Tp, class _Dom>					\    void								\    _Array_augmented_##_Name(_Array<_Tp> __a,	        		\                             const _Expr<_Dom, _Tp>& __e, size_t __n)	\    {									\      _Tp* __p(__a._M_data);						\      for (size_t __i = 0; __i < __n; ++__i, ++__p)                     \        *__p _Op##= __e[__i];                                          	\    }									\									\  template<typename _Tp>						\    inline void								\    _Array_augmented_##_Name(_Array<_Tp> __a, size_t __n, size_t __s,	\	                     _Array<_Tp> __b)				\    {									\      _Tp* __q(__b._M_data);						\      for (_Tp* __p = __a._M_data; __p < __a._M_data + __s * __n;       \	   __p += __s, ++__q)                                           \        *__p _Op##= *__q;						\    }									\									\  template<typename _Tp>						\    inline void								\    _Array_augmented_##_Name(_Array<_Tp> __a, _Array<_Tp> __b,		\		             size_t __n, size_t __s)			\    {									\      _Tp* __q(__b._M_data);						\      for (_Tp* __p = __a._M_data; __p < __a._M_data + __n;             \	   ++__p, __q += __s)                                           \        *__p _Op##= *__q;						\    }									\									\  template<typename _Tp, class _Dom>					\    void								\    _Array_augmented_##_Name(_Array<_Tp> __a, size_t __s,		\                             const _Expr<_Dom, _Tp>& __e, size_t __n)	\    {									\      _Tp* __p(__a._M_data);						\      for (size_t __i = 0; __i < __n; ++__i, __p += __s)                \        *__p _Op##= __e[__i];                                          	\    }									\									\  template<typename _Tp>						\    inline void								\    _Array_augmented_##_Name(_Array<_Tp> __a, _Array<size_t> __i,	\                             _Array<_Tp> __b, size_t __n)		\    {									\      _Tp* __q(__b._M_data);						\      for (size_t* __j = __i._M_data; __j < __i._M_data + __n;          \           ++__j, ++__q)                                                \        __a._M_data[*__j] _Op##= *__q;					\    }									\									\  template<typename _Tp>						\    inline void					        		\    _Array_augmented_##_Name(_Array<_Tp> __a, size_t __n,		\                             _Array<_Tp> __b, _Array<size_t> __i)	\    {									\      _Tp* __p(__a._M_data);						\      for (size_t* __j = __i._M_data; __j<__i._M_data + __n;            \	   ++__j, ++__p)                                                \        *__p _Op##= __b._M_data[*__j];					\    }									\									\  template<typename _Tp, class _Dom>					\    void								\    _Array_augmented_##_Name(_Array<_Tp> __a, _Array<size_t> __i,	\                             const _Expr<_Dom, _Tp>& __e, size_t __n)	\    {									\      size_t* __j(__i._M_data);	        				\      for (size_t __k = 0; __k<__n; ++__k, ++__j)			\        __a._M_data[*__j] _Op##= __e[__k];				\    }									\									\  template<typename _Tp>						\    void								\    _Array_augmented_##_Name(_Array<_Tp> __a, _Array<bool> __m,         \                             _Array<_Tp> __b, size_t __n)		\    {									\      bool* __ok(__m._M_data);						\      _Tp* __p(__a._M_data);						\      for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;             \	   ++__q, ++__ok, ++__p)                                        \        {                                                               \          while (! *__ok)                                               \            {						        	\              ++__ok;							\              ++__p;							\            }								\          *__p _Op##= *__q;						\        }								\    }									\									\  template<typename _Tp>						\    void								\    _Array_augmented_##_Name(_Array<_Tp> __a, size_t __n,		\                             _Array<_Tp> __b, _Array<bool> __m)   	\    {									\      bool* __ok(__m._M_data);						\      _Tp* __q(__b._M_data);						\      for (_Tp* __p = __a._M_data; __p < __a._M_data + __n;             \	   ++__p, ++__ok, ++__q)                                        \        {                                                               \          while (! *__ok)                                               \            {					        		\              ++__ok;							\              ++__q;							\            }								\          *__p _Op##= *__q;						\        }								\    }									\									\  template<typename _Tp, class _Dom>					\    void								\    _Array_augmented_##_Name(_Array<_Tp> __a, _Array<bool> __m,  	\                             const _Expr<_Dom, _Tp>& __e, size_t __n)	\    {									\      bool* __ok(__m._M_data);						\      _Tp* __p(__a._M_data);						\      for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p)             \        {	                                           		\          while (! *__ok)                                               \            {		         					\	      ++__ok;							\              ++__p;							\            }								\          *__p _Op##= __e[__i];						\        }								\    }   _DEFINE_ARRAY_FUNCTION(+, __plus)   _DEFINE_ARRAY_FUNCTION(-, __minus)   _DEFINE_ARRAY_FUNCTION(*, __multiplies)   _DEFINE_ARRAY_FUNCTION(/, __divides)   _DEFINE_ARRAY_FUNCTION(%, __modulus)   _DEFINE_ARRAY_FUNCTION(^, __bitwise_xor)   _DEFINE_ARRAY_FUNCTION(|, __bitwise_or)   _DEFINE_ARRAY_FUNCTION(&, __bitwise_and)   _DEFINE_ARRAY_FUNCTION(<<, __shift_left)   _DEFINE_ARRAY_FUNCTION(>>, __shift_right)#undef _DEFINE_VALARRAY_FUNCTION} // namespace std#ifndef _GLIBCXX_EXPORT_TEMPLATE# include <bits/valarray_array.tcc>#endif#endif /* _ARRAY_H */

⌨️ 快捷键说明

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