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