Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5496 leency 1
/*	Copyright (C) 2004 Garrett A. Kajmowicz
2
 
3
	This file is part of the uClibc++ Library.
4
 
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.
9
 
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.
14
 
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
18
*/
19
 
20
#include 
21
 
22
#ifndef __HEADER_STD_VALARRAY
23
#define __HEADER_STD_VALARRAY 1
24
 
25
#include 
26
#include 
27
 
28
#pragma GCC visibility push(default)
29
 
30
namespace std{
31
 
32
	template class valarray;
33
	class slice;
34
	template class slice_array;
35
	class gslice;
36
	template class gslice_array;
37
	template class mask_array;
38
	template class indirect_array;
39
 
40
	//Actual class definitions
41
 
42
 
43
	class _UCXXEXPORT slice {
44
	protected:
45
		size_t sta;
46
		size_t siz;
47
		size_t str;
48
 
49
	public:
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) {  }
53
		~slice() {  }
54
		size_t start() const{
55
			return sta;
56
		}
57
		size_t size() const{
58
			return siz;
59
		}
60
		size_t stride() const{
61
			return str;
62
		}
63
	};
64
 
65
 
66
 
67
	template class _UCXXEXPORT valarray {
68
		friend class slice_array;
69
	protected:
70
		T * data;
71
		size_t length;
72
 
73
	public:
74
		typedef T value_type;
75
 
76
		valarray() : data(0), length(0) {  }
77
 
78
		explicit valarray(size_t t) : data(0), length(t){
79
			data = new T[length];
80
		}
81
 
82
		valarray(const T& v, size_t t) : data(0), length(t){
83
			data = new T[length];
84
			for(size_t i = 0; i < length; ++i){
85
				data[i] = v;
86
			}
87
		}
88
		valarray(const T* p, size_t t) : data(0), length(t) {
89
			data = new T[length];
90
			for(size_t i = 0; i < length; ++i){
91
				data[i] = p[i];
92
			}
93
		}
94
		valarray(const valarray& v) : data(0), length(v.length){
95
			data = new T[length];
96
			for(size_t i = 0; i < length; ++i){
97
				data[i] = v.data[i];
98
			}
99
		}
100
		valarray(const slice_array & 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()];
104
			}
105
		}
106
		valarray(const gslice_array&);
107
		valarray(const mask_array&);
108
		valarray(const indirect_array&);
109
		~valarray(){
110
			delete [] data;
111
			data = 0;
112
			length = 0;
113
		}
114
 
115
		valarray& operator=(const valarray& v){
116
			if (length != v.length) { // DR 630
117
				delete [] data;
118
				length = v.length;
119
				data = new T[length];
120
			}
121
			for (size_t i = 0; i < length; ++i) {
122
				data[i] = v.data[i];
123
			}
124
			return *this;
125
		}
126
		valarray& operator=(const T& t){
127
			for(size_t i = 0; i < length; ++i){
128
				data[i] = t;
129
			}
130
			return *this;
131
		}
132
		valarray& operator=(const slice_array& sa){
133
			for(size_t i =0; i < length; ++i){
134
				data[i] = sa.data[sa.s.start() + i * sa.s.stride()];
135
			}
136
			return *this;
137
		}
138
		valarray& operator=(const gslice_array&);
139
		valarray& operator=(const mask_array&);
140
		valarray& operator=(const indirect_array&);
141
 
142
		const T& operator[](size_t t) const{
143
			return data[t];
144
		}
145
		T& operator[](size_t t){
146
			return data[t];
147
		}
148
 
149
		valarray operator[](slice s) const{
150
			valarray retval(s.size());
151
			for(unsigned int i = 0; i< s.size(); ++i){
152
				retval.data[i] = data[s.start() + i * s.stride()];
153
			}
154
			return retval;
155
		}
156
 
157
		slice_array operator[](slice sl){
158
			slice_array retval;
159
			retval.s = sl;
160
			retval.array = this;
161
			return retval;
162
		}
163
 
164
		valarray operator[](const gslice&) const;
165
		gslice_array operator[](const gslice&);
166
		valarray operator[](const valarray&) const;
