williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: #ifndef _STLP_VALARRAY_H williamr@2: #define _STLP_VALARRAY_H williamr@2: williamr@2: #ifndef _STLP_CMATH_H_HEADER williamr@2: #include williamr@2: #endif williamr@2: #ifndef _STLP_INTERNAL_NEW_HEADER williamr@2: #include williamr@2: #endif williamr@2: #ifndef _STLP_INTERNAL_ALGO_H williamr@2: #include williamr@2: #endif williamr@2: #ifndef _STLP_INTERNAL_NUMERIC_H williamr@2: #include williamr@2: #endif williamr@2: #ifndef _STLP_LIMITS_H williamr@2: #include williamr@2: #endif williamr@2: williamr@2: //To resolve the unidentified identifier __THROW_BAD_ALLOC williamr@2: #include williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: class slice; williamr@2: class gslice; williamr@2: williamr@2: template class valarray; williamr@2: typedef valarray _Valarray_bool; williamr@2: typedef valarray _Valarray_size_t; williamr@2: williamr@2: template class slice_array; williamr@2: template class gslice_array; williamr@2: template class mask_array; williamr@2: template class indirect_array; williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // class valarray williamr@2: williamr@2: // Base class to handle memory allocation and deallocation. We can't just williamr@2: // use vector<>, because vector would be unsuitable as an internal williamr@2: // representation for valarray. williamr@2: williamr@2: template williamr@2: struct _Valarray_base williamr@2: { williamr@2: _Tp* _M_first; williamr@2: size_t _M_size; williamr@2: williamr@2: _Valarray_base() : _M_first(0), _M_size(0) {} williamr@2: _Valarray_base(size_t __n) : _M_first(0), _M_size(0) { _M_allocate(__n); } williamr@2: ~_Valarray_base() { _M_deallocate(); } williamr@2: williamr@2: void _M_allocate(size_t __n) { williamr@2: if (__n != 0) { williamr@2: #ifdef __SYMBIAN32__ williamr@2: _M_first = ::new _Tp[__n]; williamr@2: #else williamr@2: _M_first = __STATIC_CAST(_Tp*, (malloc(__n * sizeof(_Tp)))); williamr@2: #endif williamr@2: _M_size = __n; williamr@2: if (_M_first == 0) { williamr@2: _M_size = 0; williamr@2: __THROW_BAD_ALLOC; williamr@2: } williamr@2: } williamr@2: else { williamr@2: _M_first = 0; williamr@2: _M_size = 0; williamr@2: } williamr@2: } williamr@2: williamr@2: void _M_deallocate() { williamr@2: #ifdef __SYMBIAN32__ williamr@2: delete [] _M_first; williamr@2: #else williamr@2: free(_M_first); williamr@2: #endif williamr@2: _M_first = 0; williamr@2: _M_size = 0; williamr@2: } williamr@2: }; williamr@2: williamr@2: template williamr@2: class valarray : private _Valarray_base<_Tp> williamr@2: { williamr@2: friend class gslice; williamr@2: williamr@2: public: williamr@2: typedef _Tp value_type; williamr@2: williamr@2: // Basic constructors williamr@2: valarray() : _Valarray_base<_Tp>() {} williamr@2: valarray(size_t __n) : _Valarray_base<_Tp>(__n) {} williamr@2: valarray(const value_type& __x, size_t __n) : _Valarray_base<_Tp>(__n) williamr@2: { uninitialized_fill_n(this->_M_first, this->_M_size, __x); } williamr@2: valarray(const value_type* __p, size_t __n) : _Valarray_base<_Tp>(__n) williamr@2: { uninitialized_copy(__p, __p + __n, this->_M_first); } williamr@2: valarray(const valarray<_Tp>& __x) : _Valarray_base<_Tp>(__x._M_size) { williamr@2: uninitialized_copy(__x._M_first, __x._M_first + __x._M_size, williamr@2: this->_M_first); williamr@2: } williamr@2: williamr@2: // Constructors from auxiliary array types williamr@2: valarray(const slice_array<_Tp>&); williamr@2: valarray(const gslice_array<_Tp>&); williamr@2: valarray(const mask_array<_Tp>&); williamr@2: valarray(const indirect_array<_Tp>&); williamr@2: williamr@2: // Destructor williamr@2: ~valarray() { _STLP_STD::_Destroy(this->_M_first, this->_M_first + this->_M_size); } williamr@2: williamr@2: // Extension: constructor that doesn't initialize valarray elements to a williamr@2: // specific value. This is faster for types such as int and double. williamr@2: private: williamr@2: void _M_initialize(const __true_type&) {} williamr@2: void _M_initialize(const __false_type&) williamr@2: { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); } williamr@2: williamr@2: public: williamr@2: struct _NoInit {}; williamr@2: valarray(size_t __n, _NoInit) : _Valarray_base<_Tp>(__n) { williamr@2: typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Is_Trivial; williamr@2: _M_initialize(_Is_Trivial()); williamr@2: } williamr@2: williamr@2: public: // Assignment williamr@2: // Basic assignment. Note that 'x = y' is undefined if x.size() != y.size() williamr@2: valarray<_Tp>& operator=(const valarray<_Tp>& __x) { williamr@2: _STLP_ASSERT(__x.size() == this->size()) williamr@2: if (this != &__x) williamr@2: { williamr@2: #ifdef __SYMBIAN32__ williamr@2: resize(__x._M_size); williamr@2: #endif williamr@2: copy(__x._M_first, __x._M_first + __x._M_size, this->_M_first); williamr@2: } williamr@2: return *this; williamr@2: } williamr@2: williamr@2: // Scalar assignment williamr@2: valarray<_Tp>& operator=(const value_type& __x) { williamr@2: fill_n(this->_M_first, this->_M_size, __x); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: // Assignment of auxiliary array types williamr@2: valarray<_Tp>& operator=(const slice_array<_Tp>&); williamr@2: valarray<_Tp>& operator=(const gslice_array<_Tp>&); williamr@2: valarray<_Tp>& operator=(const mask_array<_Tp>&); williamr@2: valarray<_Tp>& operator=(const indirect_array<_Tp>&); williamr@2: williamr@2: public: // Element access williamr@2: value_type operator[](size_t __n) const { return this->_M_first[__n]; } williamr@2: value_type& operator[](size_t __n) { return this->_M_first[__n]; } williamr@2: size_t size() const { return this->_M_size; } williamr@2: williamr@2: public: // Subsetting operations with auxiliary type williamr@2: valarray<_Tp> operator[](slice) const; williamr@2: slice_array<_Tp> operator[](slice); williamr@2: valarray<_Tp> operator[](gslice) const; williamr@2: gslice_array<_Tp> operator[](const gslice&); williamr@2: valarray<_Tp> operator[](const _Valarray_bool&) const; williamr@2: mask_array<_Tp> operator[](const _Valarray_bool&); williamr@2: valarray<_Tp> operator[](const _Valarray_size_t&) const; williamr@2: indirect_array<_Tp> operator[](const _Valarray_size_t&); williamr@2: williamr@2: public: // Unary operators. williamr@2: valarray<_Tp> operator+() const { return *this; } williamr@2: williamr@2: valarray<_Tp> operator-() const { williamr@2: valarray<_Tp> __tmp(this->size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: __tmp[__i] = -(*this)[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: valarray<_Tp> operator~() const { williamr@2: valarray<_Tp> __tmp(this->size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: __tmp[__i] = ~(*this)[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: _Valarray_bool operator!() const; williamr@2: williamr@2: public: // Scalar computed assignment. williamr@2: valarray<_Tp>& operator*= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] *= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator/= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] /= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator%= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] %= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator+= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] += __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator-= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] -= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator^= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] ^= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator&= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] &= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator|= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] |= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator<<= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] <<= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator>>= (const value_type& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] >>= __x; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: public: // Array computed assignment. williamr@2: valarray<_Tp>& operator*= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] *= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator/= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] /= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator%= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] %= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator+= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] += __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator-= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] -= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator^= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] ^= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator&= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] &= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator|= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] |= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator<<= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] <<= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: valarray<_Tp>& operator>>= (const valarray<_Tp>& __x) { williamr@2: for (size_t __i = 0; __i < this->size(); ++__i) williamr@2: (*this)[__i] >>= __x[__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: public: // Other member functions. williamr@2: williamr@2: // The result is undefined for zero-length arrays williamr@2: value_type sum() const { williamr@2: return accumulate(this->_M_first + 1, this->_M_first + this->_M_size, williamr@2: (*this)[0]); williamr@2: } williamr@2: williamr@2: // The result is undefined for zero-length arrays williamr@2: value_type (min) () const { williamr@2: return *min_element(this->_M_first + 0, this->_M_first + this->_M_size); williamr@2: } williamr@2: williamr@2: value_type (max) () const { williamr@2: return *max_element(this->_M_first + 0, this->_M_first + this->_M_size); williamr@2: } williamr@2: williamr@2: valarray<_Tp> shift(int __n) const; williamr@2: valarray<_Tp> cshift(int __n) const; williamr@2: williamr@2: valarray<_Tp> apply(value_type __f(value_type)) const { williamr@2: valarray<_Tp> __tmp(this->size()); williamr@2: transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first, williamr@2: __f); williamr@2: return __tmp; williamr@2: } williamr@2: valarray<_Tp> apply(value_type __f(const value_type&)) const { williamr@2: valarray<_Tp> __tmp(this->size()); williamr@2: transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first, williamr@2: __f); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: void resize(size_t __n, value_type __x = value_type()) { williamr@2: _STLP_STD::_Destroy(this->_M_first, this->_M_first + this->_M_size); williamr@2: this->_Valarray_base<_Tp>::_M_deallocate(); williamr@2: this->_Valarray_base<_Tp>::_M_allocate(__n); williamr@2: uninitialized_fill_n(this->_M_first, this->_M_size, __x); williamr@2: } williamr@2: }; williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // valarray non-member functions. williamr@2: williamr@2: // Binary arithmetic operations between two arrays. Behavior is williamr@2: // undefined if the two arrays do not have the same length. williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator*(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] * __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator/(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] / __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator%(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] % __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator+(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] + __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator-(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] - __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] ^ __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] & __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] | __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] << __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] >> __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: // Binary arithmetic operations between an array and a scalar. williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator*(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] * __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator*(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c * __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator/(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] / __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator/(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c / __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator%(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] % __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator%(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c % __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator+(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] + __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator+(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c + __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator-(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] - __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator-(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c - __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] ^ __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator^(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c ^ __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] & __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator&(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c & __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] | __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator|(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c | __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] << __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator<<(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c << __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] >> __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> _STLP_CALL operator>>(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c >> __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: // Binary logical operations between two arrays. Behavior is undefined williamr@2: // if the two arrays have different lengths. Note that operator== does williamr@2: // not do what you might at first expect. williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] == __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] < __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: #ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] != __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] > __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] <= __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] >= __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: #endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */ williamr@2: // fbp : swap ? williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] && __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] || __y[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: // Logical operations between an array and a scalar. williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] == __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator==(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c == __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] != __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator!=(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c != __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] < __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator<(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c < __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] > __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator>(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c > __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] <= __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator<=(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c <= __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] >= __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator>=(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c >= __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] && __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator&&(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c && __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x, const _Tp& __c) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __x[__i] || __c; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline _Valarray_bool _STLP_CALL operator||(const _Tp& __c, const valarray<_Tp>& __x) williamr@2: { williamr@2: _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = __c || __x[__i]; williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: // valarray "transcendentals" (the list includes abs and sqrt, which, williamr@2: // of course, are not transcendental). williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> abs(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ABS(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> acos(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ACOS(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> asin(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ASIN(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> atan(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ATAN(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> atan2(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__x[__i], __y[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__x[__i], __c); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> atan2(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__c, __x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> cos(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_COS(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> cosh(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_COSH(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> exp(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_EXP(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> log(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_LOG(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> log10(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_LOG10(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> pow(const valarray<_Tp>& __x, williamr@2: const valarray<_Tp>& __y) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_POW(_Tp)(__x[__i], __y[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> pow(const valarray<_Tp>& __x, const _Tp& __c) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_POW(_Tp)(__x[__i], __c); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> pow(const _Tp& __c, const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_POW(_Tp)(__c, __x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> sin(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_SIN(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> sinh(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_SINH(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> sqrt(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_SQRT(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> tan(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_TAN(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: template williamr@2: inline valarray<_Tp> tanh(const valarray<_Tp>& __x) { williamr@2: typedef typename valarray<_Tp>::_NoInit _NoInit; williamr@2: valarray<_Tp> __tmp(__x.size(), _NoInit()); williamr@2: for (size_t __i = 0; __i < __x.size(); ++__i) williamr@2: __tmp[__i] = _STLP_DO_TANH(_Tp)(__x[__i]); williamr@2: return __tmp; williamr@2: } williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // slice and slice_array williamr@2: williamr@2: class slice { williamr@2: public: williamr@2: slice() : _M_start(0), _M_length(0), _M_stride(0) {} williamr@2: slice(size_t __start, size_t __length, size_t __stride) williamr@2: : _M_start(__start), _M_length(__length), _M_stride(__stride) williamr@2: {} williamr@2: __TRIVIAL_DESTRUCTOR(slice) williamr@2: williamr@2: size_t start() const { return _M_start; } williamr@2: size_t size() const { return _M_length; } williamr@2: size_t stride() const { return _M_stride; } williamr@2: williamr@2: williamr@2: private: williamr@2: size_t _M_start; williamr@2: size_t _M_length; williamr@2: size_t _M_stride; williamr@2: }; williamr@2: williamr@2: template williamr@2: class slice_array { williamr@2: friend class valarray<_Tp>; williamr@2: public: williamr@2: typedef _Tp value_type; williamr@2: williamr@2: void operator=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] = __x[__i]; williamr@2: #else williamr@2: _M_array[__index] = __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator*=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] *= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] *= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator/=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] /= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] /= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator%=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] %= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] %= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator+=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] += __x[__i]; williamr@2: #else williamr@2: _M_array[__index] += __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator-=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] -= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] -= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator^=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] ^= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] ^= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator&=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] &= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] &= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator|=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] |= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] |= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator<<=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] <<= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] <<= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator>>=(const valarray& __x) const { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] >>= __x[__i]; williamr@2: #else williamr@2: _M_array[__index] >>= __x[__i]; williamr@2: #endif williamr@2: } williamr@2: williamr@2: void operator=(const value_type& __c) { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = 0; williamr@2: __i < _M_slice.size(); williamr@2: ++__i, __index += _M_slice.stride()) williamr@2: #ifdef __SYMBIAN32__ williamr@2: (*_M_array)[__index] = __c; williamr@2: #else williamr@2: _M_array[__index] = __c; williamr@2: #endif williamr@2: } williamr@2: williamr@2: slice_array<_Tp>& williamr@2: operator=(const slice_array<_Tp>& __a) williamr@2: { williamr@2: size_t __index = _M_slice.start(); williamr@2: for (size_t __i = __a._M_slice.start(); williamr@2: __i < _M_slice.size(); williamr@2: __i += __a._M_slice.stride(), __index += _M_slice.stride()) williamr@2: _M_array[__index] = __a._M_array[__index][__i]; williamr@2: return *this; williamr@2: } williamr@2: williamr@2: slice_array(const slice_array<_Tp>& a) williamr@2: : _M_slice(a._M_slice), _M_array(a._M_array){} williamr@2: williamr@2: ~slice_array() {} williamr@2: williamr@2: private: williamr@2: slice_array(const slice& __slice, valarray<_Tp>* __array) williamr@2: : _M_slice(__slice), _M_array(__array) williamr@2: {} williamr@2: williamr@2: slice _M_slice; williamr@2: valarray<_Tp>* _M_array; williamr@2: williamr@2: private: // Disable assignment and default constructor williamr@2: slice_array(); williamr@2: }; williamr@2: williamr@2: // valarray member functions dealing with slice and slice_array williamr@2: williamr@2: template williamr@2: inline valarray<_Tp>::valarray(const slice_array<_Tp>& __x) williamr@2: : _Valarray_base<_Tp>(__x._M_slice.size()) williamr@2: { williamr@2: typedef typename __type_traits<_Tp>::has_trivial_default_constructor williamr@2: _Is_Trivial; williamr@2: _M_initialize(_Is_Trivial()); williamr@2: *this = __x; williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: inline slice_array<_Tp> valarray<_Tp>::operator[](slice __slice) { williamr@2: return slice_array<_Tp>(__slice, this); williamr@2: } williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // gslice and gslice_array williamr@2: williamr@2: template williamr@2: struct _Gslice_Iter_tmpl; williamr@2: williamr@2: class gslice { williamr@2: friend struct _Gslice_Iter_tmpl; williamr@2: public: williamr@2: gslice() : _M_start(0), _M_lengths(0), _M_strides(0) {} williamr@2: gslice(size_t __start, williamr@2: const _Valarray_size_t& __lengths, const _Valarray_size_t& __strides) williamr@2: : _M_start(__start), _M_lengths(__lengths), _M_strides(__strides) williamr@2: {} williamr@2: __TRIVIAL_DESTRUCTOR(gslice) williamr@2: williamr@2: size_t start() const { return _M_start; } williamr@2: _Valarray_size_t size() const { return _M_lengths; } williamr@2: _Valarray_size_t stride() const { return _M_strides; } williamr@2: williamr@2: // Extension: check for an empty gslice. williamr@2: bool _M_empty() const { return _M_lengths.size() == 0; } williamr@2: williamr@2: // Extension: number of indices this gslice represents. (For a degenerate williamr@2: // gslice, they're not necessarily all distinct.) williamr@2: size_t _M_size() const { williamr@2: return !this->_M_empty() williamr@2: ? accumulate(_M_lengths._M_first + 1, williamr@2: _M_lengths._M_first + _M_lengths._M_size, williamr@2: _M_lengths[0], williamr@2: multiplies()) williamr@2: : 0; williamr@2: } williamr@2: williamr@2: # ifndef __HP_aCC williamr@2: private: williamr@2: # endif williamr@2: williamr@2: size_t _M_start; williamr@2: _Valarray_size_t _M_lengths; williamr@2: _Valarray_size_t _M_strides; williamr@2: }; williamr@2: williamr@2: // This is not an STL iterator. It is constructed from a gslice, and it williamr@2: // steps through the gslice indices in sequence. See 23.3.6 of the C++ williamr@2: // standard, paragraphs 2-3, for an explanation of the sequence. At williamr@2: // each step we get two things: the ordinal (i.e. number of steps taken), williamr@2: // and the one-dimensional index. williamr@2: williamr@2: template williamr@2: struct _Gslice_Iter_tmpl { williamr@2: _Gslice_Iter_tmpl(const gslice& __gslice) williamr@2: : _M_step(0), _M_1d_idx(__gslice.start()), williamr@2: _M_indices(size_t(0), __gslice._M_lengths.size()), williamr@2: _M_gslice(__gslice) williamr@2: {} williamr@2: williamr@2: bool _M_done() const { return _M_indices[0] == _M_gslice._M_lengths[0]; } williamr@2: williamr@2: bool _M_incr(); williamr@2: williamr@2: _Size _M_step; williamr@2: _Size _M_1d_idx; williamr@2: williamr@2: valarray<_Size> _M_indices; williamr@2: const gslice& _M_gslice; williamr@2: }; williamr@2: williamr@2: typedef _Gslice_Iter_tmpl _Gslice_Iter; williamr@2: williamr@2: template williamr@2: class gslice_array { williamr@2: friend class valarray<_Tp>; williamr@2: public: williamr@2: typedef _Tp value_type; williamr@2: williamr@2: void operator= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] = __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator*= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] *= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator/= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] /= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator%= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] %= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator+= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] += __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator-= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] -= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator^= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] ^= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator&= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] &= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator|= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] |= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator<<= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] <<= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator>>= (const valarray& __x) const { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] >>= __x[__i._M_step]; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: void operator= (const value_type& __c) { williamr@2: if (!_M_gslice._M_empty()) { williamr@2: _Gslice_Iter __i(_M_gslice); williamr@2: do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr()); williamr@2: } williamr@2: } williamr@2: williamr@2: ~gslice_array() {} williamr@2: williamr@2: private: williamr@2: gslice_array(gslice __gslice, valarray<_Tp>& __array) williamr@2: : _M_gslice(__gslice), _M_array(__array) williamr@2: {} williamr@2: williamr@2: gslice _M_gslice; williamr@2: valarray& _M_array; williamr@2: williamr@2: private: // Disable assignment williamr@2: void operator=(const gslice_array<_Tp>&); williamr@2: }; williamr@2: williamr@2: // valarray member functions dealing with gslice and gslice_array. Note williamr@2: // that it is illegal (behavior is undefined) to construct a gslice_array williamr@2: // from a degenerate gslice. williamr@2: williamr@2: template williamr@2: inline valarray<_Tp>::valarray(const gslice_array<_Tp>& __x) williamr@2: : _Valarray_base<_Tp>(__x._M_gslice._M_size()) williamr@2: { williamr@2: typedef typename __type_traits<_Tp>::has_trivial_default_constructor williamr@2: _Is_Trivial; williamr@2: _M_initialize(_Is_Trivial()); williamr@2: *this = __x; williamr@2: } williamr@2: williamr@2: template williamr@2: inline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __slice) { williamr@2: return gslice_array<_Tp>(__slice, *this); williamr@2: } williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // mask_array williamr@2: williamr@2: template williamr@2: class mask_array { williamr@2: friend class valarray<_Tp>; williamr@2: public: williamr@2: typedef _Tp value_type; williamr@2: williamr@2: void operator=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] = __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator*=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] *= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator/=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif //__SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] /= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator%=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif williamr@2: if (_M_mask[__i]) _M_array[__i] %= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator+=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif williamr@2: if (_M_mask[__i]) _M_array[__i] += __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator-=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif //__SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] -= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator^=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] ^= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator&=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] &= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator|=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] |= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator<<=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] <<= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator>>=(const valarray& __x) const { williamr@2: size_t __idx = 0; williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] >>= __x[__idx++]; williamr@2: } williamr@2: williamr@2: void operator=(const value_type& __c) const { williamr@2: #ifdef __SYMBIAN32__ williamr@2: for (size_t __i = 0; __i < _M_array.size() && __i < _M_mask.size(); ++__i) williamr@2: #else williamr@2: for (size_t __i = 0; __i < _M_array.size(); ++__i) williamr@2: #endif // __SYMBIAN32__ williamr@2: if (_M_mask[__i]) _M_array[__i] = __c; williamr@2: } williamr@2: williamr@2: ~mask_array() {} williamr@2: williamr@2: // Extension: number of true values in the mask williamr@2: size_t _M_num_true() const { williamr@2: size_t __result = 0; williamr@2: for (size_t __i = 0; __i < _M_mask.size(); ++__i) williamr@2: if (_M_mask[__i]) ++__result; williamr@2: return __result; williamr@2: } williamr@2: williamr@2: private: williamr@2: mask_array(const _Valarray_bool& __mask, valarray<_Tp>& __array) williamr@2: : _M_mask(__mask), _M_array(__array) williamr@2: {} williamr@2: williamr@2: _Valarray_bool _M_mask; williamr@2: valarray<_Tp>& _M_array; williamr@2: williamr@2: private: // Disable assignment williamr@2: void operator=(const mask_array<_Tp>&); williamr@2: }; williamr@2: williamr@2: // valarray member functions dealing with mask_array williamr@2: williamr@2: template williamr@2: inline valarray<_Tp>::valarray(const mask_array<_Tp>& __x) williamr@2: : _Valarray_base<_Tp>(__x._M_num_true()) williamr@2: { williamr@2: typedef typename __type_traits<_Tp>::has_trivial_default_constructor williamr@2: _Is_Trivial; williamr@2: _M_initialize(_Is_Trivial()); williamr@2: *this = __x; williamr@2: } williamr@2: williamr@2: // Behavior is undefined if __x._M_num_true() != this->size() williamr@2: template williamr@2: inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<_Tp>& __x) { williamr@2: size_t __idx = 0; williamr@2: for (size_t __i = 0; __i < __x._M_array.size(); ++__i) williamr@2: if (__x._M_mask[__i]) williamr@2: { williamr@2: #ifdef __SYMBIAN32__ williamr@2: if(__idx < this->_M_size) williamr@2: (*this)[__idx++] = __x._M_array[__i]; williamr@2: else williamr@2: break; williamr@2: #else williamr@2: (*this)[__idx++] = __x._M_array[__i]; williamr@2: #endif williamr@2: } williamr@2: return *this; williamr@2: } williamr@2: williamr@2: template williamr@2: inline mask_array<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask) williamr@2: { williamr@2: return mask_array<_Tp>(__mask, *this); williamr@2: } williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // indirect_array williamr@2: williamr@2: template williamr@2: class indirect_array { williamr@2: friend class valarray<_Tp>; williamr@2: public: williamr@2: typedef _Tp value_type; williamr@2: williamr@2: void operator=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] = __x[__i]; williamr@2: } williamr@2: williamr@2: void operator*=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] *= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator/=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] /= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator%=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] %= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator+=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] += __x[__i]; williamr@2: } williamr@2: williamr@2: void operator-=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] -= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator^=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] ^= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator&=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] &= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator|=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] |= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator<<=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] <<= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator>>=(const valarray& __x) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] >>= __x[__i]; williamr@2: } williamr@2: williamr@2: void operator=(const value_type& __c) const { williamr@2: for (size_t __i = 0; __i < _M_addr.size(); ++__i) williamr@2: _M_array[_M_addr[__i]] = __c; williamr@2: } williamr@2: williamr@2: ~indirect_array() {} williamr@2: williamr@2: private: williamr@2: indirect_array(const _Valarray_size_t& __addr, valarray<_Tp>& __array) williamr@2: : _M_addr(__addr), _M_array(__array) williamr@2: {} williamr@2: williamr@2: _Valarray_size_t _M_addr; williamr@2: valarray<_Tp>& _M_array; williamr@2: williamr@2: private: // Disable assignment williamr@2: void operator=(const indirect_array<_Tp>&); williamr@2: }; williamr@2: williamr@2: // valarray member functions dealing with indirect_array williamr@2: williamr@2: template williamr@2: inline valarray<_Tp>::valarray(const indirect_array<_Tp>& __x) williamr@2: : _Valarray_base<_Tp>(__x._M_addr.size()) williamr@2: { williamr@2: typedef typename __type_traits<_Tp>::has_trivial_default_constructor williamr@2: _Is_Trivial; williamr@2: _M_initialize(_Is_Trivial()); williamr@2: *this = __x; williamr@2: } williamr@2: williamr@2: williamr@2: template williamr@2: inline indirect_array<_Tp> williamr@2: valarray<_Tp>::operator[](const _Valarray_size_t& __addr) williamr@2: { williamr@2: return indirect_array<_Tp>(__addr, *this); williamr@2: } williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # if !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@2: # include williamr@2: # endif williamr@2: williamr@2: #endif /* _STLP_VALARRAY */ williamr@2: williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: