1
/*      Copyright (C) 2004 Garrett A. Kajmowicz
 
 
3
        This file is part of the uClibc++ Library.
 
 
5
        This library is free software; you can redistribute it and/or
 
 
6
        modify it under the terms of the GNU Lesser General Public
 
 
7
        License as published by the Free Software Foundation; either
 
 
8
        version 2.1 of the License, or (at your option) any later version.
 
 
10
        This library is distributed in the hope that it will be useful,
 
 
11
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 
12
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
 
13
        Lesser General Public License for more details.
 
 
15
        You should have received a copy of the GNU Lesser General Public
 
 
16
        License along with this library; if not, write to the Free Software
 
 
17
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 
20
#include <basic_definitions>
 
 
22
#ifndef __HEADER_STD_VALARRAY
 
 
23
#define __HEADER_STD_VALARRAY 1
 
 
28
#pragma GCC visibility push(default)
 
 
32
        template<class T> class valarray;
 
 
34
        template<class T> class slice_array;
 
 
36
        template<class T> class gslice_array;
 
 
37
        template<class T> class mask_array;
 
 
38
        template<class T> class indirect_array;
 
 
40
        //Actual class definitions
 
 
43
        class _UCXXEXPORT slice {
 
 
50
                slice() : sta(0), siz(0), str(0){  }
 
 
51
                slice(size_t a, size_t b, size_t c) : sta(a), siz(b), str(c) {  }
 
 
52
                slice(const slice& s) : sta(s.sta), siz(s.siz), str(s.str) {  }
 
 
60
                size_t stride() const{
 
 
67
        template<class T> class _UCXXEXPORT valarray {
 
 
68
                friend class slice_array<T>;
 
 
76
                valarray() : data(0), length(0) {  }
 
 
78
                explicit valarray(size_t t) : data(0), length(t){
 
 
82
                valarray(const T& v, size_t t) : data(0), length(t){
 
 
84
                        for(size_t i = 0; i < length; ++i){
 
 
88
                valarray(const T* p, size_t t) : data(0), length(t) {
 
 
90
                        for(size_t i = 0; i < length; ++i){
 
 
94
                valarray(const valarray& v) : data(0), length(v.length){
 
 
96
                        for(size_t i = 0; i < length; ++i){
 
 
100
                valarray(const slice_array<T> & sa) : data(0), length(sa.s.size()){
 
 
101
                        data = new T[length];
 
 
102
                        for(unsigned int i = 0; i < length; ++i){
 
 
103
                                data[i] = sa.array->data[sa.s.start() + i * sa.s.stride()];
 
 
106
                valarray(const gslice_array<T>&);
 
 
107
                valarray(const mask_array<T>&);
 
 
108
                valarray(const indirect_array<T>&);
 
 
115
                valarray<T>& operator=(const valarray<T>& v){
 
 
116
                        for(size_t i =0; i< length; ++i){
 
 
121
                valarray<T>& operator=(const T& t){
 
 
122
                        for(size_t i = 0; i < length; ++i){
 
 
127
                valarray<T>& operator=(const slice_array<T>& sa){
 
 
128
                        for(size_t i =0; i < length; ++i){
 
 
129
                                data[i] = sa.data[sa.s.start() + i * sa.s.stride()];
 
 
133
                valarray<T>& operator=(const gslice_array<T>&);
 
 
134
                valarray<T>& operator=(const mask_array<T>&);
 
 
135
                valarray<T>& operator=(const indirect_array<T>&);
 
 
137
                T operator[](size_t t) const{
 
 
140
                T& operator[](size_t t){
 
 
144
                valarray<T> operator[](slice s) const{
 
 
145
                        valarray<T> retval(s.size());
 
 
146
                        for(unsigned int i = 0; i< s.size(); ++i){
 
 
147
                                retval.data[i] = data[s.start() + i * s.stride()];
 
 
152
                slice_array<T> operator[](slice sl){
 
 
153
                        slice_array<T> retval;
 
 
159
                valarray<T> operator[](const gslice&) const;
 
 
160
                gslice_array<T> operator[](const gslice&);
 
 
161
                valarray<T> operator[](const valarray<bool>&) const;
 
 
162
                mask_array<T> operator[](const valarray<bool>&);
 
 
163
                valarray<T> operator[](const valarray<size_t>&) const;
 
 
164
                indirect_array<T> operator[](const valarray<size_t>&);
 
 
166
                valarray<T> operator+() const{
 
 
167
                        valarray<T> retval(length);
 
 
168
                        for(size_t i = 0; i< length ; ++i){
 
 
169
                                retval.data[i] = +data[i];
 
 
173
                valarray<T> operator-() const{
 
 
174
                        valarray<T> retval(length);
 
 
175
                        for(size_t i = 0; i< length; ++i){
 
 
176
                                retval.data[i] = -data[i];
 
 
180
                valarray<T> operator~() const{
 
 
181
                        valarray<T> retval(length);
 
 
182
                        for(size_t i = 0; i< length ; ++i){
 
 
183
                                retval.data[i] = ~data[i];
 
 
187
                valarray<T> operator!() const{
 
 
188
                        valarray<T> retval(length);
 
 
189
                        for(size_t i = 0; i< length ; ++i){
 
 
190
                                retval.data[i] = !data[i];
 
 
194
                valarray<T>& operator*= (const T& t){
 
 
195
                        for(size_t i=0;i<length;++i){
 
 
200
                valarray<T>& operator/= (const T& t){
 
 
201
                        for(size_t i=0;i<length;++i){
 
 
206
                valarray<T>& operator%= (const T& t){
 
 
207
                        for(size_t i=0;i<length;++i){
 
 
212
                valarray<T>& operator+= (const T& t){
 
 
213
                        for(size_t i=0;i<length;++i){
 
 
218
                valarray<T>& operator-= (const T& t){
 
 
219
                        for(size_t i=0;i<length;++i){
 
 
224
                valarray<T>& operator^= (const T& t){
 
 
225
                        for(size_t i=0;i<length;++i){
 
 
230
                valarray<T>& operator&= (const T& t){
 
 
231
                        for(size_t i=0;i<length;++i){
 
 
236
                valarray<T>& operator|= (const T& t){
 
 
237
                        for(size_t i=0;i<length; ++i){
 
 
242
                valarray<T>& operator<<=(const T& t){
 
 
243
                        for(size_t i=0;i<length;++i){
 
 
248
                valarray<T>& operator>>=(const T& t){
 
 
249
                        for(size_t i=0;i<length;++i){
 
 
254
                valarray<T>& operator*= (const valarray<T>& a){
 
 
255
                        for(size_t i=0;i<length;++i){
 
 
256
                                data[i] *= a.data[i];
 
 
260
                valarray<T>& operator/= (const valarray<T>& a){
 
 
261
                        for(size_t i=0;i<length;++i){
 
 
262
                                data[i] /= a.data[i];
 
 
266
                valarray<T>& operator%= (const valarray<T>& a){
 
 
267
                        for(size_t i=0;i<length;++i){
 
 
268
                                data[i] %= a.data[i];
 
 
272
                valarray<T>& operator+= (const valarray<T>& a){
 
 
273
                        for(size_t i=0;i<length;++i){
 
 
274
                                data[i] += a.data[i];
 
 
278
                valarray<T>& operator-= (const valarray<T>& a){
 
 
279
                        for(size_t i=0;i<length ;++i){
 
 
280
                                data[i] -= a.data[i];
 
 
284
                valarray<T>& operator^= (const valarray<T>& a){
 
 
285
                        for(size_t i=0;i<length;++i){
 
 
286
                                data[i] ^= a.data[i];
 
 
290
                valarray<T>& operator|= (const valarray<T>& a){
 
 
291
                        for(size_t i=0;i<length ;++i){
 
 
292
                                data[i] |= a.data[i];
 
 
296
                valarray<T>& operator&= (const valarray<T>& a){
 
 
297
                        for(size_t i=0;i<length;++i){
 
 
298
                                data[i] &= a.data[i];
 
 
302
                valarray<T>& operator<<=(const valarray<T>& a){
 
 
303
                        for(size_t i=0;i<length;++i){
 
 
304
                                data[i] <<= a.data[i];
 
 
308
                valarray<T>& operator>>=(const valarray<T>& a){
 
 
309
                        for(size_t i=0;i<length;++i){
 
 
310
                                data[i] >>= a.data[i];
 
 
321
                        for(size_t i = 1; i< length; ++i){
 
 
329
                        for(size_t i = 1; i< length; ++i){
 
 
330
                                if(data[i] < retval){
 
 
339
                        for(size_t i = 1; i< length; ++i){
 
 
340
                                if(retval < data[i]){
 
 
347
                valarray<T> shift (int n) const{
 
 
348
                        valarray<T> retval(length);
 
 
349
                        for(size_t i = 0; i < length ; ++i){
 
 
350
                                if(i + n > 0  && i + n < length){
 
 
351
                                        retval.data[i] = data[i + n];
 
 
356
                valarray<T> cshift(int n) const{
 
 
357
                        valarray<T> retval(length);
 
 
358
                        for(size_t i = 0; i < length ; ++i){
 
 
359
                                retval.data[i] = data[ (i + n) % length ];
 
 
363
                valarray<T> apply(T func(T) ) const{
 
 
364
                        valarray<T> retval(length);
 
 
365
                        for(size_t i = 0; i< length; ++i){
 
 
366
                                retval.data[i] = func(data[i]);
 
 
370
                valarray<T> apply(T func(const T&)) const{
 
 
371
                        valarray<T> retval(length);
 
 
372
                        for(size_t i = 0; i< length; ++i){
 
 
373
                                retval.data[i] = func(data[i]);
 
 
377
                void resize(size_t sz, T c = T()){
 
 
382
                                for(size_t i = 0; i < sz; ++i){
 
 
392
        template <class T> class _UCXXEXPORT slice_array {
 
 
393
                friend class valarray<T>;
 
 
395
                typedef T value_type;
 
 
397
                void operator=  (const valarray<T>& v) const{
 
 
398
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
399
                                array->data[s.start() + i * s.stride()] = v[i];
 
 
402
                void operator=  (const T & v){
 
 
403
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
404
                                array->data[s.start() + i * s.stride()] = v;
 
 
407
                void fill(const T & v){
 
 
408
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
409
                                array->data[s.start() + i * s.stride()] = v;
 
 
412
                void operator*= (const valarray<T>& v) const{
 
 
413
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
414
                                array->data[s.start() + i * s.stride()] *= v[i];
 
 
417
                void operator/= (const valarray<T>& v) const{
 
 
418
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
419
                                array->data[s.start() + i * s.stride()] /= v[i];
 
 
422
                void operator%= (const valarray<T>& v) const{
 
 
423
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
424
                                array->data[s.start() + i * s.stride()] %= v[i];
 
 
427
                void operator+= (const valarray<T>& v) const{
 
 
428
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
429
                                array->data[s.start() + i * s.stride()] += v[i];
 
 
432
                void operator-= (const valarray<T>& v) const{
 
 
433
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
434
                                array->data[s.start() + i * s.stride()] -= v[i];
 
 
437
                void operator^= (const valarray<T>& v) const{
 
 
438
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
439
                                array->data[s.start() + i * s.stride()] ^= v[i];
 
 
442
                void operator&= (const valarray<T>& v) const{
 
 
443
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
444
                                array->data[s.start() + i * s.stride()] &= v[i];
 
 
447
                void operator|= (const valarray<T>& v) const{
 
 
448
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
449
                                array->data[s.start() + i * s.stride()] |= v[i];
 
 
452
                void operator<<=(const valarray<T>& v) const{
 
 
453
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
454
                                array->data[s.start() + i * s.stride()] <<= v[i];
 
 
457
                void operator>>=(const valarray<T>& v) const{
 
 
458
                        for(unsigned int i = 0; i < s.size(); ++i){
 
 
459
                                array->data[s.start() + i * s.stride()] >>= v[i];
 
 
467
                slice_array() : array(0){  }
 
 
470
                slice_array(const slice_array& sa) : array(sa.array), s(sa.s){  }
 
 
471
                slice_array& operator=(const slice_array& sa){
 
 
482
        class _UCXXEXPORT gslice {
 
 
485
                valarray<size_t> siz;
 
 
486
                valarray<size_t> str;
 
 
489
                gslice() : sta(0) { }
 
 
490
                gslice(size_t s, const valarray<size_t>& l, const valarray<size_t>& d)
 
 
491
                        : sta(s), siz(l), str(d) {  }
 
 
493
                size_t start() const{
 
 
496
                valarray<size_t> size() const{
 
 
499
                valarray<size_t> stride() const{
 
 
504
        template <class T> class gslice_array {
 
 
506
                friend class valarray<T>;
 
 
511
                void operator=(const valarray<T>& array) const;
 
 
512
                void operator*=(const valarray<T>& array) const;
 
 
513
                void operator/=(const valarray<T>& array) const;
 
 
514
                void operator%=(const valarray<T>& array) const;
 
 
515
                void operator+=(const valarray<T>& array) const;
 
 
516
                void operator-=(const valarray<T>& array) const;
 
 
517
                void operator^=(const valarray<T>& array) const;
 
 
518
                void operator&=(const valarray<T>& array) const;
 
 
519
                void operator|=(const valarray<T>& array) const;
 
 
520
                void operator<<=(const valarray<T>& array) const;
 
 
521
                void operator>>=(const valarray<T>& array) const;
 
 
523
                void operator=(const T&);  
 
 
527
                gslice_array(const gslice_array<T>&);
 
 
528
                gslice_array<T>& operator= (const gslice_array<T>& array);
 
 
533
        template<class T> valarray<T> operator* (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
534
                valarray<T> retval(lhs);
 
 
539
        template<class T> valarray<T> operator* (const valarray<T>& lhs, const T& rhs){
 
 
540
                valarray<T> retval(lhs);
 
 
544
        template<class T> valarray<T> operator* (const T& lhs, const valarray<T>& rhs){
 
 
545
                valarray<T> retval(rhs);
 
 
549
        template<class T> valarray<T> operator/ (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
550
                valarray<T> retval(lhs);
 
 
554
        template<class T> valarray<T> operator/ (const valarray<T>& lhs, const T& rhs){
 
 
555
                valarray<T> retval(lhs);
 
 
559
        template<class T> valarray<T> operator/ (const T& lhs, const valarray<T>& rhs){
 
 
560
                valarray<T> retval(lhs, rhs.size());
 
 
564
        template<class T> valarray<T> operator% (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
565
                valarray<T> retval(lhs);
 
 
569
        template<class T> valarray<T> operator% (const valarray<T>& lhs, const T& rhs){
 
 
570
                valarray<T> retval(lhs);
 
 
574
        template<class T> valarray<T> operator% (const T& lhs, const valarray<T>& rhs){
 
 
575
                valarray<T> retval(lhs, rhs.size());
 
 
579
        template<class T> valarray<T> operator+ (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
580
                valarray<T> retval(lhs);
 
 
584
        template<class T> valarray<T> operator+ (const valarray<T>& lhs, const T& rhs){
 
 
585
                valarray<T> retval(lhs);
 
 
589
        template<class T> valarray<T> operator+ (const T& lhs, const valarray<T>& rhs){
 
 
590
                valarray<T> retval(lhs, rhs.size());
 
 
594
        template<class T> valarray<T> operator- (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
595
                valarray<T> retval(lhs);
 
 
599
        template<class T> valarray<T> operator- (const valarray<T>& lhs, const T& rhs){
 
 
600
                valarray<T> retval(lhs);
 
 
604
        template<class T> valarray<T> operator- (const T& lhs, const valarray<T>& rhs){
 
 
605
                valarray<T> retval(lhs, rhs.size());
 
 
609
        template<class T> valarray<T> operator^ (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
610
                valarray<T> retval(lhs);
 
 
614
        template<class T> valarray<T> operator^ (const valarray<T>& lhs, const T& rhs){
 
 
615
                valarray<T> retval(lhs);
 
 
619
        template<class T> valarray<T> operator^ (const T& lhs, const valarray<T>& rhs){
 
 
620
                valarray<T> retval(lhs, rhs.size());
 
 
624
        template<class T> valarray<T> operator& (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
625
                valarray<T> retval(lhs);
 
 
629
        template<class T> valarray<T> operator& (const valarray<T>& lhs, const T& rhs){
 
 
630
                valarray<T> retval(lhs);
 
 
634
        template<class T> valarray<T> operator& (const T& lhs, const valarray<T>& rhs){
 
 
635
                valarray<T> retval(lhs, rhs.size());
 
 
639
        template<class T> valarray<T> operator| (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
640
                valarray<T> retval(lhs);
 
 
644
        template<class T> valarray<T> operator| (const valarray<T>& lhs, const T& rhs){
 
 
645
                valarray<T> retval(lhs);
 
 
649
        template<class T> valarray<T> operator| (const T& lhs, const valarray<T>& rhs){
 
 
650
                valarray<T> retval(lhs, rhs.size());
 
 
654
        template<class T> valarray<T> operator<<(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
655
                valarray<T> retval(lhs);
 
 
659
        template<class T> valarray<T> operator<<(const valarray<T>& lhs, const T& rhs){
 
 
660
                valarray<T> retval(lhs);
 
 
664
        template<class T> valarray<T> operator<<(const T& lhs, const valarray<T>& rhs){
 
 
665
                valarray<T> retval(lhs, rhs.size());
 
 
669
        template<class T> valarray<T> operator>>(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
670
                valarray<T> retval(lhs);
 
 
674
        template<class T> valarray<T> operator>>(const valarray<T>& lhs, const T& rhs){
 
 
675
                valarray<T> retval(lhs);
 
 
679
        template<class T> valarray<T> operator>>(const T& lhs, const valarray<T>& rhs){
 
 
680
                valarray<T> retval(lhs, rhs.size());
 
 
685
        template<class T> valarray<bool> operator&&(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
686
                valarray<bool> retval(lhs.size());
 
 
687
                for(size_t i = 0; i < retval.size(); ++i){
 
 
688
                        retval[i] = lhs[i] && rhs[i];
 
 
692
        template<class T> valarray<bool> operator&&(const valarray<T>& lhs, const T& rhs){
 
 
693
                valarray<bool> retval(lhs.size());
 
 
694
                for(size_t i = 0; i <retval.size(); ++i){
 
 
695
                        retval[i] = lhs[i] && rhs;
 
 
699
        template<class T> valarray<bool> operator&&(const T& lhs, const valarray<T>& rhs){
 
 
700
                valarray<bool> retval(rhs.size());
 
 
701
                for(size_t i = 0; i <retval.size(); ++i){
 
 
702
                        retval[i] = lhs && rhs[i];
 
 
706
        template<class T> valarray<bool> operator||(const valarray<T>&lhs, const valarray<T>& rhs){
 
 
707
                valarray<bool> retval(lhs.size());
 
 
708
                for(size_t i = 0; i <retval.size(); ++i){
 
 
709
                        retval[i] = lhs[i] || rhs[i];
 
 
713
        template<class T> valarray<bool> operator||(const valarray<T>& lhs, const T& rhs){
 
 
714
                valarray<bool> retval(lhs.size());
 
 
715
                for(size_t i = 0; i <retval.size(); ++i){
 
 
716
                        retval[i] = lhs[i] || rhs;
 
 
720
        template<class T> valarray<bool> operator||(const T& lhs, const valarray<T>& rhs){
 
 
721
                valarray<bool> retval(rhs.size());
 
 
722
                for(size_t i = 0; i < retval.size(); ++i){
 
 
723
                        retval[i] = lhs || rhs[i];
 
 
728
        template<class T> valarray<bool> operator==(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
729
                valarray<bool> retval(lhs.size());
 
 
730
                for(size_t i = 0; i <retval.size(); ++i){
 
 
731
                        retval[i] = lhs[i] == rhs[i];
 
 
735
        template<class T> valarray<bool> operator==(const valarray<T>& lhs, const T& rhs){
 
 
736
                valarray<bool> retval(lhs.size());
 
 
737
                for(size_t i = 0; i < retval.size(); ++i){
 
 
738
                        retval[i] = lhs[i] == rhs;
 
 
742
        template<class T> valarray<bool> operator==(const T& lhs, const valarray<T>& rhs){
 
 
743
                valarray<bool> retval(rhs.size());
 
 
744
                for(size_t i = 0; i < retval.size(); ++i){
 
 
745
                        retval[i] = lhs == rhs[i];
 
 
749
        template<class T> valarray<bool> operator!=(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
750
                valarray<bool> retval(lhs.size());
 
 
751
                for(size_t i = 0; i <retval.size(); ++i){
 
 
752
                        retval[i] = lhs[i] != rhs[i];
 
 
756
        template<class T> valarray<bool> operator!=(const valarray<T>& lhs, const T& rhs){
 
 
757
                valarray<bool> retval(lhs.size());
 
 
758
                for(size_t i = 0; i <retval.size(); ++i){
 
 
759
                        retval[i] = lhs[i] != rhs;
 
 
763
        template<class T> valarray<bool> operator!=(const T& lhs, const valarray<T>& rhs){
 
 
764
                valarray<bool> retval(rhs.size());
 
 
765
                for(size_t i = 0; i <retval.size(); ++i){
 
 
766
                        retval[i] = lhs != rhs[i];
 
 
770
        template<class T> valarray<bool> operator< (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
771
                valarray<bool> retval(lhs.size());
 
 
772
                for(size_t i = 0; i <retval.size(); ++i){
 
 
773
                        retval[i] = lhs[i] < rhs[i];
 
 
777
        template<class T> valarray<bool> operator< (const valarray<T>& lhs, const T& rhs){
 
 
778
                valarray<bool> retval(lhs.size());
 
 
779
                for(size_t i = 0; i <retval.size(); ++i){
 
 
780
                        retval[i] = lhs[i] < rhs;
 
 
784
        template<class T> valarray<bool> operator< (const T& lhs, const valarray<T>& rhs){
 
 
785
                valarray<bool> retval(rhs.size());
 
 
786
                for(size_t i = 0; i <retval.size(); ++i){
 
 
787
                        retval[i] = lhs < rhs[i];
 
 
791
        template<class T> valarray<bool> operator> (const valarray<T>& lhs, const valarray<T>& rhs){
 
 
792
                valarray<bool> retval(lhs.size());
 
 
793
                for(size_t i = 0; i <retval.size(); ++i){
 
 
794
                        retval[i] = lhs[i] > rhs[i];
 
 
798
        template<class T> valarray<bool> operator> (const valarray<T>& lhs, const T& rhs){
 
 
799
                valarray<bool> retval(lhs.size());
 
 
800
                for(size_t i = 0; i <retval.size(); ++i){
 
 
801
                        retval[i] = lhs[i] > rhs;
 
 
805
        template<class T> valarray<bool> operator> (const T& rhs, const valarray<T>& lhs){
 
 
806
                valarray<bool> retval(rhs.size());
 
 
807
                for(size_t i = 0; i <retval.size(); ++i){
 
 
808
                        retval[i] = lhs > rhs[i];
 
 
812
        template<class T> valarray<bool> operator<=(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
813
                valarray<bool> retval(lhs.size());
 
 
814
                for(size_t i = 0; i <retval.size(); ++i){
 
 
815
                        retval[i] = lhs[i] <= rhs[i];
 
 
819
        template<class T> valarray<bool> operator<=(const valarray<T>& lhs, const T& rhs){
 
 
820
                valarray<bool> retval(lhs.size());
 
 
821
                for(size_t i = 0; i <retval.size(); ++i){
 
 
822
                        retval[i] = lhs[i] <= rhs;
 
 
826
        template<class T> valarray<bool> operator<=(const T& lhs, const valarray<T>& rhs){
 
 
827
                valarray<bool> retval(rhs.size());
 
 
828
                for(size_t i = 0; i <retval.size(); ++i){
 
 
829
                        retval[i] = lhs <= rhs[i];
 
 
833
        template<class T> valarray<bool> operator>=(const valarray<T>& lhs, const valarray<T>& rhs){
 
 
834
                valarray<bool> retval(lhs.size());
 
 
835
                for(size_t i = 0; i <retval.size(); ++i){
 
 
836
                        retval[i] = lhs[i] >= rhs[i];
 
 
840
        template<class T> valarray<bool> operator>=(const valarray<T>& lhs, const T& rhs){
 
 
841
                valarray<bool> retval(lhs.size());
 
 
842
                for(size_t i = 0; i <retval.size(); ++i){
 
 
843
                        retval[i] = lhs[i] >= rhs;
 
 
847
        template<class T> valarray<bool> operator>=(const T& lhs, const valarray<T>& rhs){
 
 
848
                valarray<bool> retval(rhs.size());
 
 
849
                for(size_t i = 0; i <retval.size(); ++i){
 
 
850
                        retval[i] = lhs >= rhs[i];
 
 
854
        template<class T> T min(const valarray<T>& x){
 
 
856
                for(size_t i = 1; i < x.size(); ++i){
 
 
862
        template<class T> T max(const valarray<T>& x){
 
 
864
                for(size_t i = 1; i < x.size(); ++i){
 
 
871
        template<class T> valarray<T> abs  (const valarray<T>& x){
 
 
872
                valarray<T> retval(x.size());
 
 
873
                for(size_t i = 0; i < retval.size(); ++i){
 
 
874
                        retval[i] = abs(x[i]);
 
 
877
        template<class T> valarray<T> acos (const valarray<T>& x){
 
 
878
                valarray<T> retval(x.size());
 
 
879
                for(size_t i = 0; i < retval.size(); ++i){
 
 
880
                        retval[i] = acos(x[i]);
 
 
883
        template<class T> valarray<T> asin (const valarray<T>& x){
 
 
884
                valarray<T> retval(x.size());
 
 
885
                for(size_t i = 0; i < retval.size(); ++i){
 
 
886
                        retval[i] = asin(x[i]);
 
 
889
        template<class T> valarray<T> atan (const valarray<T>& x){
 
 
890
                valarray<T> retval(x.size());
 
 
891
                for(size_t i = 0; i < retval.size(); ++i){
 
 
892
                        retval[i] = atan(x[i]);
 
 
895
        template<class T> valarray<T> atan2(const valarray<T>& y, const valarray<T>& x){
 
 
896
                valarray<T> retval(y.size());
 
 
897
                for(size_t i = 0; i < retval.size(); ++i){
 
 
898
                        retval[i] = atan2(y[i], x[i]);
 
 
901
        template<class T> valarray<T> atan2(const valarray<T>& y, const T& x){
 
 
902
                valarray<T> retval(y.size());
 
 
903
                for(size_t i = 0; i < retval.size(); ++i){
 
 
904
                        retval[i] = atan2(y[i], x);
 
 
907
        template<class T> valarray<T> atan2(const T& y, const valarray<T>& x){
 
 
908
                valarray<T> retval(x.size());
 
 
909
                for(size_t i = 0; i < retval.size(); ++i){
 
 
910
                        retval[i] = abs(y, x[i]);
 
 
913
        template<class T> valarray<T> cos  (const valarray<T>& x){
 
 
914
                valarray<T> retval(x.size());
 
 
915
                for(size_t i = 0; i < retval.size(); ++i){
 
 
916
                        retval[i] = cos(x[i]);
 
 
919
        template<class T> valarray<T> cosh (const valarray<T>& x){
 
 
920
                valarray<T> retval(x.size());
 
 
921
                for(size_t i = 0; i < retval.size(); ++i){
 
 
922
                        retval[i] = cosh(x[i]);
 
 
925
        template<class T> valarray<T> exp  (const valarray<T>& x){
 
 
926
                valarray<T> retval(x.size());
 
 
927
                for(size_t i = 0; i < retval.size(); ++i){
 
 
928
                        retval[i] = exp(x[i]);
 
 
931
        template<class T> valarray<T> log  (const valarray<T>& x){
 
 
932
                valarray<T> retval(x.size());
 
 
933
                for(size_t i = 0; i < retval.size(); ++i){
 
 
934
                        retval[i] = log(x[i]);
 
 
937
        template<class T> valarray<T> log10(const valarray<T>& x){
 
 
938
                valarray<T> retval(x.size());
 
 
939
                for(size_t i = 0; i < retval.size(); ++i){
 
 
940
                        retval[i] = log10(x[i]);
 
 
943
        template<class T> valarray<T> pow (const valarray<T>& x, const valarray<T>& y){
 
 
944
                valarray<T> retval(x.size());
 
 
945
                for(size_t i = 0; i < retval.size(); ++i){
 
 
946
                        retval[i] = pow(x[i], y[i]);
 
 
949
        template<class T> valarray<T> pow  (const valarray<T>& x, const T& y){
 
 
950
                valarray<T> retval(x.size());
 
 
951
                for(size_t i = 0; i < retval.size(); ++i){
 
 
952
                        retval[i] = pow(x[i], y);
 
 
955
        template<class T> valarray<T> pow  (const T& x, const valarray<T>& y){
 
 
956
                valarray<T> retval(x.size());
 
 
957
                for(size_t i = 0; i < retval.size(); ++i){
 
 
958
                        retval[i] = pow(x, y[i]);
 
 
961
        template<class T> valarray<T> sin  (const valarray<T>& x){
 
 
962
                valarray<T> retval(x.size());
 
 
963
                for(size_t i = 0; i < retval.size(); ++i){
 
 
964
                        retval[i] = sin(x[i]);
 
 
967
        template<class T> valarray<T> sinh (const valarray<T>& x){
 
 
968
                valarray<T> retval(x.size());
 
 
969
                for(size_t i = 0; i < retval.size(); ++i){
 
 
970
                        retval[i] = sinh(x[i]);
 
 
973
        template<class T> valarray<T> sqrt (const valarray<T>& x){
 
 
974
                valarray<T> retval(x.size());
 
 
975
                for(size_t i = 0; i < retval.size(); ++i){
 
 
976
                        retval[i] = sqrt(x[i]);
 
 
979
        template<class T> valarray<T> tan  (const valarray<T>& x){
 
 
980
                valarray<T> retval(x.size());
 
 
981
                for(size_t i = 0; i < retval.size(); ++i){
 
 
982
                        retval[i] = tan(x[i]);
 
 
985
        template<class T> valarray<T> tanh (const valarray<T>& x){
 
 
986
                valarray<T> retval(x.size());
 
 
987
                for(size_t i = 0; i < retval.size(); ++i){
 
 
988
                        retval[i] = tanh(x[i]);
 
 
994
#pragma GCC visibility pop