167
		mask_array operator[](const valarray&);
168
		valarray operator[](const valarray&) const;
169
		indirect_array operator[](const valarray&);
170
 
171
		valarray operator+() const{
172
			valarray retval(length);
173
			for(size_t i = 0; i< length ; ++i){
174
				retval.data[i] = +data[i];
175
			}
176
			return retval;
177
		}
178
		valarray operator-() const{
179
			valarray retval(length);
180
			for(size_t i = 0; i< length; ++i){
181
				retval.data[i] = -data[i];
182
			}
183
			return retval;
184
		}
185
		valarray operator~() const{
186
			valarray retval(length);
187
			for(size_t i = 0; i< length ; ++i){
188
				retval.data[i] = ~data[i];
189
			}
190
			return retval;
191
		}
192
		valarray operator!() const{
193
			valarray retval(length);
194
			for (size_t i = 0; i < length ; ++i){
195
				retval[i] = !data[i];
196
			}
197
			return retval;
198
		}
199
		valarray& operator*= (const T& t){
200
			for(size_t i=0;i
201
				data[i] *= t;
202
			}
203
			return *this;
204
		}
205
		valarray& operator/= (const T& t){
206
			for(size_t i=0;i
207
				data[i] /= t;
208
			}
209
			return *this;
210
		}
211
		valarray& operator%= (const T& t){
212
			for(size_t i=0;i
213
				data[i] %= t;
214
			}
215
			return *this;
216
		}
217
		valarray& operator+= (const T& t){
218
			for(size_t i=0;i
219
				data[i] += t;
220
			}
221
			return *this;
222
		}
223
		valarray& operator-= (const T& t){
224
			for(size_t i=0;i
225
				data[i] -= t;
226
			}
227
			return *this;
228
		}
229
		valarray& operator^= (const T& t){
230
			for(size_t i=0;i
231
				data[i] ^= t;
232
			}
233
			return *this;
234
		}
235
		valarray& operator&= (const T& t){
236
			for(size_t i=0;i
237
				data[i] &= t;
238
			}
239
			return *this;
240
		}
241
		valarray& operator|= (const T& t){
242
			for(size_t i=0;i
243
				data[i] |= t;
244
			}
245
			return *this;
246
		}
247
		valarray& operator<<=(const T& t){
248
			for(size_t i=0;i
249
				data[i] <<= t;
250
			}
251
			return *this;
252
		}
253
		valarray& operator>>=(const T& t){
254
			for(size_t i=0;i
255
				data[i] >>= t;
256
			}
257
			return *this;
258
		}
259
		valarray& operator*= (const valarray& a){
260
			for(size_t i=0;i
261
				data[i] *= a.data[i];
262
			}
263
			return *this;
264
		}
265
		valarray& operator/= (const valarray& a){
266
			for(size_t i=0;i
267
				data[i] /= a.data[i];
268
			}
269
			return *this;
270
		}
271
		valarray& operator%= (const valarray& a){
272
			for(size_t i=0;i
273
				data[i] %= a.data[i];
274
			}
275
			return *this;
276
		}
277
		valarray& operator+= (const valarray& a){
278
			for(size_t i=0;i
279
				data[i] += a.data[i];
280
			}
281
			return *this;
282
		}
283
		valarray& operator-= (const valarray& a){
284
			for(size_t i=0;i
285
				data[i] -= a.data[i];
286
			}
287
			return *this;
288
		}
289
		valarray& operator^= (const valarray& a){
290
			for(size_t i=0;i
291
				data[i] ^= a.data[i];
292
			}
293
			return *this;
294
		}
295
		valarray& operator|= (const valarray& a){
296
			for(size_t i=0;i
297
				data[i] |= a.data[i];
298
			}
299
			return *this;
300
		}
301
		valarray& operator&= (const valarray& a){
302
			for(size_t i=0;i
303
				data[i] &= a.data[i];
304
			}
305
			return *this;
306
		}
307
		valarray& operator<<=(const valarray& a){
308
			for(size_t i=0;i
309
				data[i] <<= a.data[i];
310
			}
311
			return *this;
312
		}
