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

📄 valarray_array.h

📁 mingw32.rar
💻 H
📖 第 1 页 / 共 2 页
字号:
       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 + -