]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/valarray
Update clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0 release:
[FreeBSD/FreeBSD.git] / contrib / libc++ / include / valarray
1 // -*- C++ -*-
2 //===-------------------------- valarray ----------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_VALARRAY
12 #define _LIBCPP_VALARRAY
13
14 /*
15     valarray synopsis
16
17 namespace std
18 {
19
20 template<class T>
21 class valarray
22 {
23 public:
24     typedef T value_type;
25
26     // construct/destroy:
27     valarray();
28     explicit valarray(size_t n);
29     valarray(const value_type& x, size_t n);
30     valarray(const value_type* px, size_t n);
31     valarray(const valarray& v);
32     valarray(valarray&& v) noexcept;
33     valarray(const slice_array<value_type>& sa);
34     valarray(const gslice_array<value_type>& ga);
35     valarray(const mask_array<value_type>& ma);
36     valarray(const indirect_array<value_type>& ia);
37     valarray(initializer_list<value_type> il);
38     ~valarray();
39
40     // assignment:
41     valarray& operator=(const valarray& v);
42     valarray& operator=(valarray&& v) noexcept;
43     valarray& operator=(initializer_list<value_type> il);
44     valarray& operator=(const value_type& x);
45     valarray& operator=(const slice_array<value_type>& sa);
46     valarray& operator=(const gslice_array<value_type>& ga);
47     valarray& operator=(const mask_array<value_type>& ma);
48     valarray& operator=(const indirect_array<value_type>& ia);
49
50     // element access:
51     const value_type& operator[](size_t i) const;
52     value_type&       operator[](size_t i);
53
54     // subset operations:
55     valarray                   operator[](slice s) const;
56     slice_array<value_type>    operator[](slice s);
57     valarray                   operator[](const gslice& gs) const;
58     gslice_array<value_type>   operator[](const gslice& gs);
59     valarray                   operator[](const valarray<bool>& vb) const;
60     mask_array<value_type>     operator[](const valarray<bool>& vb);
61     valarray                   operator[](const valarray<size_t>& vs) const;
62     indirect_array<value_type> operator[](const valarray<size_t>& vs);
63
64     // unary operators:
65     valarray       operator+() const;
66     valarray       operator-() const;
67     valarray       operator~() const;
68     valarray<bool> operator!() const;
69
70     // computed assignment:
71     valarray& operator*= (const value_type& x);
72     valarray& operator/= (const value_type& x);
73     valarray& operator%= (const value_type& x);
74     valarray& operator+= (const value_type& x);
75     valarray& operator-= (const value_type& x);
76     valarray& operator^= (const value_type& x);
77     valarray& operator&= (const value_type& x);
78     valarray& operator|= (const value_type& x);
79     valarray& operator<<=(const value_type& x);
80     valarray& operator>>=(const value_type& x);
81
82     valarray& operator*= (const valarray& v);
83     valarray& operator/= (const valarray& v);
84     valarray& operator%= (const valarray& v);
85     valarray& operator+= (const valarray& v);
86     valarray& operator-= (const valarray& v);
87     valarray& operator^= (const valarray& v);
88     valarray& operator|= (const valarray& v);
89     valarray& operator&= (const valarray& v);
90     valarray& operator<<=(const valarray& v);
91     valarray& operator>>=(const valarray& v);
92
93     // member functions:
94     void swap(valarray& v) noexcept;
95
96     size_t size() const;
97
98     value_type sum() const;
99     value_type min() const;
100     value_type max() const;
101
102     valarray shift (int i) const;
103     valarray cshift(int i) const;
104     valarray apply(value_type f(value_type)) const;
105     valarray apply(value_type f(const value_type&)) const;
106     void resize(size_t n, value_type x = value_type());
107 };
108
109 class slice
110 {
111 public:
112     slice();
113     slice(size_t start, size_t size, size_t stride);
114
115     size_t start()  const;
116     size_t size()   const;
117     size_t stride() const;
118 };
119
120 template <class T>
121 class slice_array
122 {
123 public:
124     typedef T value_type;
125
126     const slice_array& operator=(const slice_array& sa) const;
127     void operator=  (const valarray<value_type>& v) const;
128     void operator*= (const valarray<value_type>& v) const;
129     void operator/= (const valarray<value_type>& v) const;
130     void operator%= (const valarray<value_type>& v) const;
131     void operator+= (const valarray<value_type>& v) const;
132     void operator-= (const valarray<value_type>& v) const;
133     void operator^= (const valarray<value_type>& v) const;
134     void operator&= (const valarray<value_type>& v) const;
135     void operator|= (const valarray<value_type>& v) const;
136     void operator<<=(const valarray<value_type>& v) const;
137     void operator>>=(const valarray<value_type>& v) const;
138
139     void operator=(const value_type& x) const;
140
141     slice_array() = delete;
142 };
143
144 class gslice
145 {
146 public:
147     gslice();
148     gslice(size_t start, const valarray<size_t>& size,
149                          const valarray<size_t>& stride);
150
151     size_t           start()  const;
152     valarray<size_t> size()   const;
153     valarray<size_t> stride() const;
154 };
155
156 template <class T>
157 class gslice_array
158 {
159 public:
160     typedef T value_type;
161
162     void operator=  (const valarray<value_type>& v) const;
163     void operator*= (const valarray<value_type>& v) const;
164     void operator/= (const valarray<value_type>& v) const;
165     void operator%= (const valarray<value_type>& v) const;
166     void operator+= (const valarray<value_type>& v) const;
167     void operator-= (const valarray<value_type>& v) const;
168     void operator^= (const valarray<value_type>& v) const;
169     void operator&= (const valarray<value_type>& v) const;
170     void operator|= (const valarray<value_type>& v) const;
171     void operator<<=(const valarray<value_type>& v) const;
172     void operator>>=(const valarray<value_type>& v) const;
173
174     gslice_array(const gslice_array& ga);
175     ~gslice_array();
176     const gslice_array& operator=(const gslice_array& ga) const;
177     void operator=(const value_type& x) const;
178
179     gslice_array() = delete;
180 };
181
182 template <class T>
183 class mask_array
184 {
185 public:
186     typedef T value_type;
187
188     void operator=  (const valarray<value_type>& v) const;
189     void operator*= (const valarray<value_type>& v) const;
190     void operator/= (const valarray<value_type>& v) const;
191     void operator%= (const valarray<value_type>& v) const;
192     void operator+= (const valarray<value_type>& v) const;
193     void operator-= (const valarray<value_type>& v) const;
194     void operator^= (const valarray<value_type>& v) const;
195     void operator&= (const valarray<value_type>& v) const;
196     void operator|= (const valarray<value_type>& v) const;
197     void operator<<=(const valarray<value_type>& v) const;
198     void operator>>=(const valarray<value_type>& v) const;
199
200     mask_array(const mask_array& ma);
201     ~mask_array();
202     const mask_array& operator=(const mask_array& ma) const;
203     void operator=(const value_type& x) const;
204
205     mask_array() = delete;
206 };
207
208 template <class T>
209 class indirect_array
210 {
211 public:
212     typedef T value_type;
213
214     void operator=  (const valarray<value_type>& v) const;
215     void operator*= (const valarray<value_type>& v) const;
216     void operator/= (const valarray<value_type>& v) const;
217     void operator%= (const valarray<value_type>& v) const;
218     void operator+= (const valarray<value_type>& v) const;
219     void operator-= (const valarray<value_type>& v) const;
220     void operator^= (const valarray<value_type>& v) const;
221     void operator&= (const valarray<value_type>& v) const;
222     void operator|= (const valarray<value_type>& v) const;
223     void operator<<=(const valarray<value_type>& v) const;
224     void operator>>=(const valarray<value_type>& v) const;
225
226     indirect_array(const indirect_array& ia);
227     ~indirect_array();
228     const indirect_array& operator=(const indirect_array& ia) const;
229     void operator=(const value_type& x) const;
230
231     indirect_array() = delete;
232 };
233
234 template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
235
236 template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
237 template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
238 template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
239
240 template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
241 template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
242 template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
243
244 template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
245 template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
246 template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
247
248 template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
249 template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
250 template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
251
252 template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
253 template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
254 template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
255
256 template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
257 template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
258 template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
259
260 template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
261 template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
262 template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
263
264 template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
265 template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
266 template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
267
268 template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
269 template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
270 template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
271
272 template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
273 template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
274 template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
275
276 template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
277 template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
278 template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
279
280 template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
281 template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
282 template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
283
284 template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
285 template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
286 template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
287
288 template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
289 template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
290 template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
291
292 template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
293 template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
294 template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
295
296 template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
297 template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
298 template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
299
300 template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
301 template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
302 template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
303
304 template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
305 template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
306 template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
307
308 template<class T> valarray<T> abs (const valarray<T>& x);
309 template<class T> valarray<T> acos (const valarray<T>& x);
310 template<class T> valarray<T> asin (const valarray<T>& x);
311 template<class T> valarray<T> atan (const valarray<T>& x);
312
313 template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
314 template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
315 template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
316
317 template<class T> valarray<T> cos (const valarray<T>& x);
318 template<class T> valarray<T> cosh (const valarray<T>& x);
319 template<class T> valarray<T> exp (const valarray<T>& x);
320 template<class T> valarray<T> log (const valarray<T>& x);
321 template<class T> valarray<T> log10(const valarray<T>& x);
322
323 template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
324 template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
325 template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
326
327 template<class T> valarray<T> sin (const valarray<T>& x);
328 template<class T> valarray<T> sinh (const valarray<T>& x);
329 template<class T> valarray<T> sqrt (const valarray<T>& x);
330 template<class T> valarray<T> tan (const valarray<T>& x);
331 template<class T> valarray<T> tanh (const valarray<T>& x);
332
333 template <class T> unspecified1 begin(valarray<T>& v);
334 template <class T> unspecified2 begin(const valarray<T>& v);
335 template <class T> unspecified1 end(valarray<T>& v);
336 template <class T> unspecified2 end(const valarray<T>& v);
337
338 }  // std
339
340 */
341
342 #include <__config>
343 #include <cstddef>
344 #include <cmath>
345 #include <initializer_list>
346 #include <algorithm>
347 #include <functional>
348 #include <new>
349
350 #include <__undef_min_max>
351
352 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
353 #pragma GCC system_header
354 #endif
355
356 _LIBCPP_BEGIN_NAMESPACE_STD
357
358 template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
359
360 class _LIBCPP_TEMPLATE_VIS slice
361 {
362     size_t __start_;
363     size_t __size_;
364     size_t __stride_;
365 public:
366     _LIBCPP_INLINE_VISIBILITY
367     slice()
368         : __start_(0),
369           __size_(0),
370           __stride_(0)
371           {}
372
373     _LIBCPP_INLINE_VISIBILITY
374     slice(size_t __start, size_t __size, size_t __stride)
375         : __start_(__start),
376           __size_(__size),
377           __stride_(__stride)
378           {}
379
380     _LIBCPP_INLINE_VISIBILITY size_t start()  const {return __start_;}
381     _LIBCPP_INLINE_VISIBILITY size_t size()   const {return __size_;}
382     _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
383 };
384
385 template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
386 class _LIBCPP_TYPE_VIS gslice;
387 template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
388 template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
389 template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
390
391 template <class _Tp>
392 _LIBCPP_INLINE_VISIBILITY
393 _Tp*
394 begin(valarray<_Tp>& __v);
395
396 template <class _Tp>
397 _LIBCPP_INLINE_VISIBILITY
398 const _Tp*
399 begin(const valarray<_Tp>& __v);
400
401 template <class _Tp>
402 _LIBCPP_INLINE_VISIBILITY
403 _Tp*
404 end(valarray<_Tp>& __v);
405
406 template <class _Tp>
407 _LIBCPP_INLINE_VISIBILITY
408 const _Tp*
409 end(const valarray<_Tp>& __v);
410
411 template <class _Op, class _A0>
412 struct _UnaryOp
413 {
414     typedef typename _Op::result_type result_type;
415     typedef typename _A0::value_type value_type;
416
417     _Op __op_;
418     _A0 __a0_;
419
420     _LIBCPP_INLINE_VISIBILITY
421     _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
422
423     _LIBCPP_INLINE_VISIBILITY
424     result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
425
426     _LIBCPP_INLINE_VISIBILITY
427     size_t size() const {return __a0_.size();}
428 };
429
430 template <class _Op, class _A0, class _A1>
431 struct _BinaryOp
432 {
433     typedef typename _Op::result_type result_type;
434     typedef typename _A0::value_type value_type;
435
436     _Op __op_;
437     _A0 __a0_;
438     _A1 __a1_;
439
440     _LIBCPP_INLINE_VISIBILITY
441     _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
442         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
443
444     _LIBCPP_INLINE_VISIBILITY
445     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
446
447     _LIBCPP_INLINE_VISIBILITY
448     size_t size() const {return __a0_.size();}
449 };
450
451 template <class _Tp>
452 class __scalar_expr
453 {
454 public:
455     typedef _Tp        value_type;
456     typedef const _Tp& result_type;
457 private:
458     const value_type& __t_;
459     size_t __s_;
460 public:
461     _LIBCPP_INLINE_VISIBILITY
462     explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
463
464     _LIBCPP_INLINE_VISIBILITY
465     result_type operator[](size_t) const {return __t_;}
466
467     _LIBCPP_INLINE_VISIBILITY
468     size_t size() const {return __s_;}
469 };
470
471 template <class _Tp>
472 struct __unary_plus : unary_function<_Tp, _Tp>
473 {
474     _LIBCPP_INLINE_VISIBILITY
475     _Tp operator()(const _Tp& __x) const
476         {return +__x;}
477 };
478
479 template <class _Tp>
480 struct __bit_not  : unary_function<_Tp, _Tp>
481 {
482     _LIBCPP_INLINE_VISIBILITY
483     _Tp operator()(const _Tp& __x) const
484         {return ~__x;}
485 };
486
487 template <class _Tp>
488 struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
489 {
490     _LIBCPP_INLINE_VISIBILITY
491     _Tp operator()(const _Tp& __x, const _Tp& __y) const
492         {return __x << __y;}
493 };
494
495 template <class _Tp>
496 struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
497 {
498     _LIBCPP_INLINE_VISIBILITY
499     _Tp operator()(const _Tp& __x, const _Tp& __y) const
500         {return __x >> __y;}
501 };
502
503 template <class _Tp, class _Fp>
504 struct __apply_expr   : unary_function<_Tp, _Tp>
505 {
506 private:
507     _Fp __f_;
508 public:
509     _LIBCPP_INLINE_VISIBILITY
510     explicit __apply_expr(_Fp __f) : __f_(__f) {}
511
512     _LIBCPP_INLINE_VISIBILITY
513     _Tp operator()(const _Tp& __x) const
514         {return __f_(__x);}
515 };
516
517 template <class _Tp>
518 struct __abs_expr : unary_function<_Tp, _Tp>
519 {
520     _LIBCPP_INLINE_VISIBILITY
521     _Tp operator()(const _Tp& __x) const
522         {return abs(__x);}
523 };
524
525 template <class _Tp>
526 struct __acos_expr : unary_function<_Tp, _Tp>
527 {
528     _LIBCPP_INLINE_VISIBILITY
529     _Tp operator()(const _Tp& __x) const
530         {return acos(__x);}
531 };
532
533 template <class _Tp>
534 struct __asin_expr : unary_function<_Tp, _Tp>
535 {
536     _LIBCPP_INLINE_VISIBILITY
537     _Tp operator()(const _Tp& __x) const
538         {return asin(__x);}
539 };
540
541 template <class _Tp>
542 struct __atan_expr : unary_function<_Tp, _Tp>
543 {
544     _LIBCPP_INLINE_VISIBILITY
545     _Tp operator()(const _Tp& __x) const
546         {return atan(__x);}
547 };
548
549 template <class _Tp>
550 struct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
551 {
552     _LIBCPP_INLINE_VISIBILITY
553     _Tp operator()(const _Tp& __x, const _Tp& __y) const
554         {return atan2(__x, __y);}
555 };
556
557 template <class _Tp>
558 struct __cos_expr : unary_function<_Tp, _Tp>
559 {
560     _LIBCPP_INLINE_VISIBILITY
561     _Tp operator()(const _Tp& __x) const
562         {return cos(__x);}
563 };
564
565 template <class _Tp>
566 struct __cosh_expr : unary_function<_Tp, _Tp>
567 {
568     _LIBCPP_INLINE_VISIBILITY
569     _Tp operator()(const _Tp& __x) const
570         {return cosh(__x);}
571 };
572
573 template <class _Tp>
574 struct __exp_expr : unary_function<_Tp, _Tp>
575 {
576     _LIBCPP_INLINE_VISIBILITY
577     _Tp operator()(const _Tp& __x) const
578         {return exp(__x);}
579 };
580
581 template <class _Tp>
582 struct __log_expr : unary_function<_Tp, _Tp>
583 {
584     _LIBCPP_INLINE_VISIBILITY
585     _Tp operator()(const _Tp& __x) const
586         {return log(__x);}
587 };
588
589 template <class _Tp>
590 struct __log10_expr : unary_function<_Tp, _Tp>
591 {
592     _LIBCPP_INLINE_VISIBILITY
593     _Tp operator()(const _Tp& __x) const
594         {return log10(__x);}
595 };
596
597 template <class _Tp>
598 struct __pow_expr : binary_function<_Tp, _Tp, _Tp>
599 {
600     _LIBCPP_INLINE_VISIBILITY
601     _Tp operator()(const _Tp& __x, const _Tp& __y) const
602         {return pow(__x, __y);}
603 };
604
605 template <class _Tp>
606 struct __sin_expr : unary_function<_Tp, _Tp>
607 {
608     _LIBCPP_INLINE_VISIBILITY
609     _Tp operator()(const _Tp& __x) const
610         {return sin(__x);}
611 };
612
613 template <class _Tp>
614 struct __sinh_expr : unary_function<_Tp, _Tp>
615 {
616     _LIBCPP_INLINE_VISIBILITY
617     _Tp operator()(const _Tp& __x) const
618         {return sinh(__x);}
619 };
620
621 template <class _Tp>
622 struct __sqrt_expr : unary_function<_Tp, _Tp>
623 {
624     _LIBCPP_INLINE_VISIBILITY
625     _Tp operator()(const _Tp& __x) const
626         {return sqrt(__x);}
627 };
628
629 template <class _Tp>
630 struct __tan_expr : unary_function<_Tp, _Tp>
631 {
632     _LIBCPP_INLINE_VISIBILITY
633     _Tp operator()(const _Tp& __x) const
634         {return tan(__x);}
635 };
636
637 template <class _Tp>
638 struct __tanh_expr : unary_function<_Tp, _Tp>
639 {
640     _LIBCPP_INLINE_VISIBILITY
641     _Tp operator()(const _Tp& __x) const
642         {return tanh(__x);}
643 };
644
645 template <class _ValExpr>
646 class __slice_expr
647 {
648     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
649 public:
650     typedef typename _RmExpr::value_type value_type;
651     typedef value_type result_type;
652
653 private:
654     _ValExpr __expr_;
655     size_t __start_;
656     size_t __size_;
657     size_t __stride_;
658
659     _LIBCPP_INLINE_VISIBILITY
660     __slice_expr(const slice& __sl, const _RmExpr& __e)
661         : __expr_(__e),
662           __start_(__sl.start()),
663           __size_(__sl.size()),
664           __stride_(__sl.stride())
665         {}
666 public:
667
668     _LIBCPP_INLINE_VISIBILITY
669     result_type operator[](size_t __i) const
670         {return __expr_[__start_ + __i * __stride_];}
671
672     _LIBCPP_INLINE_VISIBILITY
673     size_t size() const {return __size_;}
674
675     template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
676 };
677
678 template <class _ValExpr>
679 class __mask_expr;
680
681 template <class _ValExpr>
682 class __indirect_expr;
683
684 template <class _ValExpr>
685 class __shift_expr
686 {
687     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
688 public:
689     typedef typename _RmExpr::value_type value_type;
690     typedef value_type result_type;
691
692 private:
693     _ValExpr __expr_;
694     size_t __size_;
695     ptrdiff_t __ul_;
696     ptrdiff_t __sn_;
697     ptrdiff_t __n_;
698     static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
699                                     sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
700
701     _LIBCPP_INLINE_VISIBILITY
702     __shift_expr(int __n, const _RmExpr& __e)
703         : __expr_(__e),
704           __size_(__e.size()),
705           __n_(__n)
706         {
707             ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
708             __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
709             __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
710         }
711 public:
712
713     _LIBCPP_INLINE_VISIBILITY
714     result_type operator[](size_t __j) const
715         {
716             ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
717             ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
718             return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
719         }
720
721     _LIBCPP_INLINE_VISIBILITY
722     size_t size() const {return __size_;}
723
724     template <class> friend class __val_expr;
725 };
726
727 template <class _ValExpr>
728 class __cshift_expr
729 {
730     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
731 public:
732     typedef typename _RmExpr::value_type value_type;
733     typedef value_type result_type;
734
735 private:
736     _ValExpr __expr_;
737     size_t __size_;
738     size_t __m_;
739     size_t __o1_;
740     size_t __o2_;
741
742     _LIBCPP_INLINE_VISIBILITY
743     __cshift_expr(int __n, const _RmExpr& __e)
744         : __expr_(__e),
745           __size_(__e.size())
746         {
747             __n %= static_cast<int>(__size_);
748             if (__n >= 0)
749             {
750                 __m_ = __size_ - __n;
751                 __o1_ = __n;
752                 __o2_ = __n - __size_;
753             }
754             else
755             {
756                 __m_ = -__n;
757                 __o1_ = __n + __size_;
758                 __o2_ = __n;
759             }
760         }
761 public:
762
763     _LIBCPP_INLINE_VISIBILITY
764     result_type operator[](size_t __i) const
765         {
766             if (__i < __m_)
767                 return __expr_[__i + __o1_];
768             return __expr_[__i + __o2_];
769         }
770
771     _LIBCPP_INLINE_VISIBILITY
772     size_t size() const {return __size_;}
773
774     template <class> friend class __val_expr;
775 };
776
777 template<class _ValExpr>
778 class __val_expr;
779
780 template<class _ValExpr>
781 struct __is_val_expr : false_type {};
782
783 template<class _ValExpr>
784 struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
785
786 template<class _Tp>
787 struct __is_val_expr<valarray<_Tp> > : true_type {};
788
789 template<class _Tp>
790 class _LIBCPP_TEMPLATE_VIS valarray
791 {
792 public:
793     typedef _Tp value_type;
794     typedef _Tp result_type;
795
796 private:
797     value_type* __begin_;
798     value_type* __end_;
799
800 public:
801     // construct/destroy:
802     _LIBCPP_INLINE_VISIBILITY
803     valarray() : __begin_(0), __end_(0) {}
804     inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
805     explicit valarray(size_t __n);
806     _LIBCPP_INLINE_VISIBILITY
807     valarray(const value_type& __x, size_t __n);
808     valarray(const value_type* __p, size_t __n);
809     valarray(const valarray& __v);
810 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
811     _LIBCPP_INLINE_VISIBILITY
812     valarray(valarray&& __v) _NOEXCEPT;
813 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
814 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
815     valarray(initializer_list<value_type> __il);
816 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
817     valarray(const slice_array<value_type>& __sa);
818     valarray(const gslice_array<value_type>& __ga);
819     valarray(const mask_array<value_type>& __ma);
820     valarray(const indirect_array<value_type>& __ia);
821     inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
822     ~valarray();
823
824     // assignment:
825     valarray& operator=(const valarray& __v);
826 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
827     _LIBCPP_INLINE_VISIBILITY
828     valarray& operator=(valarray&& __v) _NOEXCEPT;
829 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
830 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
831     _LIBCPP_INLINE_VISIBILITY
832     valarray& operator=(initializer_list<value_type>);
833 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
834     _LIBCPP_INLINE_VISIBILITY
835     valarray& operator=(const value_type& __x);
836     _LIBCPP_INLINE_VISIBILITY
837     valarray& operator=(const slice_array<value_type>& __sa);
838     _LIBCPP_INLINE_VISIBILITY
839     valarray& operator=(const gslice_array<value_type>& __ga);
840     _LIBCPP_INLINE_VISIBILITY
841     valarray& operator=(const mask_array<value_type>& __ma);
842     _LIBCPP_INLINE_VISIBILITY
843     valarray& operator=(const indirect_array<value_type>& __ia);
844     template <class _ValExpr>
845         _LIBCPP_INLINE_VISIBILITY
846         valarray& operator=(const __val_expr<_ValExpr>& __v);
847
848     // element access:
849     _LIBCPP_INLINE_VISIBILITY
850     const value_type& operator[](size_t __i) const {return __begin_[__i];}
851
852     _LIBCPP_INLINE_VISIBILITY
853     value_type&       operator[](size_t __i)       {return __begin_[__i];}
854
855     // subset operations:
856     _LIBCPP_INLINE_VISIBILITY
857     __val_expr<__slice_expr<const valarray&> >    operator[](slice __s) const;
858     _LIBCPP_INLINE_VISIBILITY
859     slice_array<value_type>                       operator[](slice __s);
860     _LIBCPP_INLINE_VISIBILITY
861     __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
862     _LIBCPP_INLINE_VISIBILITY
863     gslice_array<value_type>   operator[](const gslice& __gs);
864 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
865     _LIBCPP_INLINE_VISIBILITY
866     __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
867     _LIBCPP_INLINE_VISIBILITY
868     gslice_array<value_type>                      operator[](gslice&& __gs);
869 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
870     _LIBCPP_INLINE_VISIBILITY
871     __val_expr<__mask_expr<const valarray&> >     operator[](const valarray<bool>& __vb) const;
872     _LIBCPP_INLINE_VISIBILITY
873     mask_array<value_type>                        operator[](const valarray<bool>& __vb);
874 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
875     _LIBCPP_INLINE_VISIBILITY
876     __val_expr<__mask_expr<const valarray&> >     operator[](valarray<bool>&& __vb) const;
877     _LIBCPP_INLINE_VISIBILITY
878     mask_array<value_type>                        operator[](valarray<bool>&& __vb);
879 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
880     _LIBCPP_INLINE_VISIBILITY
881     __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
882     _LIBCPP_INLINE_VISIBILITY
883     indirect_array<value_type>                    operator[](const valarray<size_t>& __vs);
884 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
885     _LIBCPP_INLINE_VISIBILITY
886     __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
887     _LIBCPP_INLINE_VISIBILITY
888     indirect_array<value_type>                    operator[](valarray<size_t>&& __vs);
889 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
890
891     // unary operators:
892     valarray       operator+() const;
893     valarray       operator-() const;
894     valarray       operator~() const;
895     valarray<bool> operator!() const;
896
897     // computed assignment:
898     _LIBCPP_INLINE_VISIBILITY
899     valarray& operator*= (const value_type& __x);
900     _LIBCPP_INLINE_VISIBILITY
901     valarray& operator/= (const value_type& __x);
902     _LIBCPP_INLINE_VISIBILITY
903     valarray& operator%= (const value_type& __x);
904     _LIBCPP_INLINE_VISIBILITY
905     valarray& operator+= (const value_type& __x);
906     _LIBCPP_INLINE_VISIBILITY
907     valarray& operator-= (const value_type& __x);
908     _LIBCPP_INLINE_VISIBILITY
909     valarray& operator^= (const value_type& __x);
910     _LIBCPP_INLINE_VISIBILITY
911     valarray& operator&= (const value_type& __x);
912     _LIBCPP_INLINE_VISIBILITY
913     valarray& operator|= (const value_type& __x);
914     _LIBCPP_INLINE_VISIBILITY
915     valarray& operator<<=(const value_type& __x);
916     _LIBCPP_INLINE_VISIBILITY
917     valarray& operator>>=(const value_type& __x);
918
919     template <class _Expr>
920     typename enable_if
921     <
922         __is_val_expr<_Expr>::value,
923         valarray&
924     >::type
925     _LIBCPP_INLINE_VISIBILITY
926     operator*= (const _Expr& __v);
927
928     template <class _Expr>
929     typename enable_if
930     <
931         __is_val_expr<_Expr>::value,
932         valarray&
933     >::type
934     _LIBCPP_INLINE_VISIBILITY
935     operator/= (const _Expr& __v);
936
937     template <class _Expr>
938     typename enable_if
939     <
940         __is_val_expr<_Expr>::value,
941         valarray&
942     >::type
943     _LIBCPP_INLINE_VISIBILITY
944     operator%= (const _Expr& __v);
945
946     template <class _Expr>
947     typename enable_if
948     <
949         __is_val_expr<_Expr>::value,
950         valarray&
951     >::type
952     _LIBCPP_INLINE_VISIBILITY
953     operator+= (const _Expr& __v);
954
955     template <class _Expr>
956     typename enable_if
957     <
958         __is_val_expr<_Expr>::value,
959         valarray&
960     >::type
961     _LIBCPP_INLINE_VISIBILITY
962     operator-= (const _Expr& __v);
963
964     template <class _Expr>
965     typename enable_if
966     <
967         __is_val_expr<_Expr>::value,
968         valarray&
969     >::type
970     _LIBCPP_INLINE_VISIBILITY
971     operator^= (const _Expr& __v);
972
973     template <class _Expr>
974     typename enable_if
975     <
976         __is_val_expr<_Expr>::value,
977         valarray&
978     >::type
979     _LIBCPP_INLINE_VISIBILITY
980     operator|= (const _Expr& __v);
981
982     template <class _Expr>
983     typename enable_if
984     <
985         __is_val_expr<_Expr>::value,
986         valarray&
987     >::type
988     _LIBCPP_INLINE_VISIBILITY
989     operator&= (const _Expr& __v);
990
991     template <class _Expr>
992     typename enable_if
993     <
994         __is_val_expr<_Expr>::value,
995         valarray&
996     >::type
997     _LIBCPP_INLINE_VISIBILITY
998     operator<<= (const _Expr& __v);
999
1000     template <class _Expr>
1001     typename enable_if
1002     <
1003         __is_val_expr<_Expr>::value,
1004         valarray&
1005     >::type
1006     _LIBCPP_INLINE_VISIBILITY
1007     operator>>= (const _Expr& __v);
1008
1009     // member functions:
1010     _LIBCPP_INLINE_VISIBILITY
1011     void swap(valarray& __v) _NOEXCEPT;
1012
1013     _LIBCPP_INLINE_VISIBILITY
1014     size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
1015
1016     _LIBCPP_INLINE_VISIBILITY
1017     value_type sum() const;
1018     _LIBCPP_INLINE_VISIBILITY
1019     value_type min() const;
1020     _LIBCPP_INLINE_VISIBILITY
1021     value_type max() const;
1022
1023     valarray shift (int __i) const;
1024     valarray cshift(int __i) const;
1025     valarray apply(value_type __f(value_type)) const;
1026     valarray apply(value_type __f(const value_type&)) const;
1027     void     resize(size_t __n, value_type __x = value_type());
1028
1029 private:
1030     template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1031     template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1032     template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1033     template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
1034     template <class> friend class __mask_expr;
1035     template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
1036     template <class> friend class __indirect_expr;
1037     template <class> friend class __val_expr;
1038
1039     template <class _Up>
1040     friend
1041     _Up*
1042     begin(valarray<_Up>& __v);
1043
1044     template <class _Up>
1045     friend
1046     const _Up*
1047     begin(const valarray<_Up>& __v);
1048
1049     template <class _Up>
1050     friend
1051     _Up*
1052     end(valarray<_Up>& __v);
1053
1054     template <class _Up>
1055     friend
1056     const _Up*
1057     end(const valarray<_Up>& __v);
1058 };
1059
1060 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t))
1061 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray())
1062 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
1063
1064 template <class _Op, class _Tp>
1065 struct _UnaryOp<_Op, valarray<_Tp> >
1066 {
1067     typedef typename _Op::result_type result_type;
1068     typedef _Tp value_type;
1069
1070     _Op __op_;
1071     const valarray<_Tp>& __a0_;
1072
1073     _LIBCPP_INLINE_VISIBILITY
1074     _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1075
1076     _LIBCPP_INLINE_VISIBILITY
1077     result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
1078
1079     _LIBCPP_INLINE_VISIBILITY
1080     size_t size() const {return __a0_.size();}
1081 };
1082
1083 template <class _Op, class _Tp, class _A1>
1084 struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1085 {
1086     typedef typename _Op::result_type result_type;
1087     typedef _Tp value_type;
1088
1089     _Op __op_;
1090     const valarray<_Tp>& __a0_;
1091     _A1 __a1_;
1092
1093     _LIBCPP_INLINE_VISIBILITY
1094     _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1095         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1096
1097     _LIBCPP_INLINE_VISIBILITY
1098     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1099
1100     _LIBCPP_INLINE_VISIBILITY
1101     size_t size() const {return __a0_.size();}
1102 };
1103
1104 template <class _Op, class _A0, class _Tp>
1105 struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1106 {
1107     typedef typename _Op::result_type result_type;
1108     typedef _Tp value_type;
1109
1110     _Op __op_;
1111     _A0 __a0_;
1112     const valarray<_Tp>& __a1_;
1113
1114     _LIBCPP_INLINE_VISIBILITY
1115     _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1116         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1117
1118     _LIBCPP_INLINE_VISIBILITY
1119     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1120
1121     _LIBCPP_INLINE_VISIBILITY
1122     size_t size() const {return __a0_.size();}
1123 };
1124
1125 template <class _Op, class _Tp>
1126 struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1127 {
1128     typedef typename _Op::result_type result_type;
1129     typedef _Tp value_type;
1130
1131     _Op __op_;
1132     const valarray<_Tp>& __a0_;
1133     const valarray<_Tp>& __a1_;
1134
1135     _LIBCPP_INLINE_VISIBILITY
1136     _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1137         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1138
1139     _LIBCPP_INLINE_VISIBILITY
1140     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1141
1142     _LIBCPP_INLINE_VISIBILITY
1143     size_t size() const {return __a0_.size();}
1144 };
1145
1146 // slice_array
1147
1148 template <class _Tp>
1149 class _LIBCPP_TEMPLATE_VIS slice_array
1150 {
1151 public:
1152     typedef _Tp value_type;
1153
1154 private:
1155     value_type* __vp_;
1156     size_t __size_;
1157     size_t __stride_;
1158
1159 public:
1160     template <class _Expr>
1161     typename enable_if
1162     <
1163         __is_val_expr<_Expr>::value,
1164         void
1165     >::type
1166     _LIBCPP_INLINE_VISIBILITY
1167     operator=(const _Expr& __v) const;
1168
1169     template <class _Expr>
1170     typename enable_if
1171     <
1172         __is_val_expr<_Expr>::value,
1173         void
1174     >::type
1175     _LIBCPP_INLINE_VISIBILITY
1176     operator*=(const _Expr& __v) const;
1177
1178     template <class _Expr>
1179     typename enable_if
1180     <
1181         __is_val_expr<_Expr>::value,
1182         void
1183     >::type
1184     _LIBCPP_INLINE_VISIBILITY
1185     operator/=(const _Expr& __v) const;
1186
1187     template <class _Expr>
1188     typename enable_if
1189     <
1190         __is_val_expr<_Expr>::value,
1191         void
1192     >::type
1193     _LIBCPP_INLINE_VISIBILITY
1194     operator%=(const _Expr& __v) const;
1195
1196     template <class _Expr>
1197     typename enable_if
1198     <
1199         __is_val_expr<_Expr>::value,
1200         void
1201     >::type
1202     _LIBCPP_INLINE_VISIBILITY
1203     operator+=(const _Expr& __v) const;
1204
1205     template <class _Expr>
1206     typename enable_if
1207     <
1208         __is_val_expr<_Expr>::value,
1209         void
1210     >::type
1211     _LIBCPP_INLINE_VISIBILITY
1212     operator-=(const _Expr& __v) const;
1213
1214     template <class _Expr>
1215     typename enable_if
1216     <
1217         __is_val_expr<_Expr>::value,
1218         void
1219     >::type
1220     _LIBCPP_INLINE_VISIBILITY
1221     operator^=(const _Expr& __v) const;
1222
1223     template <class _Expr>
1224     typename enable_if
1225     <
1226         __is_val_expr<_Expr>::value,
1227         void
1228     >::type
1229     _LIBCPP_INLINE_VISIBILITY
1230     operator&=(const _Expr& __v) const;
1231
1232     template <class _Expr>
1233     typename enable_if
1234     <
1235         __is_val_expr<_Expr>::value,
1236         void
1237     >::type
1238     _LIBCPP_INLINE_VISIBILITY
1239     operator|=(const _Expr& __v) const;
1240
1241     template <class _Expr>
1242     typename enable_if
1243     <
1244         __is_val_expr<_Expr>::value,
1245         void
1246     >::type
1247     _LIBCPP_INLINE_VISIBILITY
1248     operator<<=(const _Expr& __v) const;
1249
1250     template <class _Expr>
1251     typename enable_if
1252     <
1253         __is_val_expr<_Expr>::value,
1254         void
1255     >::type
1256     _LIBCPP_INLINE_VISIBILITY
1257     operator>>=(const _Expr& __v) const;
1258
1259     _LIBCPP_INLINE_VISIBILITY
1260     const slice_array& operator=(const slice_array& __sa) const;
1261
1262     _LIBCPP_INLINE_VISIBILITY
1263     void operator=(const value_type& __x) const;
1264
1265 private:
1266     _LIBCPP_INLINE_VISIBILITY
1267     slice_array(const slice& __sl, const valarray<value_type>& __v)
1268         : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1269           __size_(__sl.size()),
1270           __stride_(__sl.stride())
1271         {}
1272
1273     template <class> friend class valarray;
1274     template <class> friend class sliceExpr;
1275 };
1276
1277 template <class _Tp>
1278 inline
1279 const slice_array<_Tp>&
1280 slice_array<_Tp>::operator=(const slice_array& __sa) const
1281 {
1282     value_type* __t = __vp_;
1283     const value_type* __s = __sa.__vp_;
1284     for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1285         *__t = *__s;
1286     return *this;
1287 }
1288
1289 template <class _Tp>
1290 template <class _Expr>
1291 inline
1292 typename enable_if
1293 <
1294     __is_val_expr<_Expr>::value,
1295     void
1296 >::type
1297 slice_array<_Tp>::operator=(const _Expr& __v) const
1298 {
1299     value_type* __t = __vp_;
1300     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1301         *__t = __v[__i];
1302 }
1303
1304 template <class _Tp>
1305 template <class _Expr>
1306 inline
1307 typename enable_if
1308 <
1309     __is_val_expr<_Expr>::value,
1310     void
1311 >::type
1312 slice_array<_Tp>::operator*=(const _Expr& __v) const
1313 {
1314     value_type* __t = __vp_;
1315     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1316         *__t *= __v[__i];
1317 }
1318
1319 template <class _Tp>
1320 template <class _Expr>
1321 inline
1322 typename enable_if
1323 <
1324     __is_val_expr<_Expr>::value,
1325     void
1326 >::type
1327 slice_array<_Tp>::operator/=(const _Expr& __v) const
1328 {
1329     value_type* __t = __vp_;
1330     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1331         *__t /= __v[__i];
1332 }
1333
1334 template <class _Tp>
1335 template <class _Expr>
1336 inline
1337 typename enable_if
1338 <
1339     __is_val_expr<_Expr>::value,
1340     void
1341 >::type
1342 slice_array<_Tp>::operator%=(const _Expr& __v) const
1343 {
1344     value_type* __t = __vp_;
1345     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1346         *__t %= __v[__i];
1347 }
1348
1349 template <class _Tp>
1350 template <class _Expr>
1351 inline
1352 typename enable_if
1353 <
1354     __is_val_expr<_Expr>::value,
1355     void
1356 >::type
1357 slice_array<_Tp>::operator+=(const _Expr& __v) const
1358 {
1359     value_type* __t = __vp_;
1360     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1361         *__t += __v[__i];
1362 }
1363
1364 template <class _Tp>
1365 template <class _Expr>
1366 inline
1367 typename enable_if
1368 <
1369     __is_val_expr<_Expr>::value,
1370     void
1371 >::type
1372 slice_array<_Tp>::operator-=(const _Expr& __v) const
1373 {
1374     value_type* __t = __vp_;
1375     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1376         *__t -= __v[__i];
1377 }
1378
1379 template <class _Tp>
1380 template <class _Expr>
1381 inline
1382 typename enable_if
1383 <
1384     __is_val_expr<_Expr>::value,
1385     void
1386 >::type
1387 slice_array<_Tp>::operator^=(const _Expr& __v) const
1388 {
1389     value_type* __t = __vp_;
1390     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1391         *__t ^= __v[__i];
1392 }
1393
1394 template <class _Tp>
1395 template <class _Expr>
1396 inline
1397 typename enable_if
1398 <
1399     __is_val_expr<_Expr>::value,
1400     void
1401 >::type
1402 slice_array<_Tp>::operator&=(const _Expr& __v) const
1403 {
1404     value_type* __t = __vp_;
1405     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1406         *__t &= __v[__i];
1407 }
1408
1409 template <class _Tp>
1410 template <class _Expr>
1411 inline
1412 typename enable_if
1413 <
1414     __is_val_expr<_Expr>::value,
1415     void
1416 >::type
1417 slice_array<_Tp>::operator|=(const _Expr& __v) const
1418 {
1419     value_type* __t = __vp_;
1420     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1421         *__t |= __v[__i];
1422 }
1423
1424 template <class _Tp>
1425 template <class _Expr>
1426 inline
1427 typename enable_if
1428 <
1429     __is_val_expr<_Expr>::value,
1430     void
1431 >::type
1432 slice_array<_Tp>::operator<<=(const _Expr& __v) const
1433 {
1434     value_type* __t = __vp_;
1435     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1436         *__t <<= __v[__i];
1437 }
1438
1439 template <class _Tp>
1440 template <class _Expr>
1441 inline
1442 typename enable_if
1443 <
1444     __is_val_expr<_Expr>::value,
1445     void
1446 >::type
1447 slice_array<_Tp>::operator>>=(const _Expr& __v) const
1448 {
1449     value_type* __t = __vp_;
1450     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1451         *__t >>= __v[__i];
1452 }
1453
1454 template <class _Tp>
1455 inline
1456 void
1457 slice_array<_Tp>::operator=(const value_type& __x) const
1458 {
1459     value_type* __t = __vp_;
1460     for (size_t __n = __size_; __n; --__n, __t += __stride_)
1461         *__t = __x;
1462 }
1463
1464 // gslice
1465
1466 class _LIBCPP_TYPE_VIS gslice
1467 {
1468     valarray<size_t> __size_;
1469     valarray<size_t> __stride_;
1470     valarray<size_t> __1d_;
1471
1472 public:
1473     _LIBCPP_INLINE_VISIBILITY
1474     gslice() {}
1475
1476     _LIBCPP_INLINE_VISIBILITY
1477     gslice(size_t __start, const valarray<size_t>& __size,
1478                            const valarray<size_t>& __stride)
1479         : __size_(__size),
1480           __stride_(__stride)
1481         {__init(__start);}
1482
1483 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1484
1485     _LIBCPP_INLINE_VISIBILITY
1486     gslice(size_t __start, const valarray<size_t>&  __size,
1487                                  valarray<size_t>&& __stride)
1488         : __size_(__size),
1489           __stride_(move(__stride))
1490         {__init(__start);}
1491
1492     _LIBCPP_INLINE_VISIBILITY
1493     gslice(size_t __start,       valarray<size_t>&& __size,
1494                            const valarray<size_t>&  __stride)
1495         : __size_(move(__size)),
1496           __stride_(__stride)
1497         {__init(__start);}
1498
1499     _LIBCPP_INLINE_VISIBILITY
1500     gslice(size_t __start,       valarray<size_t>&& __size,
1501                                  valarray<size_t>&& __stride)
1502         : __size_(move(__size)),
1503           __stride_(move(__stride))
1504         {__init(__start);}
1505
1506 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1507
1508 //  gslice(const gslice&)            = default;
1509 //  gslice(gslice&&)                 = default;
1510 //  gslice& operator=(const gslice&) = default;
1511 //  gslice& operator=(gslice&&)      = default;
1512
1513     _LIBCPP_INLINE_VISIBILITY
1514     size_t           start()  const {return __1d_.size() ? __1d_[0] : 0;}
1515
1516     _LIBCPP_INLINE_VISIBILITY
1517     valarray<size_t> size()   const {return __size_;}
1518
1519     _LIBCPP_INLINE_VISIBILITY
1520     valarray<size_t> stride() const {return __stride_;}
1521
1522 private:
1523     void __init(size_t __start);
1524
1525     template <class> friend class gslice_array;
1526     template <class> friend class valarray;
1527     template <class> friend class __val_expr;
1528 };
1529
1530 // gslice_array
1531
1532 template <class _Tp>
1533 class _LIBCPP_TEMPLATE_VIS gslice_array
1534 {
1535 public:
1536     typedef _Tp value_type;
1537
1538 private:
1539     value_type*      __vp_;
1540     valarray<size_t> __1d_;
1541
1542 public:
1543     template <class _Expr>
1544     typename enable_if
1545     <
1546         __is_val_expr<_Expr>::value,
1547         void
1548     >::type
1549     _LIBCPP_INLINE_VISIBILITY
1550     operator=(const _Expr& __v) const;
1551
1552     template <class _Expr>
1553     typename enable_if
1554     <
1555         __is_val_expr<_Expr>::value,
1556         void
1557     >::type
1558     _LIBCPP_INLINE_VISIBILITY
1559     operator*=(const _Expr& __v) const;
1560
1561     template <class _Expr>
1562     typename enable_if
1563     <
1564         __is_val_expr<_Expr>::value,
1565         void
1566     >::type
1567     _LIBCPP_INLINE_VISIBILITY
1568     operator/=(const _Expr& __v) const;
1569
1570     template <class _Expr>
1571     typename enable_if
1572     <
1573         __is_val_expr<_Expr>::value,
1574         void
1575     >::type
1576     _LIBCPP_INLINE_VISIBILITY
1577     operator%=(const _Expr& __v) const;
1578
1579     template <class _Expr>
1580     typename enable_if
1581     <
1582         __is_val_expr<_Expr>::value,
1583         void
1584     >::type
1585     _LIBCPP_INLINE_VISIBILITY
1586     operator+=(const _Expr& __v) const;
1587
1588     template <class _Expr>
1589     typename enable_if
1590     <
1591         __is_val_expr<_Expr>::value,
1592         void
1593     >::type
1594     _LIBCPP_INLINE_VISIBILITY
1595     operator-=(const _Expr& __v) const;
1596
1597     template <class _Expr>
1598     typename enable_if
1599     <
1600         __is_val_expr<_Expr>::value,
1601         void
1602     >::type
1603     _LIBCPP_INLINE_VISIBILITY
1604     operator^=(const _Expr& __v) const;
1605
1606     template <class _Expr>
1607     typename enable_if
1608     <
1609         __is_val_expr<_Expr>::value,
1610         void
1611     >::type
1612     _LIBCPP_INLINE_VISIBILITY
1613     operator&=(const _Expr& __v) const;
1614
1615     template <class _Expr>
1616     typename enable_if
1617     <
1618         __is_val_expr<_Expr>::value,
1619         void
1620     >::type
1621     _LIBCPP_INLINE_VISIBILITY
1622     operator|=(const _Expr& __v) const;
1623
1624     template <class _Expr>
1625     typename enable_if
1626     <
1627         __is_val_expr<_Expr>::value,
1628         void
1629     >::type
1630     _LIBCPP_INLINE_VISIBILITY
1631     operator<<=(const _Expr& __v) const;
1632
1633     template <class _Expr>
1634     typename enable_if
1635     <
1636         __is_val_expr<_Expr>::value,
1637         void
1638     >::type
1639     _LIBCPP_INLINE_VISIBILITY
1640     operator>>=(const _Expr& __v) const;
1641
1642     _LIBCPP_INLINE_VISIBILITY
1643     const gslice_array& operator=(const gslice_array& __ga) const;
1644
1645     _LIBCPP_INLINE_VISIBILITY
1646     void operator=(const value_type& __x) const;
1647
1648 //  gslice_array(const gslice_array&)            = default;
1649 //  gslice_array(gslice_array&&)                 = default;
1650 //  gslice_array& operator=(const gslice_array&) = default;
1651 //  gslice_array& operator=(gslice_array&&)      = default;
1652
1653 private:
1654     gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1655         : __vp_(const_cast<value_type*>(__v.__begin_)),
1656           __1d_(__gs.__1d_)
1657         {}
1658
1659 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1660     gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1661         : __vp_(const_cast<value_type*>(__v.__begin_)),
1662           __1d_(move(__gs.__1d_))
1663         {}
1664 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1665
1666     template <class> friend class valarray;
1667 };
1668
1669 template <class _Tp>
1670 template <class _Expr>
1671 inline
1672 typename enable_if
1673 <
1674     __is_val_expr<_Expr>::value,
1675     void
1676 >::type
1677 gslice_array<_Tp>::operator=(const _Expr& __v) const
1678 {
1679     typedef const size_t* _Ip;
1680     size_t __j = 0;
1681     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1682         __vp_[*__i] = __v[__j];
1683 }
1684
1685 template <class _Tp>
1686 template <class _Expr>
1687 inline
1688 typename enable_if
1689 <
1690     __is_val_expr<_Expr>::value,
1691     void
1692 >::type
1693 gslice_array<_Tp>::operator*=(const _Expr& __v) const
1694 {
1695     typedef const size_t* _Ip;
1696     size_t __j = 0;
1697     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1698         __vp_[*__i] *= __v[__j];
1699 }
1700
1701 template <class _Tp>
1702 template <class _Expr>
1703 inline
1704 typename enable_if
1705 <
1706     __is_val_expr<_Expr>::value,
1707     void
1708 >::type
1709 gslice_array<_Tp>::operator/=(const _Expr& __v) const
1710 {
1711     typedef const size_t* _Ip;
1712     size_t __j = 0;
1713     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1714         __vp_[*__i] /= __v[__j];
1715 }
1716
1717 template <class _Tp>
1718 template <class _Expr>
1719 inline
1720 typename enable_if
1721 <
1722     __is_val_expr<_Expr>::value,
1723     void
1724 >::type
1725 gslice_array<_Tp>::operator%=(const _Expr& __v) const
1726 {
1727     typedef const size_t* _Ip;
1728     size_t __j = 0;
1729     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1730         __vp_[*__i] %= __v[__j];
1731 }
1732
1733 template <class _Tp>
1734 template <class _Expr>
1735 inline
1736 typename enable_if
1737 <
1738     __is_val_expr<_Expr>::value,
1739     void
1740 >::type
1741 gslice_array<_Tp>::operator+=(const _Expr& __v) const
1742 {
1743     typedef const size_t* _Ip;
1744     size_t __j = 0;
1745     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1746         __vp_[*__i] += __v[__j];
1747 }
1748
1749 template <class _Tp>
1750 template <class _Expr>
1751 inline
1752 typename enable_if
1753 <
1754     __is_val_expr<_Expr>::value,
1755     void
1756 >::type
1757 gslice_array<_Tp>::operator-=(const _Expr& __v) const
1758 {
1759     typedef const size_t* _Ip;
1760     size_t __j = 0;
1761     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1762         __vp_[*__i] -= __v[__j];
1763 }
1764
1765 template <class _Tp>
1766 template <class _Expr>
1767 inline
1768 typename enable_if
1769 <
1770     __is_val_expr<_Expr>::value,
1771     void
1772 >::type
1773 gslice_array<_Tp>::operator^=(const _Expr& __v) const
1774 {
1775     typedef const size_t* _Ip;
1776     size_t __j = 0;
1777     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1778         __vp_[*__i] ^= __v[__j];
1779 }
1780
1781 template <class _Tp>
1782 template <class _Expr>
1783 inline
1784 typename enable_if
1785 <
1786     __is_val_expr<_Expr>::value,
1787     void
1788 >::type
1789 gslice_array<_Tp>::operator&=(const _Expr& __v) const
1790 {
1791     typedef const size_t* _Ip;
1792     size_t __j = 0;
1793     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1794         __vp_[*__i] &= __v[__j];
1795 }
1796
1797 template <class _Tp>
1798 template <class _Expr>
1799 inline
1800 typename enable_if
1801 <
1802     __is_val_expr<_Expr>::value,
1803     void
1804 >::type
1805 gslice_array<_Tp>::operator|=(const _Expr& __v) const
1806 {
1807     typedef const size_t* _Ip;
1808     size_t __j = 0;
1809     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1810         __vp_[*__i] |= __v[__j];
1811 }
1812
1813 template <class _Tp>
1814 template <class _Expr>
1815 inline
1816 typename enable_if
1817 <
1818     __is_val_expr<_Expr>::value,
1819     void
1820 >::type
1821 gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1822 {
1823     typedef const size_t* _Ip;
1824     size_t __j = 0;
1825     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1826         __vp_[*__i] <<= __v[__j];
1827 }
1828
1829 template <class _Tp>
1830 template <class _Expr>
1831 inline
1832 typename enable_if
1833 <
1834     __is_val_expr<_Expr>::value,
1835     void
1836 >::type
1837 gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1838 {
1839     typedef const size_t* _Ip;
1840     size_t __j = 0;
1841     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1842         __vp_[*__i] >>= __v[__j];
1843 }
1844
1845 template <class _Tp>
1846 inline
1847 const gslice_array<_Tp>&
1848 gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1849 {
1850     typedef const size_t* _Ip;
1851     const value_type* __s = __ga.__vp_;
1852     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1853             __i != __e; ++__i, ++__j)
1854         __vp_[*__i] = __s[*__j];
1855     return *this;
1856 }
1857
1858 template <class _Tp>
1859 inline
1860 void
1861 gslice_array<_Tp>::operator=(const value_type& __x) const
1862 {
1863     typedef const size_t* _Ip;
1864     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1865         __vp_[*__i] = __x;
1866 }
1867
1868 // mask_array
1869
1870 template <class _Tp>
1871 class _LIBCPP_TEMPLATE_VIS mask_array
1872 {
1873 public:
1874     typedef _Tp value_type;
1875
1876 private:
1877     value_type*      __vp_;
1878     valarray<size_t> __1d_;
1879
1880 public:
1881     template <class _Expr>
1882     typename enable_if
1883     <
1884         __is_val_expr<_Expr>::value,
1885         void
1886     >::type
1887     _LIBCPP_INLINE_VISIBILITY
1888     operator=(const _Expr& __v) const;
1889
1890     template <class _Expr>
1891     typename enable_if
1892     <
1893         __is_val_expr<_Expr>::value,
1894         void
1895     >::type
1896     _LIBCPP_INLINE_VISIBILITY
1897     operator*=(const _Expr& __v) const;
1898
1899     template <class _Expr>
1900     typename enable_if
1901     <
1902         __is_val_expr<_Expr>::value,
1903         void
1904     >::type
1905     _LIBCPP_INLINE_VISIBILITY
1906     operator/=(const _Expr& __v) const;
1907
1908     template <class _Expr>
1909     typename enable_if
1910     <
1911         __is_val_expr<_Expr>::value,
1912         void
1913     >::type
1914     _LIBCPP_INLINE_VISIBILITY
1915     operator%=(const _Expr& __v) const;
1916
1917     template <class _Expr>
1918     typename enable_if
1919     <
1920         __is_val_expr<_Expr>::value,
1921         void
1922     >::type
1923     _LIBCPP_INLINE_VISIBILITY
1924     operator+=(const _Expr& __v) const;
1925
1926     template <class _Expr>
1927     typename enable_if
1928     <
1929         __is_val_expr<_Expr>::value,
1930         void
1931     >::type
1932     _LIBCPP_INLINE_VISIBILITY
1933     operator-=(const _Expr& __v) const;
1934
1935     template <class _Expr>
1936     typename enable_if
1937     <
1938         __is_val_expr<_Expr>::value,
1939         void
1940     >::type
1941     _LIBCPP_INLINE_VISIBILITY
1942     operator^=(const _Expr& __v) const;
1943
1944     template <class _Expr>
1945     typename enable_if
1946     <
1947         __is_val_expr<_Expr>::value,
1948         void
1949     >::type
1950     _LIBCPP_INLINE_VISIBILITY
1951     operator&=(const _Expr& __v) const;
1952
1953     template <class _Expr>
1954     typename enable_if
1955     <
1956         __is_val_expr<_Expr>::value,
1957         void
1958     >::type
1959     _LIBCPP_INLINE_VISIBILITY
1960     operator|=(const _Expr& __v) const;
1961
1962     template <class _Expr>
1963     typename enable_if
1964     <
1965         __is_val_expr<_Expr>::value,
1966         void
1967     >::type
1968     _LIBCPP_INLINE_VISIBILITY
1969     operator<<=(const _Expr& __v) const;
1970
1971     template <class _Expr>
1972     typename enable_if
1973     <
1974         __is_val_expr<_Expr>::value,
1975         void
1976     >::type
1977     _LIBCPP_INLINE_VISIBILITY
1978     operator>>=(const _Expr& __v) const;
1979
1980     _LIBCPP_INLINE_VISIBILITY
1981     const mask_array& operator=(const mask_array& __ma) const;
1982
1983     _LIBCPP_INLINE_VISIBILITY
1984     void operator=(const value_type& __x) const;
1985
1986 //  mask_array(const mask_array&)            = default;
1987 //  mask_array(mask_array&&)                 = default;
1988 //  mask_array& operator=(const mask_array&) = default;
1989 //  mask_array& operator=(mask_array&&)      = default;
1990
1991 private:
1992     _LIBCPP_INLINE_VISIBILITY
1993     mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
1994         : __vp_(const_cast<value_type*>(__v.__begin_)),
1995           __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
1996           {
1997               size_t __j = 0;
1998               for (size_t __i = 0; __i < __vb.size(); ++__i)
1999                   if (__vb[__i])
2000                       __1d_[__j++] = __i;
2001           }
2002
2003     template <class> friend class valarray;
2004 };
2005
2006 template <class _Tp>
2007 template <class _Expr>
2008 inline
2009 typename enable_if
2010 <
2011     __is_val_expr<_Expr>::value,
2012     void
2013 >::type
2014 mask_array<_Tp>::operator=(const _Expr& __v) const
2015 {
2016     size_t __n = __1d_.size();
2017     for (size_t __i = 0; __i < __n; ++__i)
2018         __vp_[__1d_[__i]] = __v[__i];
2019 }
2020
2021 template <class _Tp>
2022 template <class _Expr>
2023 inline
2024 typename enable_if
2025 <
2026     __is_val_expr<_Expr>::value,
2027     void
2028 >::type
2029 mask_array<_Tp>::operator*=(const _Expr& __v) const
2030 {
2031     size_t __n = __1d_.size();
2032     for (size_t __i = 0; __i < __n; ++__i)
2033         __vp_[__1d_[__i]] *= __v[__i];
2034 }
2035
2036 template <class _Tp>
2037 template <class _Expr>
2038 inline
2039 typename enable_if
2040 <
2041     __is_val_expr<_Expr>::value,
2042     void
2043 >::type
2044 mask_array<_Tp>::operator/=(const _Expr& __v) const
2045 {
2046     size_t __n = __1d_.size();
2047     for (size_t __i = 0; __i < __n; ++__i)
2048         __vp_[__1d_[__i]] /= __v[__i];
2049 }
2050
2051 template <class _Tp>
2052 template <class _Expr>
2053 inline
2054 typename enable_if
2055 <
2056     __is_val_expr<_Expr>::value,
2057     void
2058 >::type
2059 mask_array<_Tp>::operator%=(const _Expr& __v) const
2060 {
2061     size_t __n = __1d_.size();
2062     for (size_t __i = 0; __i < __n; ++__i)
2063         __vp_[__1d_[__i]] %= __v[__i];
2064 }
2065
2066 template <class _Tp>
2067 template <class _Expr>
2068 inline
2069 typename enable_if
2070 <
2071     __is_val_expr<_Expr>::value,
2072     void
2073 >::type
2074 mask_array<_Tp>::operator+=(const _Expr& __v) const
2075 {
2076     size_t __n = __1d_.size();
2077     for (size_t __i = 0; __i < __n; ++__i)
2078         __vp_[__1d_[__i]] += __v[__i];
2079 }
2080
2081 template <class _Tp>
2082 template <class _Expr>
2083 inline
2084 typename enable_if
2085 <
2086     __is_val_expr<_Expr>::value,
2087     void
2088 >::type
2089 mask_array<_Tp>::operator-=(const _Expr& __v) const
2090 {
2091     size_t __n = __1d_.size();
2092     for (size_t __i = 0; __i < __n; ++__i)
2093         __vp_[__1d_[__i]] -= __v[__i];
2094 }
2095
2096 template <class _Tp>
2097 template <class _Expr>
2098 inline
2099 typename enable_if
2100 <
2101     __is_val_expr<_Expr>::value,
2102     void
2103 >::type
2104 mask_array<_Tp>::operator^=(const _Expr& __v) const
2105 {
2106     size_t __n = __1d_.size();
2107     for (size_t __i = 0; __i < __n; ++__i)
2108         __vp_[__1d_[__i]] ^= __v[__i];
2109 }
2110
2111 template <class _Tp>
2112 template <class _Expr>
2113 inline
2114 typename enable_if
2115 <
2116     __is_val_expr<_Expr>::value,
2117     void
2118 >::type
2119 mask_array<_Tp>::operator&=(const _Expr& __v) const
2120 {
2121     size_t __n = __1d_.size();
2122     for (size_t __i = 0; __i < __n; ++__i)
2123         __vp_[__1d_[__i]] &= __v[__i];
2124 }
2125
2126 template <class _Tp>
2127 template <class _Expr>
2128 inline
2129 typename enable_if
2130 <
2131     __is_val_expr<_Expr>::value,
2132     void
2133 >::type
2134 mask_array<_Tp>::operator|=(const _Expr& __v) const
2135 {
2136     size_t __n = __1d_.size();
2137     for (size_t __i = 0; __i < __n; ++__i)
2138         __vp_[__1d_[__i]] |= __v[__i];
2139 }
2140
2141 template <class _Tp>
2142 template <class _Expr>
2143 inline
2144 typename enable_if
2145 <
2146     __is_val_expr<_Expr>::value,
2147     void
2148 >::type
2149 mask_array<_Tp>::operator<<=(const _Expr& __v) const
2150 {
2151     size_t __n = __1d_.size();
2152     for (size_t __i = 0; __i < __n; ++__i)
2153         __vp_[__1d_[__i]] <<= __v[__i];
2154 }
2155
2156 template <class _Tp>
2157 template <class _Expr>
2158 inline
2159 typename enable_if
2160 <
2161     __is_val_expr<_Expr>::value,
2162     void
2163 >::type
2164 mask_array<_Tp>::operator>>=(const _Expr& __v) const
2165 {
2166     size_t __n = __1d_.size();
2167     for (size_t __i = 0; __i < __n; ++__i)
2168         __vp_[__1d_[__i]] >>= __v[__i];
2169 }
2170
2171 template <class _Tp>
2172 inline
2173 const mask_array<_Tp>&
2174 mask_array<_Tp>::operator=(const mask_array& __ma) const
2175 {
2176     size_t __n = __1d_.size();
2177     for (size_t __i = 0; __i < __n; ++__i)
2178         __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
2179     return *this;
2180 }
2181
2182 template <class _Tp>
2183 inline
2184 void
2185 mask_array<_Tp>::operator=(const value_type& __x) const
2186 {
2187     size_t __n = __1d_.size();
2188     for (size_t __i = 0; __i < __n; ++__i)
2189         __vp_[__1d_[__i]] = __x;
2190 }
2191
2192 template <class _ValExpr>
2193 class __mask_expr
2194 {
2195     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2196 public:
2197     typedef typename _RmExpr::value_type value_type;
2198     typedef value_type result_type;
2199
2200 private:
2201     _ValExpr __expr_;
2202     valarray<size_t> __1d_;
2203
2204     _LIBCPP_INLINE_VISIBILITY
2205     __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2206         : __expr_(__e),
2207           __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
2208           {
2209               size_t __j = 0;
2210               for (size_t __i = 0; __i < __vb.size(); ++__i)
2211                   if (__vb[__i])
2212                       __1d_[__j++] = __i;
2213           }
2214
2215 public:
2216     _LIBCPP_INLINE_VISIBILITY
2217     result_type operator[](size_t __i) const
2218         {return __expr_[__1d_[__i]];}
2219
2220     _LIBCPP_INLINE_VISIBILITY
2221     size_t size() const {return __1d_.size();}
2222
2223     template <class> friend class valarray;
2224 };
2225
2226 // indirect_array
2227
2228 template <class _Tp>
2229 class _LIBCPP_TEMPLATE_VIS indirect_array
2230 {
2231 public:
2232     typedef _Tp value_type;
2233
2234 private:
2235     value_type*      __vp_;
2236     valarray<size_t> __1d_;
2237
2238 public:
2239     template <class _Expr>
2240     typename enable_if
2241     <
2242         __is_val_expr<_Expr>::value,
2243         void
2244     >::type
2245     _LIBCPP_INLINE_VISIBILITY
2246     operator=(const _Expr& __v) const;
2247
2248     template <class _Expr>
2249     typename enable_if
2250     <
2251         __is_val_expr<_Expr>::value,
2252         void
2253     >::type
2254     _LIBCPP_INLINE_VISIBILITY
2255     operator*=(const _Expr& __v) const;
2256
2257     template <class _Expr>
2258     typename enable_if
2259     <
2260         __is_val_expr<_Expr>::value,
2261         void
2262     >::type
2263     _LIBCPP_INLINE_VISIBILITY
2264     operator/=(const _Expr& __v) const;
2265
2266     template <class _Expr>
2267     typename enable_if
2268     <
2269         __is_val_expr<_Expr>::value,
2270         void
2271     >::type
2272     _LIBCPP_INLINE_VISIBILITY
2273     operator%=(const _Expr& __v) const;
2274
2275     template <class _Expr>
2276     typename enable_if
2277     <
2278         __is_val_expr<_Expr>::value,
2279         void
2280     >::type
2281     _LIBCPP_INLINE_VISIBILITY
2282     operator+=(const _Expr& __v) const;
2283
2284     template <class _Expr>
2285     typename enable_if
2286     <
2287         __is_val_expr<_Expr>::value,
2288         void
2289     >::type
2290     _LIBCPP_INLINE_VISIBILITY
2291     operator-=(const _Expr& __v) const;
2292
2293     template <class _Expr>
2294     typename enable_if
2295     <
2296         __is_val_expr<_Expr>::value,
2297         void
2298     >::type
2299     _LIBCPP_INLINE_VISIBILITY
2300     operator^=(const _Expr& __v) const;
2301
2302     template <class _Expr>
2303     typename enable_if
2304     <
2305         __is_val_expr<_Expr>::value,
2306         void
2307     >::type
2308     _LIBCPP_INLINE_VISIBILITY
2309     operator&=(const _Expr& __v) const;
2310
2311     template <class _Expr>
2312     typename enable_if
2313     <
2314         __is_val_expr<_Expr>::value,
2315         void
2316     >::type
2317     _LIBCPP_INLINE_VISIBILITY
2318     operator|=(const _Expr& __v) const;
2319
2320     template <class _Expr>
2321     typename enable_if
2322     <
2323         __is_val_expr<_Expr>::value,
2324         void
2325     >::type
2326     _LIBCPP_INLINE_VISIBILITY
2327     operator<<=(const _Expr& __v) const;
2328
2329     template <class _Expr>
2330     typename enable_if
2331     <
2332         __is_val_expr<_Expr>::value,
2333         void
2334     >::type
2335     _LIBCPP_INLINE_VISIBILITY
2336     operator>>=(const _Expr& __v) const;
2337
2338     _LIBCPP_INLINE_VISIBILITY
2339     const indirect_array& operator=(const indirect_array& __ia) const;
2340
2341     _LIBCPP_INLINE_VISIBILITY
2342     void operator=(const value_type& __x) const;
2343
2344 //  indirect_array(const indirect_array&)            = default;
2345 //  indirect_array(indirect_array&&)                 = default;
2346 //  indirect_array& operator=(const indirect_array&) = default;
2347 //  indirect_array& operator=(indirect_array&&)      = default;
2348
2349 private:
2350      _LIBCPP_INLINE_VISIBILITY
2351    indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2352         : __vp_(const_cast<value_type*>(__v.__begin_)),
2353           __1d_(__ia)
2354         {}
2355
2356 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2357
2358     _LIBCPP_INLINE_VISIBILITY
2359     indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2360         : __vp_(const_cast<value_type*>(__v.__begin_)),
2361           __1d_(move(__ia))
2362         {}
2363
2364 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2365
2366     template <class> friend class valarray;
2367 };
2368
2369 template <class _Tp>
2370 template <class _Expr>
2371 inline
2372 typename enable_if
2373 <
2374     __is_val_expr<_Expr>::value,
2375     void
2376 >::type
2377 indirect_array<_Tp>::operator=(const _Expr& __v) const
2378 {
2379     size_t __n = __1d_.size();
2380     for (size_t __i = 0; __i < __n; ++__i)
2381         __vp_[__1d_[__i]] = __v[__i];
2382 }
2383
2384 template <class _Tp>
2385 template <class _Expr>
2386 inline
2387 typename enable_if
2388 <
2389     __is_val_expr<_Expr>::value,
2390     void
2391 >::type
2392 indirect_array<_Tp>::operator*=(const _Expr& __v) const
2393 {
2394     size_t __n = __1d_.size();
2395     for (size_t __i = 0; __i < __n; ++__i)
2396         __vp_[__1d_[__i]] *= __v[__i];
2397 }
2398
2399 template <class _Tp>
2400 template <class _Expr>
2401 inline
2402 typename enable_if
2403 <
2404     __is_val_expr<_Expr>::value,
2405     void
2406 >::type
2407 indirect_array<_Tp>::operator/=(const _Expr& __v) const
2408 {
2409     size_t __n = __1d_.size();
2410     for (size_t __i = 0; __i < __n; ++__i)
2411         __vp_[__1d_[__i]] /= __v[__i];
2412 }
2413
2414 template <class _Tp>
2415 template <class _Expr>
2416 inline
2417 typename enable_if
2418 <
2419     __is_val_expr<_Expr>::value,
2420     void
2421 >::type
2422 indirect_array<_Tp>::operator%=(const _Expr& __v) const
2423 {
2424     size_t __n = __1d_.size();
2425     for (size_t __i = 0; __i < __n; ++__i)
2426         __vp_[__1d_[__i]] %= __v[__i];
2427 }
2428
2429 template <class _Tp>
2430 template <class _Expr>
2431 inline
2432 typename enable_if
2433 <
2434     __is_val_expr<_Expr>::value,
2435     void
2436 >::type
2437 indirect_array<_Tp>::operator+=(const _Expr& __v) const
2438 {
2439     size_t __n = __1d_.size();
2440     for (size_t __i = 0; __i < __n; ++__i)
2441         __vp_[__1d_[__i]] += __v[__i];
2442 }
2443
2444 template <class _Tp>
2445 template <class _Expr>
2446 inline
2447 typename enable_if
2448 <
2449     __is_val_expr<_Expr>::value,
2450     void
2451 >::type
2452 indirect_array<_Tp>::operator-=(const _Expr& __v) const
2453 {
2454     size_t __n = __1d_.size();
2455     for (size_t __i = 0; __i < __n; ++__i)
2456         __vp_[__1d_[__i]] -= __v[__i];
2457 }
2458
2459 template <class _Tp>
2460 template <class _Expr>
2461 inline
2462 typename enable_if
2463 <
2464     __is_val_expr<_Expr>::value,
2465     void
2466 >::type
2467 indirect_array<_Tp>::operator^=(const _Expr& __v) const
2468 {
2469     size_t __n = __1d_.size();
2470     for (size_t __i = 0; __i < __n; ++__i)
2471         __vp_[__1d_[__i]] ^= __v[__i];
2472 }
2473
2474 template <class _Tp>
2475 template <class _Expr>
2476 inline
2477 typename enable_if
2478 <
2479     __is_val_expr<_Expr>::value,
2480     void
2481 >::type
2482 indirect_array<_Tp>::operator&=(const _Expr& __v) const
2483 {
2484     size_t __n = __1d_.size();
2485     for (size_t __i = 0; __i < __n; ++__i)
2486         __vp_[__1d_[__i]] &= __v[__i];
2487 }
2488
2489 template <class _Tp>
2490 template <class _Expr>
2491 inline
2492 typename enable_if
2493 <
2494     __is_val_expr<_Expr>::value,
2495     void
2496 >::type
2497 indirect_array<_Tp>::operator|=(const _Expr& __v) const
2498 {
2499     size_t __n = __1d_.size();
2500     for (size_t __i = 0; __i < __n; ++__i)
2501         __vp_[__1d_[__i]] |= __v[__i];
2502 }
2503
2504 template <class _Tp>
2505 template <class _Expr>
2506 inline
2507 typename enable_if
2508 <
2509     __is_val_expr<_Expr>::value,
2510     void
2511 >::type
2512 indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2513 {
2514     size_t __n = __1d_.size();
2515     for (size_t __i = 0; __i < __n; ++__i)
2516         __vp_[__1d_[__i]] <<= __v[__i];
2517 }
2518
2519 template <class _Tp>
2520 template <class _Expr>
2521 inline
2522 typename enable_if
2523 <
2524     __is_val_expr<_Expr>::value,
2525     void
2526 >::type
2527 indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2528 {
2529     size_t __n = __1d_.size();
2530     for (size_t __i = 0; __i < __n; ++__i)
2531         __vp_[__1d_[__i]] >>= __v[__i];
2532 }
2533
2534 template <class _Tp>
2535 inline
2536 const indirect_array<_Tp>&
2537 indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2538 {
2539     typedef const size_t* _Ip;
2540     const value_type* __s = __ia.__vp_;
2541     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2542             __i != __e; ++__i, ++__j)
2543         __vp_[*__i] = __s[*__j];
2544     return *this;
2545 }
2546
2547 template <class _Tp>
2548 inline
2549 void
2550 indirect_array<_Tp>::operator=(const value_type& __x) const
2551 {
2552     typedef const size_t* _Ip;
2553     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2554         __vp_[*__i] = __x;
2555 }
2556
2557 template <class _ValExpr>
2558 class __indirect_expr
2559 {
2560     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2561 public:
2562     typedef typename _RmExpr::value_type value_type;
2563     typedef value_type result_type;
2564
2565 private:
2566     _ValExpr __expr_;
2567     valarray<size_t> __1d_;
2568
2569     _LIBCPP_INLINE_VISIBILITY
2570     __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2571         : __expr_(__e),
2572           __1d_(__ia)
2573           {}
2574
2575 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2576
2577     _LIBCPP_INLINE_VISIBILITY
2578     __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2579         : __expr_(__e),
2580           __1d_(move(__ia))
2581           {}
2582
2583 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2584
2585 public:
2586     _LIBCPP_INLINE_VISIBILITY
2587     result_type operator[](size_t __i) const
2588         {return __expr_[__1d_[__i]];}
2589
2590     _LIBCPP_INLINE_VISIBILITY
2591     size_t size() const {return __1d_.size();}
2592
2593     template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
2594 };
2595
2596 template<class _ValExpr>
2597 class __val_expr
2598 {
2599     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2600
2601     _ValExpr __expr_;
2602 public:
2603     typedef typename _RmExpr::value_type value_type;
2604     typedef typename _RmExpr::result_type result_type;
2605
2606     _LIBCPP_INLINE_VISIBILITY
2607     explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2608
2609     _LIBCPP_INLINE_VISIBILITY
2610     result_type operator[](size_t __i) const
2611         {return __expr_[__i];}
2612
2613     _LIBCPP_INLINE_VISIBILITY
2614     __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
2615         {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);}
2616
2617     _LIBCPP_INLINE_VISIBILITY
2618     __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
2619         {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);}
2620
2621     _LIBCPP_INLINE_VISIBILITY
2622     __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
2623         {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);}
2624
2625     _LIBCPP_INLINE_VISIBILITY
2626     __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
2627         {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);}
2628
2629     _LIBCPP_INLINE_VISIBILITY
2630     __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2631     operator+() const
2632     {
2633         typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2634         return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2635     }
2636
2637     _LIBCPP_INLINE_VISIBILITY
2638     __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2639     operator-() const
2640     {
2641         typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2642         return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2643     }
2644
2645     _LIBCPP_INLINE_VISIBILITY
2646     __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2647     operator~() const
2648     {
2649         typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2650         return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2651     }
2652
2653     _LIBCPP_INLINE_VISIBILITY
2654     __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2655     operator!() const
2656     {
2657         typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2658         return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2659     }
2660
2661     operator valarray<result_type>() const;
2662
2663     _LIBCPP_INLINE_VISIBILITY
2664     size_t size() const {return __expr_.size();}
2665
2666     _LIBCPP_INLINE_VISIBILITY
2667     result_type sum() const
2668     {
2669         size_t __n = __expr_.size();
2670         result_type __r = __n ? __expr_[0] : result_type();
2671         for (size_t __i = 1; __i < __n; ++__i)
2672             __r += __expr_[__i];
2673         return __r;
2674     }
2675
2676     _LIBCPP_INLINE_VISIBILITY
2677     result_type min() const
2678     {
2679         size_t __n = size();
2680         result_type __r = __n ? (*this)[0] : result_type();
2681         for (size_t __i = 1; __i < __n; ++__i)
2682         {
2683             result_type __x = __expr_[__i];
2684             if (__x < __r)
2685                 __r = __x;
2686         }
2687         return __r;
2688     }
2689
2690     _LIBCPP_INLINE_VISIBILITY
2691     result_type max() const
2692     {
2693         size_t __n = size();
2694         result_type __r = __n ? (*this)[0] : result_type();
2695         for (size_t __i = 1; __i < __n; ++__i)
2696         {
2697             result_type __x = __expr_[__i];
2698             if (__r < __x)
2699                 __r = __x;
2700         }
2701         return __r;
2702     }
2703
2704     _LIBCPP_INLINE_VISIBILITY
2705     __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2706         {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2707
2708     _LIBCPP_INLINE_VISIBILITY
2709     __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2710         {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2711
2712     _LIBCPP_INLINE_VISIBILITY
2713     __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2714     apply(value_type __f(value_type)) const
2715     {
2716         typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2717         typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2718         return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2719     }
2720
2721     _LIBCPP_INLINE_VISIBILITY
2722     __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2723     apply(value_type __f(const value_type&)) const
2724     {
2725         typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2726         typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2727         return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2728     }
2729 };
2730
2731 template<class _ValExpr>
2732 __val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
2733 {
2734     valarray<result_type> __r;
2735     size_t __n = __expr_.size();
2736     if (__n)
2737     {
2738         __r.__begin_ =
2739             __r.__end_ =
2740                 static_cast<result_type*>(_VSTD::__allocate(__n * sizeof(result_type)));
2741         for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
2742             ::new (__r.__end_) result_type(__expr_[__i]);
2743     }
2744     return __r;
2745 }
2746
2747 // valarray
2748
2749 template <class _Tp>
2750 inline
2751 valarray<_Tp>::valarray(size_t __n)
2752     : __begin_(0),
2753       __end_(0)
2754 {
2755     resize(__n);
2756 }
2757
2758 template <class _Tp>
2759 inline
2760 valarray<_Tp>::valarray(const value_type& __x, size_t __n)
2761     : __begin_(0),
2762       __end_(0)
2763 {
2764     resize(__n, __x);
2765 }
2766
2767 template <class _Tp>
2768 valarray<_Tp>::valarray(const value_type* __p, size_t __n)
2769     : __begin_(0),
2770       __end_(0)
2771 {
2772     if (__n)
2773     {
2774         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
2775 #ifndef _LIBCPP_NO_EXCEPTIONS
2776         try
2777         {
2778 #endif  // _LIBCPP_NO_EXCEPTIONS
2779             for (; __n; ++__end_, ++__p, --__n)
2780                 ::new (__end_) value_type(*__p);
2781 #ifndef _LIBCPP_NO_EXCEPTIONS
2782         }
2783         catch (...)
2784         {
2785             resize(0);
2786             throw;
2787         }
2788 #endif  // _LIBCPP_NO_EXCEPTIONS
2789     }
2790 }
2791
2792 template <class _Tp>
2793 valarray<_Tp>::valarray(const valarray& __v)
2794     : __begin_(0),
2795       __end_(0)
2796 {
2797     if (__v.size())
2798     {
2799         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__v.size() * sizeof(value_type)));
2800 #ifndef _LIBCPP_NO_EXCEPTIONS
2801         try
2802         {
2803 #endif  // _LIBCPP_NO_EXCEPTIONS
2804             for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2805                 ::new (__end_) value_type(*__p);
2806 #ifndef _LIBCPP_NO_EXCEPTIONS
2807         }
2808         catch (...)
2809         {
2810             resize(0);
2811             throw;
2812         }
2813 #endif  // _LIBCPP_NO_EXCEPTIONS
2814     }
2815 }
2816
2817 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2818
2819 template <class _Tp>
2820 inline
2821 valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
2822     : __begin_(__v.__begin_),
2823       __end_(__v.__end_)
2824 {
2825     __v.__begin_ = __v.__end_ = nullptr;
2826 }
2827
2828 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2829
2830 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2831
2832 template <class _Tp>
2833 valarray<_Tp>::valarray(initializer_list<value_type> __il)
2834     : __begin_(0),
2835       __end_(0)
2836 {
2837     size_t __n = __il.size();
2838     if (__n)
2839     {
2840         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
2841 #ifndef _LIBCPP_NO_EXCEPTIONS
2842         try
2843         {
2844 #endif  // _LIBCPP_NO_EXCEPTIONS
2845             for (const value_type* __p = __il.begin(); __n; ++__end_, ++__p, --__n)
2846                 ::new (__end_) value_type(*__p);
2847 #ifndef _LIBCPP_NO_EXCEPTIONS
2848         }
2849         catch (...)
2850         {
2851             resize(0);
2852             throw;
2853         }
2854 #endif  // _LIBCPP_NO_EXCEPTIONS
2855     }
2856 }
2857
2858 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2859
2860 template <class _Tp>
2861 valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
2862     : __begin_(0),
2863       __end_(0)
2864 {
2865     size_t __n = __sa.__size_;
2866     if (__n)
2867     {
2868         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
2869 #ifndef _LIBCPP_NO_EXCEPTIONS
2870         try
2871         {
2872 #endif  // _LIBCPP_NO_EXCEPTIONS
2873             for (const value_type* __p = __sa.__vp_; __n; ++__end_, __p += __sa.__stride_, --__n)
2874                 ::new (__end_) value_type(*__p);
2875 #ifndef _LIBCPP_NO_EXCEPTIONS
2876         }
2877         catch (...)
2878         {
2879             resize(0);
2880             throw;
2881         }
2882 #endif  // _LIBCPP_NO_EXCEPTIONS
2883     }
2884 }
2885
2886 template <class _Tp>
2887 valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
2888     : __begin_(0),
2889       __end_(0)
2890 {
2891     size_t __n = __ga.__1d_.size();
2892     if (__n)
2893     {
2894         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
2895 #ifndef _LIBCPP_NO_EXCEPTIONS
2896         try
2897         {
2898 #endif  // _LIBCPP_NO_EXCEPTIONS
2899             typedef const size_t* _Ip;
2900             const value_type* __s = __ga.__vp_;
2901             for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2902                     __i != __e; ++__i, ++__end_)
2903                 ::new (__end_) value_type(__s[*__i]);
2904 #ifndef _LIBCPP_NO_EXCEPTIONS
2905         }
2906         catch (...)
2907         {
2908             resize(0);
2909             throw;
2910         }
2911 #endif  // _LIBCPP_NO_EXCEPTIONS
2912     }
2913 }
2914
2915 template <class _Tp>
2916 valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
2917     : __begin_(0),
2918       __end_(0)
2919 {
2920     size_t __n = __ma.__1d_.size();
2921     if (__n)
2922     {
2923         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
2924 #ifndef _LIBCPP_NO_EXCEPTIONS
2925         try
2926         {
2927 #endif  // _LIBCPP_NO_EXCEPTIONS
2928             typedef const size_t* _Ip;
2929             const value_type* __s = __ma.__vp_;
2930             for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
2931                     __i != __e; ++__i, ++__end_)
2932                 ::new (__end_) value_type(__s[*__i]);
2933 #ifndef _LIBCPP_NO_EXCEPTIONS
2934         }
2935         catch (...)
2936         {
2937             resize(0);
2938             throw;
2939         }
2940 #endif  // _LIBCPP_NO_EXCEPTIONS
2941     }
2942 }
2943
2944 template <class _Tp>
2945 valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
2946     : __begin_(0),
2947       __end_(0)
2948 {
2949     size_t __n = __ia.__1d_.size();
2950     if (__n)
2951     {
2952         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
2953 #ifndef _LIBCPP_NO_EXCEPTIONS
2954         try
2955         {
2956 #endif  // _LIBCPP_NO_EXCEPTIONS
2957             typedef const size_t* _Ip;
2958             const value_type* __s = __ia.__vp_;
2959             for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
2960                     __i != __e; ++__i, ++__end_)
2961                 ::new (__end_) value_type(__s[*__i]);
2962 #ifndef _LIBCPP_NO_EXCEPTIONS
2963         }
2964         catch (...)
2965         {
2966             resize(0);
2967             throw;
2968         }
2969 #endif  // _LIBCPP_NO_EXCEPTIONS
2970     }
2971 }
2972
2973 template <class _Tp>
2974 inline
2975 valarray<_Tp>::~valarray()
2976 {
2977     resize(0);
2978 }
2979
2980 template <class _Tp>
2981 valarray<_Tp>&
2982 valarray<_Tp>::operator=(const valarray& __v)
2983 {
2984     if (this != &__v)
2985     {
2986         if (size() != __v.size())
2987             resize(__v.size());
2988         _VSTD::copy(__v.__begin_, __v.__end_, __begin_);
2989     }
2990     return *this;
2991 }
2992
2993 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2994
2995 template <class _Tp>
2996 inline
2997 valarray<_Tp>&
2998 valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
2999 {
3000     resize(0);
3001     __begin_ = __v.__begin_;
3002     __end_ = __v.__end_;
3003     __v.__begin_ = nullptr;
3004     __v.__end_ = nullptr;
3005     return *this;
3006 }
3007
3008 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3009
3010 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
3011
3012 template <class _Tp>
3013 inline
3014 valarray<_Tp>&
3015 valarray<_Tp>::operator=(initializer_list<value_type> __il)
3016 {
3017     if (size() != __il.size())
3018         resize(__il.size());
3019     _VSTD::copy(__il.begin(), __il.end(), __begin_);
3020     return *this;
3021 }
3022
3023 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
3024
3025 template <class _Tp>
3026 inline
3027 valarray<_Tp>&
3028 valarray<_Tp>::operator=(const value_type& __x)
3029 {
3030     _VSTD::fill(__begin_, __end_, __x);
3031     return *this;
3032 }
3033
3034 template <class _Tp>
3035 inline
3036 valarray<_Tp>&
3037 valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3038 {
3039     value_type* __t = __begin_;
3040     const value_type* __s = __sa.__vp_;
3041     for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3042         *__t = *__s;
3043     return *this;
3044 }
3045
3046 template <class _Tp>
3047 inline
3048 valarray<_Tp>&
3049 valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3050 {
3051     typedef const size_t* _Ip;
3052     value_type* __t = __begin_;
3053     const value_type* __s = __ga.__vp_;
3054     for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3055                     __i != __e; ++__i, ++__t)
3056         *__t = __s[*__i];
3057     return *this;
3058 }
3059
3060 template <class _Tp>
3061 inline
3062 valarray<_Tp>&
3063 valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3064 {
3065     typedef const size_t* _Ip;
3066     value_type* __t = __begin_;
3067     const value_type* __s = __ma.__vp_;
3068     for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3069                     __i != __e; ++__i, ++__t)
3070         *__t = __s[*__i];
3071     return *this;
3072 }
3073
3074 template <class _Tp>
3075 inline
3076 valarray<_Tp>&
3077 valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3078 {
3079     typedef const size_t* _Ip;
3080     value_type* __t = __begin_;
3081     const value_type* __s = __ia.__vp_;
3082     for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3083                     __i != __e; ++__i, ++__t)
3084         *__t = __s[*__i];
3085     return *this;
3086 }
3087
3088 template <class _Tp>
3089 template <class _ValExpr>
3090 inline
3091 valarray<_Tp>&
3092 valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3093 {
3094     size_t __n = __v.size();
3095     if (size() != __n)
3096         resize(__n);
3097     value_type* __t = __begin_;
3098     for (size_t __i = 0; __i != __n; ++__t, ++__i)
3099         *__t = result_type(__v[__i]);
3100     return *this;
3101 }
3102
3103 template <class _Tp>
3104 inline
3105 __val_expr<__slice_expr<const valarray<_Tp>&> >
3106 valarray<_Tp>::operator[](slice __s) const
3107 {
3108     return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3109 }
3110
3111 template <class _Tp>
3112 inline
3113 slice_array<_Tp>
3114 valarray<_Tp>::operator[](slice __s)
3115 {
3116     return slice_array<value_type>(__s, *this);
3117 }
3118
3119 template <class _Tp>
3120 inline
3121 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3122 valarray<_Tp>::operator[](const gslice& __gs) const
3123 {
3124     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3125 }
3126
3127 template <class _Tp>
3128 inline
3129 gslice_array<_Tp>
3130 valarray<_Tp>::operator[](const gslice& __gs)
3131 {
3132     return gslice_array<value_type>(__gs, *this);
3133 }
3134
3135 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3136
3137 template <class _Tp>
3138 inline
3139 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3140 valarray<_Tp>::operator[](gslice&& __gs) const
3141 {
3142     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
3143 }
3144
3145 template <class _Tp>
3146 inline
3147 gslice_array<_Tp>
3148 valarray<_Tp>::operator[](gslice&& __gs)
3149 {
3150     return gslice_array<value_type>(move(__gs), *this);
3151 }
3152
3153 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3154
3155 template <class _Tp>
3156 inline
3157 __val_expr<__mask_expr<const valarray<_Tp>&> >
3158 valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3159 {
3160     return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3161 }
3162
3163 template <class _Tp>
3164 inline
3165 mask_array<_Tp>
3166 valarray<_Tp>::operator[](const valarray<bool>& __vb)
3167 {
3168     return mask_array<value_type>(__vb, *this);
3169 }
3170
3171 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3172
3173 template <class _Tp>
3174 inline
3175 __val_expr<__mask_expr<const valarray<_Tp>&> >
3176 valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3177 {
3178     return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
3179 }
3180
3181 template <class _Tp>
3182 inline
3183 mask_array<_Tp>
3184 valarray<_Tp>::operator[](valarray<bool>&& __vb)
3185 {
3186     return mask_array<value_type>(move(__vb), *this);
3187 }
3188
3189 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3190
3191 template <class _Tp>
3192 inline
3193 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3194 valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3195 {
3196     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3197 }
3198
3199 template <class _Tp>
3200 inline
3201 indirect_array<_Tp>
3202 valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3203 {
3204     return indirect_array<value_type>(__vs, *this);
3205 }
3206
3207 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3208
3209 template <class _Tp>
3210 inline
3211 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3212 valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3213 {
3214     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
3215 }
3216
3217 template <class _Tp>
3218 inline
3219 indirect_array<_Tp>
3220 valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3221 {
3222     return indirect_array<value_type>(move(__vs), *this);
3223 }
3224
3225 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3226
3227 template <class _Tp>
3228 valarray<_Tp>
3229 valarray<_Tp>::operator+() const
3230 {
3231     valarray<value_type> __r;
3232     size_t __n = size();
3233     if (__n)
3234     {
3235         __r.__begin_ =
3236             __r.__end_ =
3237                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3238         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3239             ::new (__r.__end_) value_type(+*__p);
3240     }
3241     return __r;
3242 }
3243
3244 template <class _Tp>
3245 valarray<_Tp>
3246 valarray<_Tp>::operator-() const
3247 {
3248     valarray<value_type> __r;
3249     size_t __n = size();
3250     if (__n)
3251     {
3252         __r.__begin_ =
3253             __r.__end_ =
3254                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3255         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3256             ::new (__r.__end_) value_type(-*__p);
3257     }
3258     return __r;
3259 }
3260
3261 template <class _Tp>
3262 valarray<_Tp>
3263 valarray<_Tp>::operator~() const
3264 {
3265     valarray<value_type> __r;
3266     size_t __n = size();
3267     if (__n)
3268     {
3269         __r.__begin_ =
3270             __r.__end_ =
3271                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3272         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3273             ::new (__r.__end_) value_type(~*__p);
3274     }
3275     return __r;
3276 }
3277
3278 template <class _Tp>
3279 valarray<bool>
3280 valarray<_Tp>::operator!() const
3281 {
3282     valarray<bool> __r;
3283     size_t __n = size();
3284     if (__n)
3285     {
3286         __r.__begin_ =
3287             __r.__end_ =
3288                 static_cast<bool*>(_VSTD::__allocate(__n * sizeof(bool)));
3289         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3290             ::new (__r.__end_) bool(!*__p);
3291     }
3292     return __r;
3293 }
3294
3295 template <class _Tp>
3296 inline
3297 valarray<_Tp>&
3298 valarray<_Tp>::operator*=(const value_type& __x)
3299 {
3300     for (value_type* __p = __begin_; __p != __end_; ++__p)
3301         *__p *= __x;
3302     return *this;
3303 }
3304
3305 template <class _Tp>
3306 inline
3307 valarray<_Tp>&
3308 valarray<_Tp>::operator/=(const value_type& __x)
3309 {
3310     for (value_type* __p = __begin_; __p != __end_; ++__p)
3311         *__p /= __x;
3312     return *this;
3313 }
3314
3315 template <class _Tp>
3316 inline
3317 valarray<_Tp>&
3318 valarray<_Tp>::operator%=(const value_type& __x)
3319 {
3320     for (value_type* __p = __begin_; __p != __end_; ++__p)
3321         *__p %= __x;
3322     return *this;
3323 }
3324
3325 template <class _Tp>
3326 inline
3327 valarray<_Tp>&
3328 valarray<_Tp>::operator+=(const value_type& __x)
3329 {
3330     for (value_type* __p = __begin_; __p != __end_; ++__p)
3331         *__p += __x;
3332     return *this;
3333 }
3334
3335 template <class _Tp>
3336 inline
3337 valarray<_Tp>&
3338 valarray<_Tp>::operator-=(const value_type& __x)
3339 {
3340     for (value_type* __p = __begin_; __p != __end_; ++__p)
3341         *__p -= __x;
3342     return *this;
3343 }
3344
3345 template <class _Tp>
3346 inline
3347 valarray<_Tp>&
3348 valarray<_Tp>::operator^=(const value_type& __x)
3349 {
3350     for (value_type* __p = __begin_; __p != __end_; ++__p)
3351         *__p ^= __x;
3352     return *this;
3353 }
3354
3355 template <class _Tp>
3356 inline
3357 valarray<_Tp>&
3358 valarray<_Tp>::operator&=(const value_type& __x)
3359 {
3360     for (value_type* __p = __begin_; __p != __end_; ++__p)
3361         *__p &= __x;
3362     return *this;
3363 }
3364
3365 template <class _Tp>
3366 inline
3367 valarray<_Tp>&
3368 valarray<_Tp>::operator|=(const value_type& __x)
3369 {
3370     for (value_type* __p = __begin_; __p != __end_; ++__p)
3371         *__p |= __x;
3372     return *this;
3373 }
3374
3375 template <class _Tp>
3376 inline
3377 valarray<_Tp>&
3378 valarray<_Tp>::operator<<=(const value_type& __x)
3379 {
3380     for (value_type* __p = __begin_; __p != __end_; ++__p)
3381         *__p <<= __x;
3382     return *this;
3383 }
3384
3385 template <class _Tp>
3386 inline
3387 valarray<_Tp>&
3388 valarray<_Tp>::operator>>=(const value_type& __x)
3389 {
3390     for (value_type* __p = __begin_; __p != __end_; ++__p)
3391         *__p >>= __x;
3392     return *this;
3393 }
3394
3395 template <class _Tp>
3396 template <class _Expr>
3397 inline
3398 typename enable_if
3399 <
3400     __is_val_expr<_Expr>::value,
3401     valarray<_Tp>&
3402 >::type
3403 valarray<_Tp>::operator*=(const _Expr& __v)
3404 {
3405     size_t __i = 0;
3406     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3407         *__t *= __v[__i];
3408     return *this;
3409 }
3410
3411 template <class _Tp>
3412 template <class _Expr>
3413 inline
3414 typename enable_if
3415 <
3416     __is_val_expr<_Expr>::value,
3417     valarray<_Tp>&
3418 >::type
3419 valarray<_Tp>::operator/=(const _Expr& __v)
3420 {
3421     size_t __i = 0;
3422     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3423         *__t /= __v[__i];
3424     return *this;
3425 }
3426
3427 template <class _Tp>
3428 template <class _Expr>
3429 inline
3430 typename enable_if
3431 <
3432     __is_val_expr<_Expr>::value,
3433     valarray<_Tp>&
3434 >::type
3435 valarray<_Tp>::operator%=(const _Expr& __v)
3436 {
3437     size_t __i = 0;
3438     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3439         *__t %= __v[__i];
3440     return *this;
3441 }
3442
3443 template <class _Tp>
3444 template <class _Expr>
3445 inline
3446 typename enable_if
3447 <
3448     __is_val_expr<_Expr>::value,
3449     valarray<_Tp>&
3450 >::type
3451 valarray<_Tp>::operator+=(const _Expr& __v)
3452 {
3453     size_t __i = 0;
3454     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3455         *__t += __v[__i];
3456     return *this;
3457 }
3458
3459 template <class _Tp>
3460 template <class _Expr>
3461 inline
3462 typename enable_if
3463 <
3464     __is_val_expr<_Expr>::value,
3465     valarray<_Tp>&
3466 >::type
3467 valarray<_Tp>::operator-=(const _Expr& __v)
3468 {
3469     size_t __i = 0;
3470     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3471         *__t -= __v[__i];
3472     return *this;
3473 }
3474
3475 template <class _Tp>
3476 template <class _Expr>
3477 inline
3478 typename enable_if
3479 <
3480     __is_val_expr<_Expr>::value,
3481     valarray<_Tp>&
3482 >::type
3483 valarray<_Tp>::operator^=(const _Expr& __v)
3484 {
3485     size_t __i = 0;
3486     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3487         *__t ^= __v[__i];
3488     return *this;
3489 }
3490
3491 template <class _Tp>
3492 template <class _Expr>
3493 inline
3494 typename enable_if
3495 <
3496     __is_val_expr<_Expr>::value,
3497     valarray<_Tp>&
3498 >::type
3499 valarray<_Tp>::operator|=(const _Expr& __v)
3500 {
3501     size_t __i = 0;
3502     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3503         *__t |= __v[__i];
3504     return *this;
3505 }
3506
3507 template <class _Tp>
3508 template <class _Expr>
3509 inline
3510 typename enable_if
3511 <
3512     __is_val_expr<_Expr>::value,
3513     valarray<_Tp>&
3514 >::type
3515 valarray<_Tp>::operator&=(const _Expr& __v)
3516 {
3517     size_t __i = 0;
3518     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3519         *__t &= __v[__i];
3520     return *this;
3521 }
3522
3523 template <class _Tp>
3524 template <class _Expr>
3525 inline
3526 typename enable_if
3527 <
3528     __is_val_expr<_Expr>::value,
3529     valarray<_Tp>&
3530 >::type
3531 valarray<_Tp>::operator<<=(const _Expr& __v)
3532 {
3533     size_t __i = 0;
3534     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3535         *__t <<= __v[__i];
3536     return *this;
3537 }
3538
3539 template <class _Tp>
3540 template <class _Expr>
3541 inline
3542 typename enable_if
3543 <
3544     __is_val_expr<_Expr>::value,
3545     valarray<_Tp>&
3546 >::type
3547 valarray<_Tp>::operator>>=(const _Expr& __v)
3548 {
3549     size_t __i = 0;
3550     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3551         *__t >>= __v[__i];
3552     return *this;
3553 }
3554
3555 template <class _Tp>
3556 inline
3557 void
3558 valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
3559 {
3560     _VSTD::swap(__begin_, __v.__begin_);
3561     _VSTD::swap(__end_, __v.__end_);
3562 }
3563
3564 template <class _Tp>
3565 inline
3566 _Tp
3567 valarray<_Tp>::sum() const
3568 {
3569     if (__begin_ == __end_)
3570         return value_type();
3571     const value_type* __p = __begin_;
3572     _Tp __r = *__p;
3573     for (++__p; __p != __end_; ++__p)
3574         __r += *__p;
3575     return __r;
3576 }
3577
3578 template <class _Tp>
3579 inline
3580 _Tp
3581 valarray<_Tp>::min() const
3582 {
3583     if (__begin_ == __end_)
3584         return value_type();
3585     return *_VSTD::min_element(__begin_, __end_);
3586 }
3587
3588 template <class _Tp>
3589 inline
3590 _Tp
3591 valarray<_Tp>::max() const
3592 {
3593     if (__begin_ == __end_)
3594         return value_type();
3595     return *_VSTD::max_element(__begin_, __end_);
3596 }
3597
3598 template <class _Tp>
3599 valarray<_Tp>
3600 valarray<_Tp>::shift(int __i) const
3601 {
3602     valarray<value_type> __r;
3603     size_t __n = size();
3604     if (__n)
3605     {
3606         __r.__begin_ =
3607             __r.__end_ =
3608                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3609         const value_type* __sb;
3610         value_type* __tb;
3611         value_type* __te;
3612         if (__i >= 0)
3613         {
3614             __i = _VSTD::min(__i, static_cast<int>(__n));
3615             __sb = __begin_ + __i;
3616             __tb = __r.__begin_;
3617             __te = __r.__begin_ + (__n - __i);
3618         }
3619         else
3620         {
3621             __i = _VSTD::min(-__i, static_cast<int>(__n));
3622             __sb = __begin_;
3623             __tb = __r.__begin_ + __i;
3624             __te = __r.__begin_ + __n;
3625         }
3626         for (; __r.__end_ != __tb; ++__r.__end_)
3627             ::new (__r.__end_) value_type();
3628         for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
3629             ::new (__r.__end_) value_type(*__sb);
3630         for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
3631             ::new (__r.__end_) value_type();
3632     }
3633     return __r;
3634 }
3635
3636 template <class _Tp>
3637 valarray<_Tp>
3638 valarray<_Tp>::cshift(int __i) const
3639 {
3640     valarray<value_type> __r;
3641     size_t __n = size();
3642     if (__n)
3643     {
3644         __r.__begin_ =
3645             __r.__end_ =
3646                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3647         __i %= static_cast<int>(__n);
3648         const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3649         for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
3650             ::new (__r.__end_) value_type(*__s);
3651         for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
3652             ::new (__r.__end_) value_type(*__s);
3653     }
3654     return __r;
3655 }
3656
3657 template <class _Tp>
3658 valarray<_Tp>
3659 valarray<_Tp>::apply(value_type __f(value_type)) const
3660 {
3661     valarray<value_type> __r;
3662     size_t __n = size();
3663     if (__n)
3664     {
3665         __r.__begin_ =
3666             __r.__end_ =
3667                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3668         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3669             ::new (__r.__end_) value_type(__f(*__p));
3670     }
3671     return __r;
3672 }
3673
3674 template <class _Tp>
3675 valarray<_Tp>
3676 valarray<_Tp>::apply(value_type __f(const value_type&)) const
3677 {
3678     valarray<value_type> __r;
3679     size_t __n = size();
3680     if (__n)
3681     {
3682         __r.__begin_ =
3683             __r.__end_ =
3684                 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3685         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3686             ::new (__r.__end_) value_type(__f(*__p));
3687     }
3688     return __r;
3689 }
3690
3691 template <class _Tp>
3692 void
3693 valarray<_Tp>::resize(size_t __n, value_type __x)
3694 {
3695     if (__begin_ != nullptr)
3696     {
3697         while (__end_ != __begin_)
3698             (--__end_)->~value_type();
3699         _VSTD::__libcpp_deallocate(__begin_);
3700         __begin_ = __end_ = nullptr;
3701     }
3702     if (__n)
3703     {
3704         __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type)));
3705 #ifndef _LIBCPP_NO_EXCEPTIONS
3706         try
3707         {
3708 #endif  // _LIBCPP_NO_EXCEPTIONS
3709             for (; __n; --__n, ++__end_)
3710                 ::new (__end_) value_type(__x);
3711 #ifndef _LIBCPP_NO_EXCEPTIONS
3712         }
3713         catch (...)
3714         {
3715             resize(0);
3716             throw;
3717         }
3718 #endif  // _LIBCPP_NO_EXCEPTIONS
3719     }
3720 }
3721
3722 template<class _Tp>
3723 inline _LIBCPP_INLINE_VISIBILITY
3724 void
3725 swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
3726 {
3727     __x.swap(__y);
3728 }
3729
3730 template<class _Expr1, class _Expr2>
3731 inline _LIBCPP_INLINE_VISIBILITY
3732 typename enable_if
3733 <
3734     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3735     __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3736 >::type
3737 operator*(const _Expr1& __x, const _Expr2& __y)
3738 {
3739     typedef typename _Expr1::value_type value_type;
3740     typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3741     return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3742 }
3743
3744 template<class _Expr>
3745 inline _LIBCPP_INLINE_VISIBILITY
3746 typename enable_if
3747 <
3748     __is_val_expr<_Expr>::value,
3749     __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3750                _Expr, __scalar_expr<typename _Expr::value_type> > >
3751 >::type
3752 operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3753 {
3754     typedef typename _Expr::value_type value_type;
3755     typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3756     return __val_expr<_Op>(_Op(multiplies<value_type>(),
3757                            __x, __scalar_expr<value_type>(__y, __x.size())));
3758 }
3759
3760 template<class _Expr>
3761 inline _LIBCPP_INLINE_VISIBILITY
3762 typename enable_if
3763 <
3764     __is_val_expr<_Expr>::value,
3765     __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3766                __scalar_expr<typename _Expr::value_type>, _Expr> >
3767 >::type
3768 operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3769 {
3770     typedef typename _Expr::value_type value_type;
3771     typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3772     return __val_expr<_Op>(_Op(multiplies<value_type>(),
3773                            __scalar_expr<value_type>(__x, __y.size()), __y));
3774 }
3775
3776 template<class _Expr1, class _Expr2>
3777 inline _LIBCPP_INLINE_VISIBILITY
3778 typename enable_if
3779 <
3780     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3781     __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3782 >::type
3783 operator/(const _Expr1& __x, const _Expr2& __y)
3784 {
3785     typedef typename _Expr1::value_type value_type;
3786     typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3787     return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3788 }
3789
3790 template<class _Expr>
3791 inline _LIBCPP_INLINE_VISIBILITY
3792 typename enable_if
3793 <
3794     __is_val_expr<_Expr>::value,
3795     __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3796                _Expr, __scalar_expr<typename _Expr::value_type> > >
3797 >::type
3798 operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3799 {
3800     typedef typename _Expr::value_type value_type;
3801     typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3802     return __val_expr<_Op>(_Op(divides<value_type>(),
3803                            __x, __scalar_expr<value_type>(__y, __x.size())));
3804 }
3805
3806 template<class _Expr>
3807 inline _LIBCPP_INLINE_VISIBILITY
3808 typename enable_if
3809 <
3810     __is_val_expr<_Expr>::value,
3811     __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3812                __scalar_expr<typename _Expr::value_type>, _Expr> >
3813 >::type
3814 operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3815 {
3816     typedef typename _Expr::value_type value_type;
3817     typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3818     return __val_expr<_Op>(_Op(divides<value_type>(),
3819                            __scalar_expr<value_type>(__x, __y.size()), __y));
3820 }
3821
3822 template<class _Expr1, class _Expr2>
3823 inline _LIBCPP_INLINE_VISIBILITY
3824 typename enable_if
3825 <
3826     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3827     __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3828 >::type
3829 operator%(const _Expr1& __x, const _Expr2& __y)
3830 {
3831     typedef typename _Expr1::value_type value_type;
3832     typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3833     return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3834 }
3835
3836 template<class _Expr>
3837 inline _LIBCPP_INLINE_VISIBILITY
3838 typename enable_if
3839 <
3840     __is_val_expr<_Expr>::value,
3841     __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3842                _Expr, __scalar_expr<typename _Expr::value_type> > >
3843 >::type
3844 operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3845 {
3846     typedef typename _Expr::value_type value_type;
3847     typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3848     return __val_expr<_Op>(_Op(modulus<value_type>(),
3849                            __x, __scalar_expr<value_type>(__y, __x.size())));
3850 }
3851
3852 template<class _Expr>
3853 inline _LIBCPP_INLINE_VISIBILITY
3854 typename enable_if
3855 <
3856     __is_val_expr<_Expr>::value,
3857     __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3858                __scalar_expr<typename _Expr::value_type>, _Expr> >
3859 >::type
3860 operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3861 {
3862     typedef typename _Expr::value_type value_type;
3863     typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3864     return __val_expr<_Op>(_Op(modulus<value_type>(),
3865                            __scalar_expr<value_type>(__x, __y.size()), __y));
3866 }
3867
3868 template<class _Expr1, class _Expr2>
3869 inline _LIBCPP_INLINE_VISIBILITY
3870 typename enable_if
3871 <
3872     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3873     __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3874 >::type
3875 operator+(const _Expr1& __x, const _Expr2& __y)
3876 {
3877     typedef typename _Expr1::value_type value_type;
3878     typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3879     return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3880 }
3881
3882 template<class _Expr>
3883 inline _LIBCPP_INLINE_VISIBILITY
3884 typename enable_if
3885 <
3886     __is_val_expr<_Expr>::value,
3887     __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3888                _Expr, __scalar_expr<typename _Expr::value_type> > >
3889 >::type
3890 operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3891 {
3892     typedef typename _Expr::value_type value_type;
3893     typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3894     return __val_expr<_Op>(_Op(plus<value_type>(),
3895                            __x, __scalar_expr<value_type>(__y, __x.size())));
3896 }
3897
3898 template<class _Expr>
3899 inline _LIBCPP_INLINE_VISIBILITY
3900 typename enable_if
3901 <
3902     __is_val_expr<_Expr>::value,
3903     __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3904                __scalar_expr<typename _Expr::value_type>, _Expr> >
3905 >::type
3906 operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3907 {
3908     typedef typename _Expr::value_type value_type;
3909     typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3910     return __val_expr<_Op>(_Op(plus<value_type>(),
3911                            __scalar_expr<value_type>(__x, __y.size()), __y));
3912 }
3913
3914 template<class _Expr1, class _Expr2>
3915 inline _LIBCPP_INLINE_VISIBILITY
3916 typename enable_if
3917 <
3918     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3919     __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3920 >::type
3921 operator-(const _Expr1& __x, const _Expr2& __y)
3922 {
3923     typedef typename _Expr1::value_type value_type;
3924     typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3925     return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3926 }
3927
3928 template<class _Expr>
3929 inline _LIBCPP_INLINE_VISIBILITY
3930 typename enable_if
3931 <
3932     __is_val_expr<_Expr>::value,
3933     __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3934                _Expr, __scalar_expr<typename _Expr::value_type> > >
3935 >::type
3936 operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3937 {
3938     typedef typename _Expr::value_type value_type;
3939     typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3940     return __val_expr<_Op>(_Op(minus<value_type>(),
3941                            __x, __scalar_expr<value_type>(__y, __x.size())));
3942 }
3943
3944 template<class _Expr>
3945 inline _LIBCPP_INLINE_VISIBILITY
3946 typename enable_if
3947 <
3948     __is_val_expr<_Expr>::value,
3949     __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3950                __scalar_expr<typename _Expr::value_type>, _Expr> >
3951 >::type
3952 operator-(const typename _Expr::value_type& __x, const _Expr& __y)
3953 {
3954     typedef typename _Expr::value_type value_type;
3955     typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3956     return __val_expr<_Op>(_Op(minus<value_type>(),
3957                            __scalar_expr<value_type>(__x, __y.size()), __y));
3958 }
3959
3960 template<class _Expr1, class _Expr2>
3961 inline _LIBCPP_INLINE_VISIBILITY
3962 typename enable_if
3963 <
3964     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3965     __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
3966 >::type
3967 operator^(const _Expr1& __x, const _Expr2& __y)
3968 {
3969     typedef typename _Expr1::value_type value_type;
3970     typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
3971     return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
3972 }
3973
3974 template<class _Expr>
3975 inline _LIBCPP_INLINE_VISIBILITY
3976 typename enable_if
3977 <
3978     __is_val_expr<_Expr>::value,
3979     __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
3980                _Expr, __scalar_expr<typename _Expr::value_type> > >
3981 >::type
3982 operator^(const _Expr& __x, const typename _Expr::value_type& __y)
3983 {
3984     typedef typename _Expr::value_type value_type;
3985     typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3986     return __val_expr<_Op>(_Op(bit_xor<value_type>(),
3987                            __x, __scalar_expr<value_type>(__y, __x.size())));
3988 }
3989
3990 template<class _Expr>
3991 inline _LIBCPP_INLINE_VISIBILITY
3992 typename enable_if
3993 <
3994     __is_val_expr<_Expr>::value,
3995     __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
3996                __scalar_expr<typename _Expr::value_type>, _Expr> >
3997 >::type
3998 operator^(const typename _Expr::value_type& __x, const _Expr& __y)
3999 {
4000     typedef typename _Expr::value_type value_type;
4001     typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4002     return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4003                            __scalar_expr<value_type>(__x, __y.size()), __y));
4004 }
4005
4006 template<class _Expr1, class _Expr2>
4007 inline _LIBCPP_INLINE_VISIBILITY
4008 typename enable_if
4009 <
4010     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4011     __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4012 >::type
4013 operator&(const _Expr1& __x, const _Expr2& __y)
4014 {
4015     typedef typename _Expr1::value_type value_type;
4016     typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4017     return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4018 }
4019
4020 template<class _Expr>
4021 inline _LIBCPP_INLINE_VISIBILITY
4022 typename enable_if
4023 <
4024     __is_val_expr<_Expr>::value,
4025     __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4026                _Expr, __scalar_expr<typename _Expr::value_type> > >
4027 >::type
4028 operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4029 {
4030     typedef typename _Expr::value_type value_type;
4031     typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4032     return __val_expr<_Op>(_Op(bit_and<value_type>(),
4033                            __x, __scalar_expr<value_type>(__y, __x.size())));
4034 }
4035
4036 template<class _Expr>
4037 inline _LIBCPP_INLINE_VISIBILITY
4038 typename enable_if
4039 <
4040     __is_val_expr<_Expr>::value,
4041     __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4042                __scalar_expr<typename _Expr::value_type>, _Expr> >
4043 >::type
4044 operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4045 {
4046     typedef typename _Expr::value_type value_type;
4047     typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4048     return __val_expr<_Op>(_Op(bit_and<value_type>(),
4049                            __scalar_expr<value_type>(__x, __y.size()), __y));
4050 }
4051
4052 template<class _Expr1, class _Expr2>
4053 inline _LIBCPP_INLINE_VISIBILITY
4054 typename enable_if
4055 <
4056     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4057     __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4058 >::type
4059 operator|(const _Expr1& __x, const _Expr2& __y)
4060 {
4061     typedef typename _Expr1::value_type value_type;
4062     typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4063     return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4064 }
4065
4066 template<class _Expr>
4067 inline _LIBCPP_INLINE_VISIBILITY
4068 typename enable_if
4069 <
4070     __is_val_expr<_Expr>::value,
4071     __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4072                _Expr, __scalar_expr<typename _Expr::value_type> > >
4073 >::type
4074 operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4075 {
4076     typedef typename _Expr::value_type value_type;
4077     typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4078     return __val_expr<_Op>(_Op(bit_or<value_type>(),
4079                            __x, __scalar_expr<value_type>(__y, __x.size())));
4080 }
4081
4082 template<class _Expr>
4083 inline _LIBCPP_INLINE_VISIBILITY
4084 typename enable_if
4085 <
4086     __is_val_expr<_Expr>::value,
4087     __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4088                __scalar_expr<typename _Expr::value_type>, _Expr> >
4089 >::type
4090 operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4091 {
4092     typedef typename _Expr::value_type value_type;
4093     typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4094     return __val_expr<_Op>(_Op(bit_or<value_type>(),
4095                            __scalar_expr<value_type>(__x, __y.size()), __y));
4096 }
4097
4098 template<class _Expr1, class _Expr2>
4099 inline _LIBCPP_INLINE_VISIBILITY
4100 typename enable_if
4101 <
4102     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4103     __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4104 >::type
4105 operator<<(const _Expr1& __x, const _Expr2& __y)
4106 {
4107     typedef typename _Expr1::value_type value_type;
4108     typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4109     return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4110 }
4111
4112 template<class _Expr>
4113 inline _LIBCPP_INLINE_VISIBILITY
4114 typename enable_if
4115 <
4116     __is_val_expr<_Expr>::value,
4117     __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4118                _Expr, __scalar_expr<typename _Expr::value_type> > >
4119 >::type
4120 operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4121 {
4122     typedef typename _Expr::value_type value_type;
4123     typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4124     return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4125                            __x, __scalar_expr<value_type>(__y, __x.size())));
4126 }
4127
4128 template<class _Expr>
4129 inline _LIBCPP_INLINE_VISIBILITY
4130 typename enable_if
4131 <
4132     __is_val_expr<_Expr>::value,
4133     __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4134                __scalar_expr<typename _Expr::value_type>, _Expr> >
4135 >::type
4136 operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4137 {
4138     typedef typename _Expr::value_type value_type;
4139     typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4140     return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4141                            __scalar_expr<value_type>(__x, __y.size()), __y));
4142 }
4143
4144 template<class _Expr1, class _Expr2>
4145 inline _LIBCPP_INLINE_VISIBILITY
4146 typename enable_if
4147 <
4148     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4149     __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4150 >::type
4151 operator>>(const _Expr1& __x, const _Expr2& __y)
4152 {
4153     typedef typename _Expr1::value_type value_type;
4154     typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4155     return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4156 }
4157
4158 template<class _Expr>
4159 inline _LIBCPP_INLINE_VISIBILITY
4160 typename enable_if
4161 <
4162     __is_val_expr<_Expr>::value,
4163     __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4164                _Expr, __scalar_expr<typename _Expr::value_type> > >
4165 >::type
4166 operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4167 {
4168     typedef typename _Expr::value_type value_type;
4169     typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4170     return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4171                            __x, __scalar_expr<value_type>(__y, __x.size())));
4172 }
4173
4174 template<class _Expr>
4175 inline _LIBCPP_INLINE_VISIBILITY
4176 typename enable_if
4177 <
4178     __is_val_expr<_Expr>::value,
4179     __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4180                __scalar_expr<typename _Expr::value_type>, _Expr> >
4181 >::type
4182 operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4183 {
4184     typedef typename _Expr::value_type value_type;
4185     typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4186     return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4187                            __scalar_expr<value_type>(__x, __y.size()), __y));
4188 }
4189
4190 template<class _Expr1, class _Expr2>
4191 inline _LIBCPP_INLINE_VISIBILITY
4192 typename enable_if
4193 <
4194     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4195     __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4196 >::type
4197 operator&&(const _Expr1& __x, const _Expr2& __y)
4198 {
4199     typedef typename _Expr1::value_type value_type;
4200     typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4201     return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4202 }
4203
4204 template<class _Expr>
4205 inline _LIBCPP_INLINE_VISIBILITY
4206 typename enable_if
4207 <
4208     __is_val_expr<_Expr>::value,
4209     __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4210                _Expr, __scalar_expr<typename _Expr::value_type> > >
4211 >::type
4212 operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4213 {
4214     typedef typename _Expr::value_type value_type;
4215     typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4216     return __val_expr<_Op>(_Op(logical_and<value_type>(),
4217                            __x, __scalar_expr<value_type>(__y, __x.size())));
4218 }
4219
4220 template<class _Expr>
4221 inline _LIBCPP_INLINE_VISIBILITY
4222 typename enable_if
4223 <
4224     __is_val_expr<_Expr>::value,
4225     __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4226                __scalar_expr<typename _Expr::value_type>, _Expr> >
4227 >::type
4228 operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4229 {
4230     typedef typename _Expr::value_type value_type;
4231     typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4232     return __val_expr<_Op>(_Op(logical_and<value_type>(),
4233                            __scalar_expr<value_type>(__x, __y.size()), __y));
4234 }
4235
4236 template<class _Expr1, class _Expr2>
4237 inline _LIBCPP_INLINE_VISIBILITY
4238 typename enable_if
4239 <
4240     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4241     __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4242 >::type
4243 operator||(const _Expr1& __x, const _Expr2& __y)
4244 {
4245     typedef typename _Expr1::value_type value_type;
4246     typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4247     return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4248 }
4249
4250 template<class _Expr>
4251 inline _LIBCPP_INLINE_VISIBILITY
4252 typename enable_if
4253 <
4254     __is_val_expr<_Expr>::value,
4255     __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4256                _Expr, __scalar_expr<typename _Expr::value_type> > >
4257 >::type
4258 operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4259 {
4260     typedef typename _Expr::value_type value_type;
4261     typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4262     return __val_expr<_Op>(_Op(logical_or<value_type>(),
4263                            __x, __scalar_expr<value_type>(__y, __x.size())));
4264 }
4265
4266 template<class _Expr>
4267 inline _LIBCPP_INLINE_VISIBILITY
4268 typename enable_if
4269 <
4270     __is_val_expr<_Expr>::value,
4271     __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4272                __scalar_expr<typename _Expr::value_type>, _Expr> >
4273 >::type
4274 operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4275 {
4276     typedef typename _Expr::value_type value_type;
4277     typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4278     return __val_expr<_Op>(_Op(logical_or<value_type>(),
4279                            __scalar_expr<value_type>(__x, __y.size()), __y));
4280 }
4281
4282 template<class _Expr1, class _Expr2>
4283 inline _LIBCPP_INLINE_VISIBILITY
4284 typename enable_if
4285 <
4286     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4287     __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4288 >::type
4289 operator==(const _Expr1& __x, const _Expr2& __y)
4290 {
4291     typedef typename _Expr1::value_type value_type;
4292     typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4293     return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4294 }
4295
4296 template<class _Expr>
4297 inline _LIBCPP_INLINE_VISIBILITY
4298 typename enable_if
4299 <
4300     __is_val_expr<_Expr>::value,
4301     __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4302                _Expr, __scalar_expr<typename _Expr::value_type> > >
4303 >::type
4304 operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4305 {
4306     typedef typename _Expr::value_type value_type;
4307     typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4308     return __val_expr<_Op>(_Op(equal_to<value_type>(),
4309                            __x, __scalar_expr<value_type>(__y, __x.size())));
4310 }
4311
4312 template<class _Expr>
4313 inline _LIBCPP_INLINE_VISIBILITY
4314 typename enable_if
4315 <
4316     __is_val_expr<_Expr>::value,
4317     __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4318                __scalar_expr<typename _Expr::value_type>, _Expr> >
4319 >::type
4320 operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4321 {
4322     typedef typename _Expr::value_type value_type;
4323     typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4324     return __val_expr<_Op>(_Op(equal_to<value_type>(),
4325                            __scalar_expr<value_type>(__x, __y.size()), __y));
4326 }
4327
4328 template<class _Expr1, class _Expr2>
4329 inline _LIBCPP_INLINE_VISIBILITY
4330 typename enable_if
4331 <
4332     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4333     __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4334 >::type
4335 operator!=(const _Expr1& __x, const _Expr2& __y)
4336 {
4337     typedef typename _Expr1::value_type value_type;
4338     typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4339     return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4340 }
4341
4342 template<class _Expr>
4343 inline _LIBCPP_INLINE_VISIBILITY
4344 typename enable_if
4345 <
4346     __is_val_expr<_Expr>::value,
4347     __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4348                _Expr, __scalar_expr<typename _Expr::value_type> > >
4349 >::type
4350 operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4351 {
4352     typedef typename _Expr::value_type value_type;
4353     typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4354     return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4355                            __x, __scalar_expr<value_type>(__y, __x.size())));
4356 }
4357
4358 template<class _Expr>
4359 inline _LIBCPP_INLINE_VISIBILITY
4360 typename enable_if
4361 <
4362     __is_val_expr<_Expr>::value,
4363     __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4364                __scalar_expr<typename _Expr::value_type>, _Expr> >
4365 >::type
4366 operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4367 {
4368     typedef typename _Expr::value_type value_type;
4369     typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4370     return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4371                            __scalar_expr<value_type>(__x, __y.size()), __y));
4372 }
4373
4374 template<class _Expr1, class _Expr2>
4375 inline _LIBCPP_INLINE_VISIBILITY
4376 typename enable_if
4377 <
4378     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4379     __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4380 >::type
4381 operator<(const _Expr1& __x, const _Expr2& __y)
4382 {
4383     typedef typename _Expr1::value_type value_type;
4384     typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4385     return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4386 }
4387
4388 template<class _Expr>
4389 inline _LIBCPP_INLINE_VISIBILITY
4390 typename enable_if
4391 <
4392     __is_val_expr<_Expr>::value,
4393     __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4394                _Expr, __scalar_expr<typename _Expr::value_type> > >
4395 >::type
4396 operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4397 {
4398     typedef typename _Expr::value_type value_type;
4399     typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4400     return __val_expr<_Op>(_Op(less<value_type>(),
4401                            __x, __scalar_expr<value_type>(__y, __x.size())));
4402 }
4403
4404 template<class _Expr>
4405 inline _LIBCPP_INLINE_VISIBILITY
4406 typename enable_if
4407 <
4408     __is_val_expr<_Expr>::value,
4409     __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4410                __scalar_expr<typename _Expr::value_type>, _Expr> >
4411 >::type
4412 operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4413 {
4414     typedef typename _Expr::value_type value_type;
4415     typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4416     return __val_expr<_Op>(_Op(less<value_type>(),
4417                            __scalar_expr<value_type>(__x, __y.size()), __y));
4418 }
4419
4420 template<class _Expr1, class _Expr2>
4421 inline _LIBCPP_INLINE_VISIBILITY
4422 typename enable_if
4423 <
4424     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4425     __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4426 >::type
4427 operator>(const _Expr1& __x, const _Expr2& __y)
4428 {
4429     typedef typename _Expr1::value_type value_type;
4430     typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4431     return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4432 }
4433
4434 template<class _Expr>
4435 inline _LIBCPP_INLINE_VISIBILITY
4436 typename enable_if
4437 <
4438     __is_val_expr<_Expr>::value,
4439     __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4440                _Expr, __scalar_expr<typename _Expr::value_type> > >
4441 >::type
4442 operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4443 {
4444     typedef typename _Expr::value_type value_type;
4445     typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4446     return __val_expr<_Op>(_Op(greater<value_type>(),
4447                            __x, __scalar_expr<value_type>(__y, __x.size())));
4448 }
4449
4450 template<class _Expr>
4451 inline _LIBCPP_INLINE_VISIBILITY
4452 typename enable_if
4453 <
4454     __is_val_expr<_Expr>::value,
4455     __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4456                __scalar_expr<typename _Expr::value_type>, _Expr> >
4457 >::type
4458 operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4459 {
4460     typedef typename _Expr::value_type value_type;
4461     typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4462     return __val_expr<_Op>(_Op(greater<value_type>(),
4463                            __scalar_expr<value_type>(__x, __y.size()), __y));
4464 }
4465
4466 template<class _Expr1, class _Expr2>
4467 inline _LIBCPP_INLINE_VISIBILITY
4468 typename enable_if
4469 <
4470     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4471     __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4472 >::type
4473 operator<=(const _Expr1& __x, const _Expr2& __y)
4474 {
4475     typedef typename _Expr1::value_type value_type;
4476     typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4477     return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4478 }
4479
4480 template<class _Expr>
4481 inline _LIBCPP_INLINE_VISIBILITY
4482 typename enable_if
4483 <
4484     __is_val_expr<_Expr>::value,
4485     __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4486                _Expr, __scalar_expr<typename _Expr::value_type> > >
4487 >::type
4488 operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4489 {
4490     typedef typename _Expr::value_type value_type;
4491     typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4492     return __val_expr<_Op>(_Op(less_equal<value_type>(),
4493                            __x, __scalar_expr<value_type>(__y, __x.size())));
4494 }
4495
4496 template<class _Expr>
4497 inline _LIBCPP_INLINE_VISIBILITY
4498 typename enable_if
4499 <
4500     __is_val_expr<_Expr>::value,
4501     __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4502                __scalar_expr<typename _Expr::value_type>, _Expr> >
4503 >::type
4504 operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4505 {
4506     typedef typename _Expr::value_type value_type;
4507     typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4508     return __val_expr<_Op>(_Op(less_equal<value_type>(),
4509                            __scalar_expr<value_type>(__x, __y.size()), __y));
4510 }
4511
4512 template<class _Expr1, class _Expr2>
4513 inline _LIBCPP_INLINE_VISIBILITY
4514 typename enable_if
4515 <
4516     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4517     __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4518 >::type
4519 operator>=(const _Expr1& __x, const _Expr2& __y)
4520 {
4521     typedef typename _Expr1::value_type value_type;
4522     typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4523     return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4524 }
4525
4526 template<class _Expr>
4527 inline _LIBCPP_INLINE_VISIBILITY
4528 typename enable_if
4529 <
4530     __is_val_expr<_Expr>::value,
4531     __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4532                _Expr, __scalar_expr<typename _Expr::value_type> > >
4533 >::type
4534 operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4535 {
4536     typedef typename _Expr::value_type value_type;
4537     typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4538     return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4539                            __x, __scalar_expr<value_type>(__y, __x.size())));
4540 }
4541
4542 template<class _Expr>
4543 inline _LIBCPP_INLINE_VISIBILITY
4544 typename enable_if
4545 <
4546     __is_val_expr<_Expr>::value,
4547     __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4548                __scalar_expr<typename _Expr::value_type>, _Expr> >
4549 >::type
4550 operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4551 {
4552     typedef typename _Expr::value_type value_type;
4553     typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4554     return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4555                            __scalar_expr<value_type>(__x, __y.size()), __y));
4556 }
4557
4558 template<class _Expr>
4559 inline _LIBCPP_INLINE_VISIBILITY
4560 typename enable_if
4561 <
4562     __is_val_expr<_Expr>::value,
4563     __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4564 >::type
4565 abs(const _Expr& __x)
4566 {
4567     typedef typename _Expr::value_type value_type;
4568     typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4569     return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4570 }
4571
4572 template<class _Expr>
4573 inline _LIBCPP_INLINE_VISIBILITY
4574 typename enable_if
4575 <
4576     __is_val_expr<_Expr>::value,
4577     __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4578 >::type
4579 acos(const _Expr& __x)
4580 {
4581     typedef typename _Expr::value_type value_type;
4582     typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4583     return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4584 }
4585
4586 template<class _Expr>
4587 inline _LIBCPP_INLINE_VISIBILITY
4588 typename enable_if
4589 <
4590     __is_val_expr<_Expr>::value,
4591     __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4592 >::type
4593 asin(const _Expr& __x)
4594 {
4595     typedef typename _Expr::value_type value_type;
4596     typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4597     return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4598 }
4599
4600 template<class _Expr>
4601 inline _LIBCPP_INLINE_VISIBILITY
4602 typename enable_if
4603 <
4604     __is_val_expr<_Expr>::value,
4605     __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4606 >::type
4607 atan(const _Expr& __x)
4608 {
4609     typedef typename _Expr::value_type value_type;
4610     typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4611     return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4612 }
4613
4614 template<class _Expr1, class _Expr2>
4615 inline _LIBCPP_INLINE_VISIBILITY
4616 typename enable_if
4617 <
4618     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4619     __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4620 >::type
4621 atan2(const _Expr1& __x, const _Expr2& __y)
4622 {
4623     typedef typename _Expr1::value_type value_type;
4624     typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4625     return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4626 }
4627
4628 template<class _Expr>
4629 inline _LIBCPP_INLINE_VISIBILITY
4630 typename enable_if
4631 <
4632     __is_val_expr<_Expr>::value,
4633     __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4634                _Expr, __scalar_expr<typename _Expr::value_type> > >
4635 >::type
4636 atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4637 {
4638     typedef typename _Expr::value_type value_type;
4639     typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4640     return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4641                            __x, __scalar_expr<value_type>(__y, __x.size())));
4642 }
4643
4644 template<class _Expr>
4645 inline _LIBCPP_INLINE_VISIBILITY
4646 typename enable_if
4647 <
4648     __is_val_expr<_Expr>::value,
4649     __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4650                __scalar_expr<typename _Expr::value_type>, _Expr> >
4651 >::type
4652 atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4653 {
4654     typedef typename _Expr::value_type value_type;
4655     typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4656     return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4657                            __scalar_expr<value_type>(__x, __y.size()), __y));
4658 }
4659
4660 template<class _Expr>
4661 inline _LIBCPP_INLINE_VISIBILITY
4662 typename enable_if
4663 <
4664     __is_val_expr<_Expr>::value,
4665     __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4666 >::type
4667 cos(const _Expr& __x)
4668 {
4669     typedef typename _Expr::value_type value_type;
4670     typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4671     return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4672 }
4673
4674 template<class _Expr>
4675 inline _LIBCPP_INLINE_VISIBILITY
4676 typename enable_if
4677 <
4678     __is_val_expr<_Expr>::value,
4679     __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4680 >::type
4681 cosh(const _Expr& __x)
4682 {
4683     typedef typename _Expr::value_type value_type;
4684     typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4685     return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4686 }
4687
4688 template<class _Expr>
4689 inline _LIBCPP_INLINE_VISIBILITY
4690 typename enable_if
4691 <
4692     __is_val_expr<_Expr>::value,
4693     __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4694 >::type
4695 exp(const _Expr& __x)
4696 {
4697     typedef typename _Expr::value_type value_type;
4698     typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4699     return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4700 }
4701
4702 template<class _Expr>
4703 inline _LIBCPP_INLINE_VISIBILITY
4704 typename enable_if
4705 <
4706     __is_val_expr<_Expr>::value,
4707     __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4708 >::type
4709 log(const _Expr& __x)
4710 {
4711     typedef typename _Expr::value_type value_type;
4712     typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4713     return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4714 }
4715
4716 template<class _Expr>
4717 inline _LIBCPP_INLINE_VISIBILITY
4718 typename enable_if
4719 <
4720     __is_val_expr<_Expr>::value,
4721     __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4722 >::type
4723 log10(const _Expr& __x)
4724 {
4725     typedef typename _Expr::value_type value_type;
4726     typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4727     return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4728 }
4729
4730 template<class _Expr1, class _Expr2>
4731 inline _LIBCPP_INLINE_VISIBILITY
4732 typename enable_if
4733 <
4734     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4735     __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4736 >::type
4737 pow(const _Expr1& __x, const _Expr2& __y)
4738 {
4739     typedef typename _Expr1::value_type value_type;
4740     typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4741     return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4742 }
4743
4744 template<class _Expr>
4745 inline _LIBCPP_INLINE_VISIBILITY
4746 typename enable_if
4747 <
4748     __is_val_expr<_Expr>::value,
4749     __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4750                _Expr, __scalar_expr<typename _Expr::value_type> > >
4751 >::type
4752 pow(const _Expr& __x, const typename _Expr::value_type& __y)
4753 {
4754     typedef typename _Expr::value_type value_type;
4755     typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4756     return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4757                            __x, __scalar_expr<value_type>(__y, __x.size())));
4758 }
4759
4760 template<class _Expr>
4761 inline _LIBCPP_INLINE_VISIBILITY
4762 typename enable_if
4763 <
4764     __is_val_expr<_Expr>::value,
4765     __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4766                __scalar_expr<typename _Expr::value_type>, _Expr> >
4767 >::type
4768 pow(const typename _Expr::value_type& __x, const _Expr& __y)
4769 {
4770     typedef typename _Expr::value_type value_type;
4771     typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4772     return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4773                            __scalar_expr<value_type>(__x, __y.size()), __y));
4774 }
4775
4776 template<class _Expr>
4777 inline _LIBCPP_INLINE_VISIBILITY
4778 typename enable_if
4779 <
4780     __is_val_expr<_Expr>::value,
4781     __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4782 >::type
4783 sin(const _Expr& __x)
4784 {
4785     typedef typename _Expr::value_type value_type;
4786     typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4787     return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4788 }
4789
4790 template<class _Expr>
4791 inline _LIBCPP_INLINE_VISIBILITY
4792 typename enable_if
4793 <
4794     __is_val_expr<_Expr>::value,
4795     __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4796 >::type
4797 sinh(const _Expr& __x)
4798 {
4799     typedef typename _Expr::value_type value_type;
4800     typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4801     return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4802 }
4803
4804 template<class _Expr>
4805 inline _LIBCPP_INLINE_VISIBILITY
4806 typename enable_if
4807 <
4808     __is_val_expr<_Expr>::value,
4809     __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4810 >::type
4811 sqrt(const _Expr& __x)
4812 {
4813     typedef typename _Expr::value_type value_type;
4814     typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4815     return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4816 }
4817
4818 template<class _Expr>
4819 inline _LIBCPP_INLINE_VISIBILITY
4820 typename enable_if
4821 <
4822     __is_val_expr<_Expr>::value,
4823     __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4824 >::type
4825 tan(const _Expr& __x)
4826 {
4827     typedef typename _Expr::value_type value_type;
4828     typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4829     return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4830 }
4831
4832 template<class _Expr>
4833 inline _LIBCPP_INLINE_VISIBILITY
4834 typename enable_if
4835 <
4836     __is_val_expr<_Expr>::value,
4837     __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4838 >::type
4839 tanh(const _Expr& __x)
4840 {
4841     typedef typename _Expr::value_type value_type;
4842     typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4843     return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4844 }
4845
4846 template <class _Tp>
4847 inline _LIBCPP_INLINE_VISIBILITY
4848 _Tp*
4849 begin(valarray<_Tp>& __v)
4850 {
4851     return __v.__begin_;
4852 }
4853
4854 template <class _Tp>
4855 inline _LIBCPP_INLINE_VISIBILITY
4856 const _Tp*
4857 begin(const valarray<_Tp>& __v)
4858 {
4859     return __v.__begin_;
4860 }
4861
4862 template <class _Tp>
4863 inline _LIBCPP_INLINE_VISIBILITY
4864 _Tp*
4865 end(valarray<_Tp>& __v)
4866 {
4867     return __v.__end_;
4868 }
4869
4870 template <class _Tp>
4871 inline _LIBCPP_INLINE_VISIBILITY
4872 const _Tp*
4873 end(const valarray<_Tp>& __v)
4874 {
4875     return __v.__end_;
4876 }
4877
4878 _LIBCPP_END_NAMESPACE_STD
4879
4880 #endif  // _LIBCPP_VALARRAY