313
		valarray& operator>>=(const valarray& a){
314
			for(size_t i=0;i
315
				data[i] >>= a.data[i];
316
			}
317
			return *this;
318
		}
319
#if 0
320
		void swap(valarray& other) noexcept {
321
			std::swap(length, other.length);
322
			std::swap(data, other.data);
323
		}
324
#endif
325
		size_t size() const{
326
			return length;
327
		}
328
 
329
		T sum() const{
330
			T retval(data[0]);
331
			for(size_t i = 1; i< length; ++i){
332
				retval += data[i];
333
			}
334
			return retval;
335
		}
336
 
337
		T min() const{
338
			T retval(data[0]);
339
			for(size_t i = 1; i< length; ++i){
340
				if(data[i] < retval){
341
					retval = data[i];
342
				}
343
			}
344
			return retval;
345
		}
346
 
347
		T max() const{
348
			T retval(data[0]);
349
			for(size_t i = 1; i< length; ++i){
350
				if(retval < data[i]){
351
					retval = data[i];
352
				}
353
			}
354
			return retval;
355
		}
356
 
357
		valarray shift (int n) const{
358
			valarray retval(length);
359
			if (n < 0) {
360
				if (-size_t(n) > length)
361
					n = -int(length);
362
			} else {
363
				if (size_t(n) > length)
364
					n = int(length);
365
			}
366
			for (size_t i = 0; i < length ; ++i) {
367
				if ((n + i) < length)
368
					retval.data[i] = data[n + i];
369
			}
370
			return retval;
371
		}
372
		valarray cshift(int n) const{
373
			valarray retval(length);
374
			if (length == 0)
375
				return retval;
376
			if (n < 0) {
377
				if (-size_t(n) > length)
378
					n = -int(-size_t(n) % length);
379
				n = length + n;
380
			} else {
381
				if (size_t(n) > length)
382
					n = int(size_t(n) % length);
383
			}
384
			for (size_t i = 0; i < length ; ++i){
385
				retval.data[i] = data[(n + i) % length];
386
			}
387
			return retval;
388
		}
389
		valarray apply(T func(T) ) const{
390
			valarray retval(length);
391
			for(size_t i = 0; i< length; ++i){
392
				retval.data[i] = func(data[i]);
393
			}
394
			return retval;
395
		}
396
		valarray apply(T func(const T&)) const{
397
			valarray retval(length);
398
			for(size_t i = 0; i< length; ++i){
399
				retval.data[i] = func(data[i]);
400
			}
401
			return retval;
402
		}
403
		void resize(size_t sz, T c = T()){
404
			delete [] data;
405
			data = 0;
406
			if(sz > 0){
407
				data = new T[sz];
408
				for(size_t i = 0; i < sz; ++i){
409
					data[i] = c;
410
				}
411
			}
412
			length = sz;
413
		}
414
	};
415
 
416
 
417
 
