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