valarray_array.h

来自「ARM Linux Tool 各种代码包括MTD」· C头文件 代码 · 共 578 行 · 第 1/2 页

H
578
字号
  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)  { __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)  { __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)  { __valarray_fill (__a._M_data, __i._M_data, __n, __t); }  template<typename _Tp>  inline void  __valarray_copy (_Array<_Tp> __a, size_t __n, _Array<_Tp> __b)  { __valarray_copy (__a._M_data, __n, __b._M_data); }    template<typename _Tp>  inline void  __valarray_copy (_Array<_Tp> __a, size_t __n, size_t __s, _Array<_Tp> __b)  { __valarray_copy(__a._M_data, __n, __s, __b._M_data); }    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); }    template<typename _Tp>  inline void  __valarray_copy (_Array<_Tp> __a, _Array<size_t> __i,                    _Array<_Tp> __b, size_t __n)  { __valarray_copy (__a._M_data, __i._M_data, __b._M_data, __n); }    template<typename _Tp>  inline void  __valarray_copy (_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,                    _Array<size_t> __i)  { __valarray_copy (__a._M_data, __n, __b._M_data, __i._M_data); }  template<typename _Tp>  inline  _Array<_Tp>::_Array (size_t __n)    : _M_data(__valarray_get_storage<_Tp>(__n))  { __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))  { __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(^, xor)_DEFINE_ARRAY_FUNCTION(|, or)_DEFINE_ARRAY_FUNCTION(&, and)    _DEFINE_ARRAY_FUNCTION(<<, shift_left)_DEFINE_ARRAY_FUNCTION(>>, shift_right)#undef _DEFINE_VALARRAY_FUNCTION    } // std::#ifdef _GLIBCPP_NO_TEMPLATE_EXPORT# define export # include <bits/valarray_array.tcc>    #endif           #endif /* _CPP_BITS_ARRAY_H */// Local Variables:// mode:c++// End:

⌨️ 快捷键说明

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