418
	template  class _UCXXEXPORT slice_array {
419
		friend class valarray;
420
	public:
421
		typedef T value_type;
422
 
423
		void operator=  (const valarray& v) const{
424
			for(unsigned int i = 0; i < s.size(); ++i){
425
				array->data[s.start() + i * s.stride()] = v[i];
426
			}
427
		}
428
		void operator=  (const T & v){
429
			for(unsigned int i = 0; i < s.size(); ++i){
430
				array->data[s.start() + i * s.stride()] = v;
431
			}
432
		}
433
		void fill(const T & v){
434
			for(unsigned int i = 0; i < s.size(); ++i){
435
				array->data[s.start() + i * s.stride()] = v;
436
			}
437
		}
438
		void operator*= (const valarray& v) const{
439
			for(unsigned int i = 0; i < s.size(); ++i){
440
				array->data[s.start() + i * s.stride()] *= v[i];
441
			}
442
		}
443
		void operator/= (const valarray& v) const{
444
			for(unsigned int i = 0; i < s.size(); ++i){
445
				array->data[s.start() + i * s.stride()] /= v[i];
446
			}
447
		}
448
		void operator%= (const valarray& v) const{
449
			for(unsigned int i = 0; i < s.size(); ++i){
450
				array->data[s.start() + i * s.stride()] %= v[i];
451
			}
452
		}
453
		void operator+= (const valarray& v) const{
454
			for(unsigned int i = 0; i < s.size(); ++i){
455
				array->data[s.start() + i * s.stride()] += v[i];
456
			}
457
		}
458
		void operator-= (const valarray& v) const{
459
			for(unsigned int i = 0; i < s.size(); ++i){
460
				array->data[s.start() + i * s.stride()] -= v[i];
461
			}
462
		}
463
		void operator^= (const valarray& v) const{
464
			for(unsigned int i = 0; i < s.size(); ++i){
465
				array->data[s.start() + i * s.stride()] ^= v[i];
466
			}
467
		}
468
		void operator&= (const valarray& v) const{
469
			for(unsigned int i = 0; i < s.size(); ++i){
470
				array->data[s.start() + i * s.stride()] &= v[i];
471
			}
472
		}
473
		void operator|= (const valarray& v) const{
474
			for(unsigned int i = 0; i < s.size(); ++i){
475
				array->data[s.start() + i * s.stride()] |= v[i];
476
			}
477
		}
478
		void operator<<=(const valarray& v) const{
479
			for(unsigned int i = 0; i < s.size(); ++i){
480
				array->data[s.start() + i * s.stride()] <<= v[i];
481
			}
482
		}
483
		void operator>>=(const valarray& v) const{
484
			for(unsigned int i = 0; i < s.size(); ++i){
485
				array->data[s.start() + i * s.stride()] >>= v[i];
486
			}
487
		}
488
		~slice_array(){
489
			array = 0;
490
		}
491
 
492
	private:
493
		slice_array() : array(0){  }
494
 
495
	public:
496
		slice_array(const slice_array& sa) : array(sa.array), s(sa.s){  }
497
		slice_array& operator=(const slice_array& sa){
498
			array = sa.array;
499
			s = sa.s;
500
			return *this;
501
		}
502
 
503
	private:
504
		valarray * array;
505
		slice s;
506
	};
507
 
508
 
509
	class _UCXXEXPORT gslice {
510
	private:
511
		size_t sta;
512
		valarray siz;
513
		valarray str;
514
 
515
	public:
516
		gslice() : sta(0), siz(), str() { } // DR 543
517
		gslice(size_t s, const valarray& l, const valarray& d)
518
			: sta(s), siz(l), str(d) {  }
519
 
520
		size_t start() const{
521
			return sta;
522
		}
523
		valarray size() const{
524
			return siz;
525
		}
526
		valarray stride() const{
527
			return str;
528
		}
529
	};
530
 
531
	template  class gslice_array {
532
	private:
533
		friend class valarray;
534
 
535
	public:
536
		~gslice_array();
537
 
538
		void operator=(const valarray& array) const;
539
		void operator*=(const valarray& array) const;
540
		void operator/=(const valarray& array) const;
541
		void operator%=(const valarray& array) const;
542
		void operator+=(const valarray& array) const;
543
		void operator-=(const valarray& array) const;
544
		void operator^=(const valarray& array) const;
545
		void operator&=(const valarray& array) const;
546
		void operator|=(const valarray& array) const;
547
		void operator<<=(const valarray& array) const;
548
		void operator>>=(const valarray& array) const;
549
 
550
		void operator=(const T&);
551
 
552
	private:
553
		gslice_array();
554
		gslice_array(const gslice_array&);
555
    		gslice_array& operator= (const gslice_array& array);
556
	};
557
 
558
 
559
 
560
	template valarray operator* (const valarray& lhs, const valarray& rhs){
561
		valarray retval(lhs);
562
		retval *= rhs;
563
		return retval;
564
	}
565
 
566
	template valarray operator* (const valarray& lhs, const T& rhs){
567
		valarray retval(lhs);
568
		retval *= rhs;
569
		return retval;
570
	}
571
	template valarray operator* (const T& lhs, const valarray& rhs){
572
		valarray retval(rhs);
573
		retval *= lhs;
574
		return retval;
575
	}
576
	template valarray operator/ (const valarray& lhs, const valarray& rhs){
577
		valarray retval(lhs);
578
		retval /= rhs;
579
		return retval;
580
	}
581
	template valarray operator/ (const valarray& lhs, const T& rhs){
582
		valarray retval(lhs);
583
		retval /= rhs;
584
		return retval;
585
	}
586
	template valarray operator/ (const T& lhs, const valarray& rhs){
587
		valarray retval(lhs, rhs.size());
588
		retval /= rhs;
589
		return retval;
590
	}
591
	template valarray operator% (const valarray& lhs, const valarray& rhs){
592
		valarray retval(lhs);
593
		retval %= rhs;
594
		return retval;
595
	}
596
	template valarray operator% (const valarray& lhs, const T& rhs){
597
		valarray retval(lhs);
598
		retval %= rhs;
599
		return retval;
600
	}
601
	template valarray operator% (const T& lhs, const valarray& rhs){
602
		valarray retval(lhs, rhs.size());
603
		retval %= rhs;
604
		return retval;
605
	}
606
	template valarray operator+ (const valarray& lhs, const valarray& rhs){
607
		valarray retval(lhs);
608
		retval += rhs;
609
		return retval;
610
	}
611
	template valarray operator+ (const valarray& lhs, const T& rhs){
612
		valarray retval(lhs);
613
		retval += rhs;
614
		return retval;
615
	}
616
	template valarray operator+ (const T& lhs, const valarray& rhs){
617
		valarray retval(lhs, rhs.size());
618
		retval += rhs;
619
		return retval;
620
	}
621
	template valarray operator- (const valarray& lhs, const valarray& rhs){
622
		valarray retval(lhs);
623
		retval -= rhs;
624
		return retval;
625
	}
626
	template valarray operator- (const valarray& lhs, const T& rhs){
627
		valarray retval(lhs);
628
		retval -= rhs;
629
		return retval;
630
	}
631
	template valarray operator- (const T& lhs, const valarray& rhs){
632
		valarray retval(lhs, rhs.size());
633
		retval -= rhs;
634
		return retval;
635
	}
636
	template valarray operator^ (const valarray& lhs, const valarray& rhs){
637
		valarray retval(lhs);
638
		retval ^= rhs;
639
		return retval;
640
	}
641
	template valarray operator^ (const valarray& lhs, const T& rhs){
642
		valarray retval(lhs);
643
		retval ^= rhs;
644
		return retval;
645
	}
646
	template valarray operator^ (const T& lhs, const valarray& rhs){
647
		valarray retval(lhs, rhs.size());
648
		retval ^= rhs;
649
		return retval;
650
	}
651
	template valarray operator& (const valarray& lhs, const valarray& rhs){
652
		valarray retval(lhs);
653
		retval &= rhs;
654
		return retval;
655
	}
656
	template valarray operator& (const valarray& lhs, const T& rhs){
657
		valarray retval(lhs);
658
		retval &= rhs;
659
		return retval;
660
	}
661
	template valarray operator& (const T& lhs, const valarray& rhs){
662
		valarray retval(lhs, rhs.size());
663
		retval &= rhs;
664
		return retval;
665
	}
666
	template valarray operator| (const valarray& lhs, const valarray& rhs){
667
		valarray retval(lhs);
668
		retval |= rhs;
669
		return retval;
670
	}
671
	template valarray operator| (const valarray& lhs, const T& rhs){
672
		valarray retval(lhs);
673
		retval |= rhs;
674
		return retval;
675
	}
676
	template valarray operator| (const T& lhs, const valarray& rhs){
677
		valarray retval(lhs, rhs.size());
678
		retval |= rhs;
679
		return retval;
680
	}
681
	template valarray operator<<(const valarray& lhs, const valarray& rhs){
682
		valarray retval(lhs);
683
		retval <<= rhs;
684
		return retval;
685
	}
686
	template valarray operator<<(const valarray& lhs, const T& rhs){
687
		valarray retval(lhs);
688
		retval <<= rhs;
689
		return retval;
690
	}
691
	template valarray operator<<(const T& lhs, const valarray& rhs){
692
		valarray retval(lhs, rhs.size());
693
		retval <<= rhs;
694
		return retval;
695
	}
696
	template valarray operator>>(const valarray& lhs, const valarray& rhs){
697
		valarray retval(lhs);
698
		retval >>= rhs;
699
		return retval;
700
	}
701
	template valarray operator>>(const valarray& lhs, const T& rhs){
702
		valarray retval(lhs);
703
		retval >>= rhs;
704
		return retval;
705
	}
706
	template valarray operator>>(const T& lhs, const valarray& rhs){
707
		valarray retval(lhs, rhs.size());
708
		retval >>= rhs;
709
		return retval;
710
	}
711
 
712
	template valarray operator&&(const valarray& lhs, const valarray& rhs){
713
		valarray retval(lhs.size());
714
		for(size_t i = 0; i < retval.size(); ++i){
715
			retval[i] = lhs[i] && rhs[i];
716
		}
717
		return retval;
718
	}
719
	template valarray operator&&(const valarray& lhs, const T& rhs){
720
		valarray retval(lhs.size());
721
		for(size_t i = 0; i 
722
			retval[i] = lhs[i] && rhs;
723
		}
724
		return retval;
725
	}
726
	template valarray operator&&(const T& lhs, const valarray& rhs){
727
		valarray retval(rhs.size());
728
		for(size_t i = 0; i 
729
			retval[i] = lhs && rhs[i];
730
		}
731
		return retval;
732
	}
733
	template valarray operator||(const valarray&lhs, const valarray& rhs){
734
		valarray retval(lhs.size());
735
		for(size_t i = 0; i 
736
			retval[i] = lhs[i] || rhs[i];
737
		}
738
		return retval;
739
	}
740
	template valarray operator||(const valarray& lhs, const T& rhs){
741
		valarray retval(lhs.size());
742
		for(size_t i = 0; i 
743
			retval[i] = lhs[i] || rhs;
744
		}
745
		return retval;
746
	}
747
	template valarray operator||(const T& lhs, const valarray& rhs){
748
		valarray retval(rhs.size());
749
		for(size_t i = 0; i < retval.size(); ++i){
750
			retval[i] = lhs || rhs[i];
751
		}
752
		return retval;
753
	}
754
 
755
	template valarray operator==(const valarray& lhs, const valarray& rhs){
756
		valarray retval(lhs.size());
757
		for(size_t i = 0; i 
758
			retval[i] = lhs[i] == rhs[i];
759
		}
760
		return retval;
761
	}
762
	template valarray operator==(const valarray& lhs, const T& rhs){
763
		valarray retval(lhs.size());
764
		for(size_t i = 0; i < retval.size(); ++i){
765
			retval[i] = lhs[i] == rhs;
766
		}
767
		return retval;
768
	}
769
	template valarray operator==(const T& lhs, const valarray& rhs){
770
		valarray retval(rhs.size());
771
		for(size_t i = 0; i < retval.size(); ++i){
772
			retval[i] = lhs == rhs[i];
773
		}
774
		return retval;
775
	}
776
	template valarray operator!=(const valarray& lhs, const valarray& rhs){
777
		valarray retval(lhs.size());
778
		for(size_t i = 0; i 
779
			retval[i] = lhs[i] != rhs[i];
780
		}
781
		return retval;
782
	}
783
	template valarray operator!=(const valarray& lhs, const T& rhs){
784
		valarray retval(lhs.size());
785
		for(size_t i = 0; i 
786
			retval[i] = lhs[i] != rhs;
787
		}
788
		return retval;
789
	}
790
	template valarray operator!=(const T& lhs, const valarray& rhs){
791
		valarray retval(rhs.size());
792
		for(size_t i = 0; i 
793
			retval[i] = lhs != rhs[i];
794
		}
795
		return retval;
796
	}
797
	template valarray operator< (const valarray& lhs, const valarray& rhs){
798
		valarray retval(lhs.size());
799
		for(size_t i = 0; i 
800
			retval[i] = lhs[i] < rhs[i];
801
		}
802
		return retval;
803
	}
804
	template valarray operator< (const valarray& lhs, const T& rhs){
805
		valarray retval(lhs.size());
806
		for(size_t i = 0; i 
807
			retval[i] = lhs[i] < rhs;
808
		}
809
		return retval;
810
	}
811
	template valarray operator< (const T& lhs, const valarray& rhs){
812
		valarray retval(rhs.size());
813
		for(size_t i = 0; i 
814
			retval[i] = lhs < rhs[i];
815
		}
816
		return retval;
817
	}
818
	template valarray operator> (const valarray& lhs, const valarray& rhs){
819
		valarray retval(lhs.size());
820
		for(size_t i = 0; i 
821
			retval[i] = lhs[i] > rhs[i];
822
		}
823
		return retval;
824
	}
825
	template valarray operator> (const valarray& lhs, const T& rhs){
826
		valarray retval(lhs.size());
827
		for(size_t i = 0; i 
828
			retval[i] = lhs[i] > rhs;
829
		}
830
		return retval;
831
	}
832
	template valarray operator> (const T& lhs, const valarray& rhs){
833
		valarray retval(rhs.size());
834
		for(size_t i = 0; i 
835
			retval[i] = lhs > rhs[i];
836
		}
837
		return retval;
838
	}
839
	template valarray operator<=(const valarray& lhs, const valarray& rhs){
840
		valarray retval(lhs.size());
841
		for(size_t i = 0; i 
842
			retval[i] = lhs[i] <= rhs[i];
843
		}
844
		return retval;
845
	}
846
	template valarray operator<=(const valarray& lhs, const T& rhs){
847
		valarray retval(lhs.size());
848
		for(size_t i = 0; i 
849
			retval[i] = lhs[i] <= rhs;
850
		}
851
		return retval;
852
	}
853
	template valarray operator<=(const T& lhs, const valarray& rhs){
854
		valarray retval(rhs.size());
855
		for(size_t i = 0; i 
856
			retval[i] = lhs <= rhs[i];
857
		}
858
		return retval;
859
	}
860
	template valarray operator>=(const valarray& lhs, const valarray& rhs){
861
		valarray retval(lhs.size());
862
		for(size_t i = 0; i 
863
			retval[i] = lhs[i] >= rhs[i];
864
		}
865
		return retval;
866
	}
867
	template valarray operator>=(const valarray& lhs, const T& rhs){
868
		valarray retval(lhs.size());
869
		for(size_t i = 0; i 
870
			retval[i] = lhs[i] >= rhs;
871
		}
872
		return retval;
873
	}
874
	template valarray operator>=(const T& lhs, const valarray& rhs){
875
		valarray retval(rhs.size());
876
		for(size_t i = 0; i 
877
			retval[i] = lhs >= rhs[i];
878
		}
879
		return retval;
880
	}
881
	template T min(const valarray& x){
882
		T retval(x[0]);
883
		for(size_t i = 1; i < x.size(); ++i){
884
			if(x[i] < retval){
885
				retval = x[i];
886
			}
887
		}
888
	}
889
	template T max(const valarray& x){
890
		T retval(x[0]);
891
		for(size_t i = 1; i < x.size(); ++i){
892
			if(x[i] > retval){
893
				retval = x[i];
894
			}
895
		}
896
	}
897
 
898
	template valarray abs  (const valarray& x){
899
		valarray retval(x.size());
900
		for(size_t i = 0; i < retval.size(); ++i){
901
			retval[i] = abs(x[i]);
902
		}
903
		return retval;
904
	}
905
	template valarray acos (const valarray& x){
906
		valarray retval(x.size());
907
		for(size_t i = 0; i < retval.size(); ++i){
908
			retval[i] = acos(x[i]);
909
		}
910
		return retval;
911
	}
912
	template valarray asin (const valarray& x){
913
		valarray retval(x.size());
914
		for(size_t i = 0; i < retval.size(); ++i){
915
			retval[i] = asin(x[i]);
916
		}
917
		return retval;
918
	}
919
	template valarray atan (const valarray& x){
920
		valarray retval(x.size());
921
		for(size_t i = 0; i < retval.size(); ++i){
922
			retval[i] = atan(x[i]);
923
		}
924
		return retval;
925
	}
926
	template valarray atan2(const valarray& y, const valarray& x){
927
		valarray retval(y.size());
928
		for(size_t i = 0; i < retval.size(); ++i){
929
			retval[i] = atan2(y[i], x[i]);
930
		}
931
		return retval;
932
	}
933
	template valarray atan2(const valarray& y, const T& x){
934
		valarray retval(y.size());
935
		for(size_t i = 0; i < retval.size(); ++i){
936
			retval[i] = atan2(y[i], x);
937
		}
938
		return retval;
939
	}
940
	template valarray atan2(const T& y, const valarray& x){
941
		valarray retval(x.size());
942
		for(size_t i = 0; i < retval.size(); ++i){
943
			retval[i] = atan2(y, x[i]);
944
		}
945
		return retval;
946
	}
947
	template valarray cos  (const valarray& x){
948
		valarray retval(x.size());
949
		for(size_t i = 0; i < retval.size(); ++i){
950
			retval[i] = cos(x[i]);
951
		}
952
		return retval;
953
	}
954
	template valarray cosh (const valarray& x){
955
		valarray retval(x.size());
956
		for(size_t i = 0; i < retval.size(); ++i){
957
			retval[i] = cosh(x[i]);
958
		}
959
		return retval;
960
	}
961
	template valarray exp  (const valarray& x){
962
		valarray retval(x.size());
963
		for(size_t i = 0; i < retval.size(); ++i){
964
			retval[i] = exp(x[i]);
965
		}
966
		return retval;
967
	}
968
	template valarray log  (const valarray& x){
969
		valarray retval(x.size());
970
		for(size_t i = 0; i < retval.size(); ++i){
971
			retval[i] = log(x[i]);
972
		}
973
		return retval;
974
	}
975
	template valarray log10(const valarray& x){
976
		valarray retval(x.size());
977
		for(size_t i = 0; i < retval.size(); ++i){
978
			retval[i] = log10(x[i]);
979
		}
980
		return retval;
981
	}
982
	template valarray pow  (const valarray& x, const valarray& y){
983
		valarray retval(x.size());
984
		for(size_t i = 0; i < retval.size(); ++i){
985
			retval[i] = pow(x[i], y[i]);
986
		}
987
		return retval;
988
	}
989
	template valarray pow  (const valarray& x, const T& y){
990
		valarray retval(x.size());
991
		for(size_t i = 0; i < retval.size(); ++i){
992
			retval[i] = pow(x[i], y);
993
		}
994
		return retval;
995
	}
996
	template valarray pow  (const T& x, const valarray& y){
997
		valarray retval(y.size());
998
		for(size_t i = 0; i < retval.size(); ++i){
999
			retval[i] = pow(x, y[i]);
1000
		}
1001
		return retval;
1002
	}
1003
	template valarray sin  (const valarray& x){
1004
		valarray retval(x.size());
1005
		for(size_t i = 0; i < retval.size(); ++i){
1006
			retval[i] = sin(x[i]);
1007
		}
1008
		return retval;
1009
	}
1010
	template valarray sinh (const valarray& x){
1011
		valarray retval(x.size());
1012
		for(size_t i = 0; i < retval.size(); ++i){
1013
			retval[i] = sinh(x[i]);
1014
		}
1015
		return retval;
1016
	}
1017
	template valarray sqrt (const valarray& x){
1018
		valarray retval(x.size());
1019
		for(size_t i = 0; i < retval.size(); ++i){
1020
			retval[i] = sqrt(x[i]);
1021
		}
1022
		return retval;
1023
	}
1024
	template valarray tan  (const valarray& x){
1025
		valarray retval(x.size());
1026
		for(size_t i = 0; i < retval.size(); ++i){
1027
			retval[i] = tan(x[i]);
1028
		}
1029
		return retval;
1030
	}
1031
	template valarray tanh (const valarray& x){
1032
		valarray retval(x.size());
1033
		for(size_t i = 0; i < retval.size(); ++i){
1034
			retval[i] = tanh(x[i]);
1035
		}
1036
		return retval;
1037
	}
1038
}
1039
 
1040
#pragma GCC visibility pop
1041
 
1042
#endif